某java应用大量消耗内存,导致频繁FullGC怎么处理

本文提供了一套详细的步骤和命令,用于排查Java应用程序中的内存泄漏问题,包括如何检查大对象消耗、线程使用情况、堆内存分配以及垃圾回收状态。

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

思路:

1、什么对象消耗内存最大;

2、是否创建了太多的线程;

3、新生的、老年代现在内存使用情况,确认是不是整体内存分配太小了;

4、实时查看新生的、老年代内存使用情况,GC情况

5、代码层检查,是否有大对象创建?需要调用close()或dispose()来回收的资源是否回收了?

 

操作:

1、执行“jmap -histo:live 10765 | more”命令,以表格的方式显示存活对象的信息(已按对象所占bytes大小进行降序排列):

其中,10765为进程ID,更多用法,通过“man jmap”寻求帮助。

占内存最多的对象类型是org.apache.logging.log4j.core.async.RingBufferLogEvent

总共18874368byte (18M),例子中属于正常使用。

tips:如果发现某类对象占用内存很大(几个G的大小),很可能是有问题的。

基本都是因为:该类对象创建太多,且一直未释放。比如:使用完IO资源后,未调用close()接口关闭、释放资源;又比如:消费者消费速度慢(或停止消费了),而生产者不断往队列中投递任务,导致队列中任务累积过多,任务对象占用内存太多而产生OutOfMemoryError;

2、执行“pstree -p 10765 | wc -l”,查看进程内的线程数

其中,10765为进程ID

每个线程需要分配线程栈内存,创建线程太多,可能导致OutOfMemoryError。

3、执行jmap -heap 10765,查看堆(新生代、老年代)内存分配大小及使用情况

4、执行“jstat -gc 10765 1000”,查看各个区内存使用情况及GC情况

其中,10765为进程ID,1000为数据刷新间隔的毫秒数

具体字段含义,通过“man jstat”寻求帮助。

主要查看:

EC:Eden区容量,EU:Eden区已使用量,OC:Old区容量,OU:Old区已使用量;

YGC:YongGC次数,YGCT:YongGC耗时,FGC:FullGC次数,FGCT:FullGC耗时;

5、代码检查,要求相关同学做codereview

《使用JProfiler诊断Java应用服务器内存泄漏》一文详细介绍了如何使用JProfiler工具来诊断和解决内存泄漏问题,尤其适合于处理Java应用服务器中常见的内存高占用和频繁Full GC问题。在应用服务器的性能优化过程中,JProfiler提供的监控功能至关重要,可以帮助开发者识别出内存使用中的问题和性能瓶颈。具体到操作层面,可以按照以下步骤进行: 参考资源链接:[使用JProfiler诊断Java应用服务器内存泄漏](https://wenku.youkuaiyun.com/doc/3psst7mvjq) 1. 启动JProfiler并连接到运行中的Java应用程序。选择合适的连接方式,比如JVM Attach、运行时配置或者远程连接。 2. 利用JProfiler的内存视图监控内存使用情况,特别关注堆内存的分配和回收情况。通过实时图表可以观察到内存消耗的趋势和峰值。 3. 使用内存泄漏检测功能,比如对象生存时间分析和内存泄漏嫌疑犯检测。这些功能可以帮助定位那些生命周期过长或者不再使用的对象,从而发现潜在的内存泄漏源。 4. 分析Full GC的频率和持续时间,这通常可以在GC概览视图中查看。频繁Full GC往往意味着内存管理存在问题,需要进一步调查。 5. 利用CPU视图监控执行线程的状态,分析哪些线程长时间占用CPU资源,这可能导致性能下降和响应时间延长。 6. 检查EJB池和数据库连接池的使用情况,以及Statement Cache的大小,这些都是影响内存使用和性能的重要因素。 7. 根据监控和分析结果,调整应用服务器的配置,优化代码逻辑,比如减少不必要的对象创建,使用对象池技术,或者优化查询和数据处理逻辑。 8. 最后,根据调整后的效果进行反复的监控和测试,确保优化措施有效,并对性能进行持续的改进。 通过上述步骤,结合JProfiler的强大功能,可以有效地监控和优化Java应用服务器的内存使用,减少Full GC的频率,从而提高应用的整体性能。 参考资源链接:[使用JProfiler诊断Java应用服务器内存泄漏](https://wenku.youkuaiyun.com/doc/3psst7mvjq)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值