1、查看垃圾回收情况
jstat -gc pid 1000 10 1秒钟打印一次,共打印10次停止
2、查看JVM启动参数
jinfo -flags pid
3、JVM启动参数中增加gc日志参数 。gc日志分析参考:http://swcdxd.iteye.com/blog/1859858
-XX:+PrintGC 输出GC日志
-XX:+PrintGCDetails 输出GC的详细日志
-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
-Xloggc:../logs/gc.log 日志文件的输出路径
-XX:ReservedCodeCacheSize=128m 调整代码缓存区大小。代码缓存区满的时候,会报OutOfMemoryError
在启动参数里加个-XX:+DisableExplicitGC ,可以禁止业务代码主动调用System.gc()进行full gc
配置如:
-XX:+PrintGCDetails -Xloggc:../logs/gc.log -XX:+PrintGCTimeStamps
4、System.gc()执行的是full gc,日志中,会有(System)的标记
5、full gc 太频繁的排查思路
参考:http://blog.csdn.net/chenleixing/article/details/46706039
参考:http://blog.csdn.net/shiyong1949/article/details/52585256
其中以下两点可能不好排查:
5、统计得到的Minor GC晋升到旧生代的平均大小大于老年代的剩余空间
6、堆中分配很大的对象
6、几种内存溢出的场景
参考:http://blog.csdn.net/u011080472/article/details/51322119
对于强引用, 当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题
7、内存泄露和内存溢出的区别是什么?
内存泄漏时代码问题
内存溢出是现象。可能是因为内存泄漏导致的,也可能是配的启动参数有问题