Java经典面试解析:服务器卡顿、CPU飙升、接口负载剧增

2023-11-03

线上服务器CPU飙升,如何定位到Java代码

解决这个问题的关键是要找到Java代码的位置。下面分享一下排查思路,以CentOS为例,总结为4步。

第1步,使用top命令找到占用CPU高的进程。

第2步,使用ps –mp命令找到进程下占用CPU高的线程ID。

第3步,使用printf命令将线程ID转换成十六进制数。

第4步,使用jstack命令输出线程运行状态的日志信息。

下面详细介绍每一步的操作。

第1步,在使用top命令之后,可以看到一个列表,其中包含PID(进程ID)、USER(操作用户)、CPU占用率、内存占用率、TIME+(运行时间)、COMMAND(运行命令)等信息。一般默认按CPU占用率从上到下降序排列,如下图所示。

我们找到COMMAND列是java的这一行,说明这个程序就是用Java编写的。然后,用记事本记下这一行的PID,也就是进程ID。

第2步,使用ps -mp命令,输出这个PID下面的线程运行情况列表,如下图所示。

图片

在这个列表中包含了几个关键字段,比如CPU占用率、TID(线程ID)、TIME(运行时间)等。在这个列表中找到CPU占用最高的线程,记下TID,也就是线程ID。

前面记下的TID是一个十进制数,不能直接使用,需要转化为十六进制数。

第3步,使用 printf 命令将TID转换为十六进制数,如下图所示。

图片

这样就得到了真正占用CPU过高的线程ID。

 第4步,使用jstack命令输出线程的具体运行日志,如下图所示。

图片

jstack有3个参数,第1个参数是前面记下的 PID,之后加上 grep,紧跟着是转成十六进制数的TID,最后加上 –A和一个数字,这个数字表示输出日志的行数,至此就可以直接打印出具体的异常信息了。

如果日志信息比较多,异常内容比较复杂,则可以把这些异常信息输出到一个   txt文件中,慢慢分析。只需要在 jstack命令的最后追加 txt 文件名就可以了。

jstack PID | grep TID -A60 >> error_log.txt

面试点评:从这个问题来看,面试官主要考查求职者的实操能力,以及解决问题的思路。如果求职者没有实操过,但是知道导致 CPU 飙升的原因,并说出解决思路,那么通过面试是没问题的。


02

生产环境服务器变慢,如何诊断处理

生产环境服务器变慢主要涉及3个维度:CPU利用率、磁盘I/O效率、内存瓶颈。

1. CPU利用率

CPU利用率过高或者CPU利用率过低,都会影响程序的处理效率。CPU利用率过高,说明当前服务器要处理的指令比较多,当CPU忙不过来的时候,指令的运行效率自然就会下降,用户的感受就是程序响应变慢了。

针对这个问题,我们可以使用top命令查询当前系统中占用CPU过高的进程,并定位到这个进程中比较活跃的线程。再通过jstack命令打印当前虚拟机的线程快照,根据快照日志排查问题代码。

如果CPU利用率过低,则说明程序资源使用不够,可以增加线程数量提升程序性能。

2. 磁盘I/O效率

在程序运行过程中会直接或者间接涉及一些与磁盘I/O相关的操作,比如程序直接读/写磁盘或者程序依赖的第三方组件对磁盘进行持久化存储,此时磁盘I/O效率就会对程序运行效率产生影响。

针对这种情况可以使用iostat命令查看,如果磁盘负载较高,可以针对性地进行优化。比如,借助缓存系统,减少磁盘I/O次数;用顺序写替代随机写入,减少寻址开销;使用mmap替代read/write,减少内存拷贝次数。另外,磁盘I/O效率可以通过CPU与负载的非线性关系体现出来。当负载增大时,系统吞吐量不能有效增大,CPU不能线性增长,则很可能是磁盘I/O出现阻塞。

3. 内存瓶颈

