JVM性能调优(二)

本文介绍如何使用jstack检测程序是否出现死锁,并利用MAT分析工具定位内存泄漏问题。文章还探讨了如何通过GC日志及dump文件分析内存泄漏,并提供了具体的案例分析,帮助读者理解如何调整JVM配置以提高程序性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用jstack如何发现死锁?

使用jstack观察程序有没有死锁的时候,首先检索文件,看看有没有dead lock这些字眼,
接着就要检测有没有blacked这些字眼

使用MAT分析发现内存泄漏的问题

1.首先调用
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/home/administrator/james/error.hprof
然后就可以输出一个dump文件
2.Historgam:可以查看到所有的所有的实例,关键的几个属性:objects(个数)
shallow heap(占用的内存大小) Retained Heap(回收某一个对象,包含这个对象,和这个对象关联的下级对象的总大小)
3.dominator_tree:支配树,树形的对象的支配关联
4.说明一下什么情况下会出现内存泄漏?
当一个对象永远可达的时候,且不是程序所希望的,那么就是出现内存泄漏了
5.找到GCROOT
6.总结:内存里面有很多个同一类型的对象,而且都有GCROOT指向它们,且不是程序设计所希望的,那么那就出现内存泄漏

如何实际的去思考学习和排查内存泄漏

1.查看GC日志,做了一次full GC,如果发现前后代大小没有发生什么变化,则说明有很多对象没有被回收掉
2.发现问题后需要去打印出dump日志
3.使用MAT观察
1.占用Retained Heap
2.观察占用的对象有没有GCROOT

实际案例的使用

各个代如何分配大小

各分区的大小对GC的性能影响很大。如何将各分区调整到合适的大小,分析活跃数据的大小是很好的切入点。
活跃数据的大小是指,应用程序稳定运行时长期存活对象在堆中占用的空间大小,也就是Full GC后堆中老年代占用空间的大小。可以通过GC日志中Full GC之后老年代数据大小得出,比较准确的方法是在程序稳定后,多次获取GC数据,通过取平均值的方式计算活跃数据的大小。活跃数据和各分区之间的比例关系如下
总大小 3-4倍,新生代:1-1.5倍 ,老年代:2-3倍

首先你要确认JVM性能优化的目标

高可用,可用性达到几个9。
低延迟,请求必须多少毫秒内完成响应。
高吞吐,每秒完成多少次事务

分析案例一

观看GC日志,如果你发现经常发生major GC然后导致应用的响应时间变长,思考,如果每次major GC后,都回收了很多的内存,说明了很多应该留在新生代就被回收的对象进入了老年代,然后才进行数据回收
解决方案:扩大新生代

分析案例二

观察GC日志,发现在CMS Rmark之前,没有当道一次minor GC导致等待的时间过长
通过案例分析了解到,由于跨代引用的存在,CMS在Remark阶段必须扫描整个堆,同时为了避免扫描时新生代有很多对象,增加了可中断的预清理阶段用来等待Minor GC的发生。只是该阶段有时间限制,如果超时等不到Minor GC,Remark时新生代仍然有很多对象,我们的调优策略是,通过参数强制Remark前进行一次Minor GC,从而降低Remark阶段的时间。

什么时候会触发FULL GC

1.Perm(永久带)空间不足;
2.CMS GC时出现promotion failed和concurrent mode failure(concurrent mode failure发生的原因一般是CMS正在进行,但是由于老年代空间不足,需要尽快回收老年代里面的不再被使用的对象,这时停止所有的线程,同时终止CMS,直接进行Serial Old GC);
3.统计得到的Young GC晋升到老年代的平均大小大于老年代的剩余空间;

主动触发Full GC(执行jmap -histo:live [pid])来避免碎片问题。

然后,我们来逐一分析一下:
排除原因2:如果是原因2中两种情况,日志中会有特殊标识,目前没有。
排除原因3:根据GC日志,当时老年代使用量仅为20%,也不存在大于2G的大对象产生。
排除原因4:因为当时没有相关命令执行。
锁定原因1:根据日志发现Full GC后,Perm区变大了,推断是由于永久带空间不足容量扩展导致的。

找到原因后解决方法有两种:
1.通过把-XX:PermSize参数和-XX:MaxPermSize设置成一样,强制虚拟机在启动的时候就把永久带的容量固定下来,避免运行时自动扩容。
2.CMS默认情况下不会回收Perm区,通过参数CMSPermGenSweepingEnabled、CMSClassUnloadingEnabled ,可以让CMS在Perm区容量不足时对其回收。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Michael_Chou_Rider

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值