目录
使用如下命令查看java进程中内存的使用情况
jstat -gcutil <pid> 5000
发现运行中的java进程堆内存占用一直过高,有可能是堆中有大量无用对象没有释放,可以先触发一次FullGC,查看一下结果。
触发FullGC可以通过代码,也可以通过工具,下面简单介绍一下主要的方式
#1
System.gc();
#2
Runtime.getRuntime().gc();
#1? jmap
jmap -histo:live <pid>
此命令会先执行一次FullGC,然后把存活类的对象的数量和占用的空间,按从大到小的顺序排列出来。
#2? jcmd
jcmd <pid> GC.run
?#3? 使用JConsole或 Java Mission Control
?这2个工具实际上也是执行的jcmdGC.run命令。
通过代码触发的方式需要写代码,用起来不方便,推荐使用工具的方式。
总结一下,对于堆占用过高的问题,最简单的处理步骤如下:
先通过如下命令查看java进程的堆占用情况
jstat -gcutil <pid> 5000
通过如下命令手工触发FullGC,主要是将无用的对象都回收掉,将占用的空间释放出来
jcmd <pid> GC.run
若堆占用还是较高,使用如下命令查看是哪些类的对象占用堆较高
jmap -histo:live <pid>
分析上述命令导出的日志文件,找出占用内存空间较多的类的对象,结合代码进行分析。