如何监控GC及内存问题解决方案概述

本文详细阐述了如何通过配置Java启动参数启用GC监控,并将其输出至文件进行分析。介绍了GC日志的读取与理解方法,以及如何通过图形分析工具如HP的jtune来辅助排查内存问题。此外,文章还分享了识别和解决内存泄露的案例,以及在WebSphere和WebLogic等应用服务器上设置合理JVM内存大小的建议。最后,提供了在遇到内存压力时的应急措施,包括不设定JVM最大Heap上限、在程序中主动执行垃圾收集等。

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

一、GC监控 

GC日志记录了内存使用和回收状态,出现内存故障时,可作为分析排查手段。 

1. 启用GC监控的方法:增加java启动参数-verbose:gc,输出信息的样例: 

引用
GC 135: total final references 4390; cleared final references 8. 
GC 135: total phantom references 0; cleared phantom references 0. 
GC 135: total old soft references 0; cleared old soft references 0. 
GC 135: total JNI global weak references 0; cleared JNI global weak references 0. 
GC 136: starting collection, maximum allocation reached. 
GC 136: live objects 1081046; collected objects 6038; collected(KB) 558. 
GC 136: queued for finalization 0; total soft references 113; cleared soft references 18. 
GC 136: current heap(KB) 716784; current threshold(KB) 262144. 
GC 136: collect (milliseconds) 1314. 
GC 136: current cycle allocation(KB) 0; previous cycle allocation(KB) 532. 
GC 136: total weak references 1321; cleared weak references 0.


2. 将GC日志输出到文件:不同JDK设置的参数不同,参考JDK官方文档 
   SUN:-Xloggc:filename (例如:-Xloggc:D:/gc.log) 
   IBM:-Xverbosegc:file=filename 或 -Xverbosegclog:filename 
   HP :-Xverbosegc=filename   

3. 如何设置Java启动参数:有多种方式,以下各举一例 
   Tomcat:在catalina.bat的“set JAVA_OPTS=%JAVA_OPTS% ”后设置 
   WebLogic:在startWebLogic.cmd的“%JAVA_HOME%\bin\java %JAVA_VM% %MEM_ARGS% %JAVA_OPTIONS% ”后设置 
   WebSphere:进入管理控制台,应用服务器->进程定义->Java虚拟机高级定义 

4. GC日志的图形分析工具:HP的jtune 

 

二、内存问题描述 

典型现象是系统运行一段时间后,报OutOfMemoryError错误、页面非常慢、不响应或完全不再接受请求,而此时通过观察JVM内存,发现内存急剧上升到最大值并居高不下。 

这种问题出现后,往往很棘手,通常是由于应用程序不合理造成的,而不合理程序或内存泄漏的源头可能并不明显。本人的一次经历是,经过十多天各种测试手段后,最后确定问题是由一处String累加引起的,改成StringBuffer就解决了,可见,忽略“小问题”往往会带来大麻烦。 

三、分析手段 

1. 分析GC日志、系统日志 
2. 程序中设置监控断点 
3. 尽可能重现故障并同时监控JVM内存,找出引起内存急剧上升的规律 
4. 检查关键程序或频繁使用的工具类的合理性 

四、解决手段 

1. 主要从程序入手:降低内存使用量;字符串累加时以StringBuffer代替String;随时释放不再需要的对象;SQL优化及避免频繁取出大量数据;Session中不要放大的数据。。。 
2. 据WebSphere和WebLogic官方建议:通常情况下JVM的Heap最小值和最大值可设成一样(根据实际情况调整),可取系统内存的25%-75%,保证JVM有合理足够的内存大小 
3. 应用服务器的其他优化措施 

五、应急措施 

1. 不设定JVM的最大Heap上限 
2. 程序中判断内存吃紧时执行Runtime.gc()强制垃圾收集,此方式比自动收集彻底,可一定程度上改善内存利用效率 
3. 在不影响业务的情况下,定期重启应用服务器 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值