内存作为一块临时存储数据的组件,所有CPU运行的指令都需要从内存中去读/写。内存的合理使用可以减少应用和磁盘的I/O频率,减少网络I/O的频率,极大地提升I/O性能。

JVM对内存的合理分配,能够避免频繁的YGC和FULL GC。当内存使用率较高时,可以用dump命令查出JVM堆内存,用MAT工具进行分析,查出大对象或者占用内存最多的对象,以及排查是否存在内存泄漏的问题。如果用 dump 命令查出的堆内存文件正常,则可以考虑是堆外内存被大量使用导致出现问题,此时需要借助操作系统的pmap命令查出进程的内存分配情况。如果CPU和内存使用率都很正常,那么就需要进一步开启GC日志,分析用户线程暂停的时间、各部分内存区域GC次数和时间等指标,这里可以借助jstat命令或可视化工具GCEasy等。如果问题出在GC上,则考虑是不是内存不足,然后根据垃圾对象的特点进行参数调优,使用更适合的垃圾收集器,用jstack命令分析各个线程的状态。如果问题比较隐蔽,则考虑是否开启JMX,使用 visualmv 等可视化工具进行远程监控与分析。

面试点评:这个问题涉及的知识面比较多,如果只是站在求职者的角度来分析,则可以这样回答。如果你没有实际解决过类似问题,则可以说一下自己的思路,只要大体思路和方向是对的,那么在遇到类似问题的时候,可以利用网络上的资料去逐步尝试解决。

03

线上接口负载剧增,快扛不住了,你的首选方案是什么

遇到这样的问题,我们的第一反应应该是增加缓存。因为,增加缓存是解决系统性能问题最快速、最高效的方案,它能够快速提升系统的线性吞吐量,效果也最为明显。这就相当于是用空间来换取时间。曾经有人说过,缓存是解决性能问题的万金油,哪里存在性能瓶颈,就往哪里加缓存。

但是程序都已经上线了,增加缓存还来得及吗?因为在增加缓存时需要改代码,所以,临时解决方案就是增加节点。随后,将程序紧急部署到新的节点上,在流量入口增加限流和分发。但是增加节点自然会增加成本,所以增加缓存才是最优的解决方案。

缓存的设计思想在架构设计中十分常见。比如我们每天用的操作系统,不管是Windows、Linux,还是Mac OS都有系统缓存、用户缓存。磁盘有磁盘缓存区、CPU有CPU缓存区。再比如,在我们常用的经典框架中,也经常使用到缓存,Spring有IoC缓存,MyBatis有一级缓存、二级缓存。在架构设计中,可以说缓存无处不在。

因此,当并发量过高扛不住的时候,可以优先采用缓存来缓解负载压力。比如将读取频繁的数据写到缓存中,将动态页面静态化。在加上缓存之后,如果负载压力依然过大,则再考虑增加限流策略,比如消息队列;如果在增加限流后还是压力过大,则再考虑增加服务器节点。

面试点评:这个问题考查的是求职者的临场应变能力,有相关经验的程序员回答这个问题并不困难。在回答这个问题的时候,可以分两种情况:一种是临时解决方案,就是加服务器;另一种就是增加缓存,但是涉及修改代码,会增加程序不稳定的风险。


亲爱的程序员求职者们,相信你们一定深有体会,求职面试这条路有多难走。

