当前位置:首页 > 每日看点 > 正文内容

jvm调优有什么技巧?

卡卷网7个月前 (01-11)每日看点133

场景一、CPU过高

CPU占用过高排查思路:(查进程->查线程列表->查线程堆栈)

step1:通过top命令查询占用CPU情况</>

//top

//p.s.shift+p(大写的P-cpu排序)shift+m(大写的M-内存排序)

step2:通过进程pid,查询对应的线程列表</>

//top-Hppid

    -H:显示线程信息-ppid1,pid2,...:只显示指定进程的信息

step3:线程id转为十六进制</>

从step2中可以看到占用cpu较高的线程id,打印出十六进制

//printf'%x\n'id

step4:通过jstack查出线程栈信息</>

cpu过高主要是线程方面的问题,我们知道jvm中每个线程都分配了单的栈,我们可以通过jstack查看线程栈情况。

//jstackpid

p.s.这里的pid为进程id,也就是第一步top中的pid

对照着step3中占用cpu最高的线程十六进制值可以定位到线程的栈信息。

上图可以看到具体定位到了ja的代码,就可以具体分析一下这个ja代码为什么会创建大量的线程占用大量的cpu。

除了ja程序线程问题,cpu过高也可能是线程死锁造成的,我们通过jstack也可以查看线程死锁的情况。

step5:通过jstack查看情况死锁情况</>

//jstack-lpid

-l:除了线程列表外,还显示关于锁的附加信息

通过栈中的信息可以定位到代码中死锁的代码。

step6:通过jstat查看gc情况</>

除了以上的各种情况,还有一种就是ja频繁的gc也会造成cpu占用过高

//jstat-gcutilpid1000

//1000ms为刷新数据的间隔时间

如果有频繁的gc就可以分析堆数据中哪些对象创建的较多,就可以具体分析了。

场景二、内存占用过高

排查思路:(查进程->jvm内存占用)

step1:通过top命令查询占用CPU情况

top

p.s.shift+p(大写的P-cpu排序)shift+m(大写的M-内存排序)

step2:通过进程pid查看gc情况

jstat-gcutilpid1000

以下是该命令的输出结果说明:

    S0:表示svivorspace0区域的使用情况,即第1个幸存区的使用情况。S1:表示svivorspace1区域的使用情况,即第2个幸存区的使用情况。E:表示edenspace区域的使用情况,即新生代中Eden区的使用情况。O:表示oldspace区域的使用情况,即老年代中的使用情况。M:表示metaspace区域的使用情况,即元空间中的使用情况。C:表示压缩类空间的使用情况。如果JVM启用了类数据共享(CDS)技术并且开启了压缩类指针(CompressedClassPointer)选项,那么就会存在一个称为“压缩类空间”的特殊区域,用于存放共享的类元数据信息。YGC:表示年轻代回收的次数。年轻代是JVM中内存分配的主要区域,回收在此区域较为频繁。YGCT:表示年轻代回收所花费的时间总和。通常情况下,年轻代回收所需时间不应过长,否则可能会导致响应变慢或出现卡顿现象。FGC:表示FullGC(全局回收)的次数。FullGC是对整个Ja堆进行清理的回收过程,较为耗时。FGCT:表示FullGC所花费的时间总和。FullGC的执行时间通常年轻代回收要长得多,因为它需要处理整个Ja堆。GCT:表示所有回收所花费的时间总和,即YGCT和FGCT的总和。

以上各个区域的使用情况都会以百分的形式进行显示,即0.0%~100.0%之间。

例如,如果输出结果为“40.0020.0060.0070.00100.00”,则表示:

    //svivorspace0的使用率为40.00%svivorspace1的使用率为20.00%edenspace的使用率为60.00%oldspace的使用率为70.00%metaspace的使用率为100.00%

step3:通过jmap查看堆情况

通过step2已经发现jvm中的数据过多,频繁的ygc并且大量的数据都在老年代没有回收,这样就会表现出内存占用过高。下一步就是分析那些对象占用了内存。

//jmap-histopid

//jmap-histo命令可以用于输出Ja堆内存中各个对象类型及其数量的计信息。具体说明如下:

    num参数代表要分析的Ja进程中的对象编号instances:表示Ja堆内存中对象的数量ytes:表示Ja堆内存中对象占用的总字节数。classname:表示Ja堆内存中对象所属类名。

