Java VM内存溢出监控与性能测试案例

需积分: 9 0 下载量 188 浏览量 更新于2024-07-23 收藏 1.87MB PPTX 举报
Java虚拟机监控是IT领域中的关键技能,特别是在维护和优化Java应用程序性能时。本文将深入探讨一个关于Java虚拟机(JVM)性能测试的案例,特别是针对内存溢出的问题。案例发生在一个2013年的Oracle传输网管版本中,当WebUI进程的JVM内存堆栈耗尽后,系统响应变慢,监控界面停滞,且重启应用后也无法立即恢复。 性能测试方法在这个案例中起着至关重要的作用。测试者首先通过性能测试工具jconsole来监控WEBUI进程,以确定问题的确切位置。在资源使用分析中,CPU占用率被确认为不是瓶颈,因为CPU使用率仅为10%。然而,JMap–heap工具显示,18134进程号的JVM内存已被完全消耗,导致系统性能下降。 问题的具体原因在于一次性能不佳的SQL查询,即分页查询中的子查询导致了内存泄漏。业务逻辑每5秒更新一次数据,每次刷新时,大量数据被加载,而系统无法及时进行垃圾回收,从而引发内存溢出。在告警监控功能的使用过程中,查询了名为ems_event的表,记录总数达到1507241条,其中标准化的一、二、三级告警记录共282990条,总计占用约1.19GB的空间。由于频繁的刷新频率(每5秒一次),年轻代垃圾回收(Young Generation GC,YGC)无法及时处理这些内存,进而触发老年代垃圾回收(Old Generation GC,OGC)。 解决这个问题的方法可能包括优化SQL查询,减少不必要的数据加载,或者调整系统刷新频率,让GC有足够的时间回收内存。此外,还可以考虑使用内存泄漏检测工具来帮助定位问题,并采取相应的代码优化策略,如使用对象池或更高效的内存管理技术,以避免类似内存溢出问题的再次发生。 这个案例揭示了在实际开发和运维环境中,对Java虚拟机内存监控的必要性以及性能问题定位的重要性。通过深入分析和实践,可以提升Java应用的稳定性和性能,确保系统的高效运行。
187 浏览量
使用方法: 将jar包放置在运行java项目的机器上 运行指令 java -jar java_monitor-0.0.2-SNAPSHOT.jar --server.prot=8888 启动成功后访问默认端口8888 1.自定义端口 在执行jar包时追加参数 --server.port=9999 2.自定义监控周期 默认监控频率为60秒,并且只记录当天产生的监控数据。 如果需要自定义监控频率与监控时长,只需要在jar包所在目录下新建application.properties文件,修改下列字段即可 monitor.rate=60 #监控频率/秒 monitor.cron=0 0 0 * * ? #每日的0:00:00时刻清空数据 连续监控1个月,示例 monitor.cron=0 0 0 1 * ? 连续监控1年,示例 monitor.cron=0 0 0 1 1 ? * 不新建文件,使用追加参数的方法也是可以的。 3.监控参数 监控参数的含义如下: S0C:s0(from)的大小(KB) S1C:s1(from)的大小(KB) S0U:s0(from)已使用的空间(KB) S1U:s1(from)已经使用的空间(KB) EC:eden区的大小(KB) EU:eden区已经使用的空间(KB) OC:老年代大小(KB) OU:老年代已经使用的空间(KB) MC:元空间的大小(Metaspace) MU:元空间已使用大小(KB) CCSC:压缩类空间大小(compressed class space) CCSU:压缩类空间已使用大小(KB) YGC:新生代gc次数 YGCT:新生代gc耗时(秒) FGC:Full gc次数 FGCT:Full gc耗时(秒) GCT:gc总耗时(秒) Loaded:表示载入了类的数量 Unloaded 表示卸载类的数量 Compiled 表示编译任务执行的次数 Failed表示编译失败的次数 total:线程总数 RUNNABLE:正在运行的线程数 TIMED_WAITING:休眠的线程数 WAITING:等待的线程数