Java基础知识,多线程,并发编程,集合原理,JVM原理……啊!别跟我提这些!面试官一下子拿着这些知识点就冲你扔过来,还有那魔幻的Java框架,你要是不懂Spring全家桶、Dubbo、Netty、MyBatis等,就别想踏进这个行业的大门。没错,Java领域可是卷得一塌糊涂啊。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java经典面试解析:服务器卡顿、CPU飙升、接口负载剧增 的相关文章

  • 如何使用 Apache POI API 将图像添加到 pptx 中添加的图像占位符?

    我已经预定义了带有文本和图像占位符的 pptx 模板 我如何从模板访问和修改这些占位符 我可以使用 POI pptx API 直接将图像和文本添加到幻灯片中 但如何将其添加到模板的占位符中 请参阅链接以了解如何添加占位符来创建固定模板 ht
  • 在文本文件中写入多行(java)

    下面的代码是运行命令cmd并使用命令行的输出生成一个文本文件 下面的代码在 Eclipse 的输出窗口中显示了正确的信息 但在文本文件中只打印了最后一行 谁能帮我这个 import java io public class TextFile
  • 如何创建一个显示 Spinners 的 x 和 y 值的表格?

    我想创建一个位于图表右侧的表格 其中显示 2 列 x 和 y 值已输入到xSpin and ySpin旋转器 我已经画了一张我想要桌子放置的位置的图 我尝试过在网格窗格布局中使用文本框来创建表格并将值直接输入到文本框网格中 但是我无法将它们
  • 使用 JPA Criteria API 进行分页的总行数

    我正在系统中为实体实现 高级搜索 功能 以便用户可以使用该实体的属性上的多个条件 eq ne gt lt 等 来搜索该实体 我正在使用 JPA 的 Criteria API 动态生成 Criteria 查询 然后使用setFirstResu
  • Android在排序列表时忽略大小写

    我有一个名为路径的列表 我目前正在使用以下代码对字符串进行排序 java util Collections sort path 这工作正常 它对我的 列表进行排序 但是它以不同的方式处理第一个字母的情况 即它用大写字母对列表进行排序 然后用
  • JAVA - Xuggler - 组合 MP3 音频文件和 MP4 电影时播放视频

    使用 JAVA 和 Xuggler 以下代码组合 MP3 音频文件和 MP4 电影文件并输出组合的 mp4 文件 我希望在合并音频和视频文件时应自动播放输出视频文件 String inputVideoFilePath in mp4 Stri
  • 运行具有外部依赖项的 Scala 脚本

    我在 Users joe scala lib 下有以下 jar commons codec 1 4 jar httpclient 4 1 1 jar httpcore 4 1 jar commons logging 1 1 1 jar ht
  • wait() 在游戏中如何工作?

    在 playframework 的文档中here http www playframework org documentation 1 2 1 asynchronous已写 public static void loopWithoutBlo
  • 按第一列排序二维数组,然后按第二列排序

    int arrs 1 100 11 22 1 11 2 12 Arrays sort arrs a b gt a 0 b 0 上面的数组已排序为 1 100 1 11 2 12 11 22 我希望它们按以下方式排序a 0 b 0 首先 如果
  • 我需要什么库才能在 Java 中访问这个 com.sun.image.codec.jpeg?

    我正在用java创建一个图像水印程序 并导入了以下内容 import com sun image codec jpeg JPEGCodec import com sun image codec jpeg JPEGEncodeParam im
  • 使用 AES SecretKey 的 Java KeyStore setEntry()

    我目前正在 Java 中开发一个密钥处理类 特别是使用 KeyStore 我正在尝试使用 AES 实例生成 SecretKey 然后使用 setEntry 方法将其放入 KeyStore 中 我已经包含了代码的相关部分 The KS Obj
  • 很好地处理数据库约束错误

    再一次 它应该很简单 我的任务是在我们的应用程序的域对象中放置一个具有唯一约束的特定字段 这本身并不是一个很大的挑战 我刚刚做了以下事情 public class Location more fields Column unique tru
  • 如何在 Java 中测试一个类是否正确实现了 Serialized(不仅仅是 Serialized 的实例)

    我正在实现一个可序列化的类 因此它是一个与 RMI 一起使用的值对象 但我需要测试一下 有没有办法轻松做到这一点 澄清 我正在实现该类 因此在类定义中添加 Serialized 很简单 我需要手动序列化 反序列化它以查看它是否有效 我找到了
  • Javafx过滤表视图

    我正在尝试使用文本字段来过滤表视图 我想要一个文本字段 txtSearch 来搜索 nhs 号码 名字 姓氏 和 分类类别 我尝试过在线实施各种解决方案 但没有运气 我对这一切仍然很陌生 所以如果问得不好 我深表歉意 任何帮助将不胜感激 我
  • 有没有一种快速方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?

    所以我需要从 jar war 文件中删除一个文件 我希望有类似 jar d myjar jar file I donot need txt 的内容 但现在我能看到从 Linux 命令行执行此操作的唯一方法 不使用 WinRAR Winzip
  • 测试弱引用

    在 Java 中测试弱引用的正确方法是什么 我最初的想法是执行以下操作 public class WeakReferenceTest public class Target private String value public Targe
  • Java中的Object类是什么?

    什么是或什么类型private Object obj Object http download oracle com javase 6 docs api java lang Object html是Java继承层次结构中每个类的最终祖先 从
  • javafx android 中的文本字段和组合框问题

    我在简单的 javafx android 应用程序中遇到问题 问题是我使用 gradle javafxmobile plugin 在 netbeans ide 中构建了非常简单的应用程序 其中包含一些文本字段和组合框 我在 android
  • 如何从 Maven 存储库引用本机 DLL?

    如果 JAR 附带 Maven 存储库中的本机 DLL 我需要在 pom xml 中放入什么才能将该 DLL 放入打包中 更具体地举个例子Jacob http search maven org artifactdetails 7Cnet s
  • 如何在 JFreeChart 中设置多个系列的线条粗细?

    我创建了很多图表 在他们每个人中我都需要打电话 renderer setSeriesStroke i new BasicStroke 2 0f 对于每个系列 renderer is chart getXYPlot getRenderer 我

