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