可以看到org.example.User创建的较多。这相就可以具体分析一下代码中哪些地方创建了User为什么没被回收。

与jmap-histo类似的命令:

#jmap-dump jmap-dump:format=,file=heapdump.hprofpid

//jmap-dump命令可以用于生成Ja进程的内存快照文件(.hprof格式),以便进行后续的分析和调试。具体说明如下:

    //filepath:表示生成的内存快照文件路径。该文件可以通过Ja虚拟机诊断工具(例如VisualVM、EclipseMemoryAnalyzer等)进行分析和调试。pid:表示要生成内存快照的Ja进程的进程ID。

导出的快照文件可以通过jvisualvm或mat来查看:

    //jvisualvm

    //mat

mat还较智能,直接把存在问题的给你列出来

step4:jmap-heapjvm内存实际占用情况

除了以上内存占用情况,在ja项目中还存在一种情况。如我ja项目没有配置jvm参数都使用默认的配置,我64G内存。会发现用一段时间后ja进程占用了8G内存。这时你可以使用命令看看ja实际使用的内存情况,然后再调整jvm参数。

jmap-heap是一个用于获取Ja堆内存信息的命令行工具,它可以输出Ja虚拟机中堆内存的使用情况和配置信息。

玄明Hanko:深度剖析JVM调优法则:从两大特性CPU、内存出发轻松掌握调优实战技巧玄明Hanko:JVM调优神器,运用Arthas释放Ja应用性能的全部潜力

扫描二维码推送至手机访问。

版权声明:本文由卡卷网发布,如需转载请注明出处。

本文链接:https://www.kajuan.net/ttnews/2025/01/8733.html

分享给朋友:

相关文章

互联网算命,是不是个好生意?能不能赚钱?

互联网算命,是不是个好生意?能不能赚钱?

现在的年轻人也开始“迷信”了。疫情、降薪、失业、内卷……2020年或许是这届年轻人最为困难的一年,无尽的焦虑与压力之下,他们陷入了失落与迷茫之中,失去了未来的方向。如果此时有人能够为你指引出未来的道路,你是会...

如果我们没有自己的手机操作系统,会出现所谓的“卡脖子”“安全”问题吗?

如果我们没有自己的手机操作系统,会出现所谓的“卡脖子”“安全”问题吗?

前段时间某某高管在微博发文表示:“其实我觉得,中国人需要的不是一个自己的手机os,而是一个全国产的微信,再搭配一些辅助功能。”这算是“安卓开源”开源的代表了吧。然而打脸来的如此之快,10月30日消息,在Linux内核疑似大规...

我爸讽刺我,写个破代码一年才十几万,他在工地带50个人,让我回去跟他干,写代码没出路,我该怎么选择?

我跟你一样的情况,本人现身说法,千万不要跟你爸干,我就是反面教材,现在想回去都回不去了,快十年没写代码了,再就是岁数大了,38岁了,35岁以上的码农根本就没公司愿意要,而且会受歧视。工程不好干,首先就是不合法,在法律层面,根本就没有包工头的...

Redmi 为什么可以把性价比做得那么高?

一位修手机的老大哥曾经跟我说过,红米1那个手机,除了处理器还凑活,其余零部件,就是市面上山寨机那种。其实红米性价比并不算极致,而且一直都有竞争者,从原来的群魔乱舞,到后来的荣耀,魅蓝,一加,再到现在的IQOO和realme。红米的方法也很简...

拼多多百亿补贴买手机电脑等数码产品靠谱吗?

大家很多人都在问pdd百亿补贴购机靠谱吗?首先声明一下,我不是pdd的人,我只是一个普普通通混迹从事pc行业的数码玩家,我只是在评论区看到很多人都在无脑推百亿补贴,特地发一条怗子来说明一下这个东西。此怡不存在偏向引导,此站仅站在我个人角度上...

如何评价小米14pro顶配可以选配卫星通话,小米15全系都无法选配?

如何评价小米14pro顶配可以选配卫星通话,小米15全系都无法选配?

雷总不是说了吗,我可以不用,但你不能没有。市面上OPPO Find X8 Pro和vivo X200 Pro的卫星通信版分别加价300,而荣耀Magic7和Magic7 Pro有卫星通信版且不加价,荣耀更显诚意。我觉得有是更好的,虽然使用卫...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。