随机推荐

  • 关于我不“小心点”开我爸浏览器搜索历史这件事

    今天早上为了给我的小可爱发信息 我拼尽了全身力气使劲刷微信聊天记录 结果把自己的手机电耗尽了 不点破我要用手机做啥 反正不小心背下了老爸的手机查资料 没想到他的浏览器记录还藏着这么多 宝贵 的信息 哈哈哈哈哈 都是些令人大开眼界的东西 我发
  • 【Visual Studio 2019】 实用调试技巧,学会了都说好

    文章目录 前言 一 bug是什么 二 调试是什么 三 调试的基本步骤 四 Debug和Release的介绍 五 windows环境调试介绍 1 调试环境的准备 2 常用快捷键 六 调试的时候查看程序当前信息 1 调试实例 七 如何写出好 易
  • STM32建立工程模板时出现错误:error: #67: expected a “}“

    在MDK5开发环境中使用到标准库建立工程时 常常会出现以下编辑错误error 67 expected a 更改方法 options gt c c gt Preprocessor Symbols gt Define 将STM32F10X MD
  • JAVA-jdk8的API文件下载

    API文件 1 在线API 2 离线API 1 在线API 在线中文API文档 https www matools com api java8 2 离线API API下载地址 https www oracle com java techno
  • windows 系统 cmake 编译 python 使用 boost 库的问题

    使用 cmake 编译跨平台的开源框架 遇到 cmake 编译出错 主要报错是 FindBoost cmake 通过各种输入日志 message 发现有几个地方需要注意 现记录下来 需要修改成自己的boost版本 set RDK BOOST
  • 华为OD机试真题 Java 实现【分界线】【2023Q1 100分】

    一 题目描述 电视剧 分界线 里面有一个片段 男主为了向警察透露案件细节 且不暴露自己 于是将报刊上的字剪切下来 剪拼成匿名信 现在有一名举报人 希望借鉴这种手段 使用英文报刊完成举报操作 但为了增加文章的混淆度 只需满足每个单词中字母数量
  • API 网关基础

    目录 一 网关概述 二 网关提供的功能 三 常见网关系统 3 1 Netflix Zuul 3 2 Spring Cloud Gateway 3 3 Kong 3 4 APISIX 3 5 Shenyu 一 网关概述 API网关是一个服务器
  • [微信官方文档] 小程序-错误码信息与解决方案表

    错误码信息与解决方案表 错误码是通过binderror回调获取到的错误信息 代码 异常情况 理由 解决方案 1000 后端错误调用失败 该项错误不是开发者的异常情况 一般情况下忽略一段时间即可恢复 1001 参数错误 使用方法错误 可以前往
  • linux:docker /bin/bash作用

    参考 docker run it centos bin bash 后面的 bin bash的作用
  • 【整理一】

    1 说说你对react的理解 有哪些特性 React是一个前端js框架 React高效灵活 声明式设计 使用简单 组件式开发 提高代码的复用率 单向的数据绑定比双向的数据绑定更加安全 2 说说Real diff算法是怎么运作的 1 Diff
  • CrackQL:一款功能强大的图形化密码爆破和模糊测试工具

    关于CrackQL CrackQL是一款功能强大的图形化密码爆破和模糊测试工具 在该工具的帮助下 广大研究人员可以针对密码安全和应用程序安全进行渗透测试 除此之外 CrackQL同时也是一款通用的GraphQL渗透测试工具 它可以控制速率限
  • 积分图(三) - Boxfilter 的实现过程分析

    积分图 三 Boxfilter 的实现过程分析 Boxfilter 快速计算 它可以使复杂度为O MN 的求和 求方差等运算降低到O 1 或近似于O 1 的复杂度 它的缺点是不支持多尺度 Boxfilter 的原理有点类似 Integral
  • 大学应让我们相信各种可能性

    记得刚来学校的时候 导员们便告诉我们今年的学长学姐们找的工作工资有多高 他们保研保上了多么好的学校 有多少人竞赛怎么样怎么样 于是一开始 我们心中的价值取向便成了这些 而我们竟然还很激动 因为我们将来或许也能取得同样的工资 同样的成就 其实
  • python过期了怎么恢复_pycharm过期30天没法用了怎么办?

    用cleanmyMac查看 右键在finder中显示可以找到文件位置 image png Users xxx Library Saved Application State com jetbrains pycharm savedState
  • STL容器之deque

    文章目录 deque容器简介 deque的操作 deque容器简介 deque是 double ended queue 的缩写 和vector一样都是STL的容器 deque是双端数组 而vector是单端的 deque在接口上和vecto
  • TypeScript中的联合类型、类型别名、接口、类型断言

    一 联合类型 在TypeScript中 联合类型 Union Types 是指用 符号将多个类型组合成一个的类型 这种类型可以包含不同的类型 例如字符串 数字或对象 这些不同类型的值可以赋值给联合类型的变量 而在使用这个变量时 需要对不同类
  • Crazy Search 【POJ - 1200】【哈希】

    题目链接 题意 给定一个字符串 其中含有不同的字母数量为m 现在求这个字符串中有多少个长度为n且长的互不相同的字符子串 举个例子 n 3 m 4 字符串 daababac 长度为3的不同的子串分别是 daa aab aba bab bac
  • Linux基线检查与安全加固

    安全加固 Linux安全加固 账户管理 一 口令锁定策略 检查操作步骤 查看配置文件 more etc pam d password auth 查看是否存在如下内容 auth required pam tally2 so deny 5 on
  • SVM支持向量机的多输入单输出预测模型

    多输入单输出 使用SVM做预测的时候 涉及到数据处理 这里强调一下 其它预测算法也适用 我们经常将收集数据集进行归一化 标准化 其实 只需要对部分数据进行归一化即可 归一化的目的是将输入向量中的各属性之间的数量级拉近 如果量级相差过大会影响
  • Java经典面试解析:服务器卡顿、CPU飙升、接口负载剧增

    线上服务器CPU飙升 如何定位到Java代码 解决这个问题的关键是要找到Java代码的位置 下面分享一下排查思路 以CentOS为例 总结为4步 第1步 使用top命令找到占用CPU高的进程 第2步 使用ps mp命令找到进程下占用CPU高