OutOfMemoryError 分析过程
最近在研究JVM优化方面的知识,今天就顺便用JVM的查看工具测试了一下当发生OutOfMemoryError的时候如何通过工具来分析出错原因。
需要的工具Eclipse Memory Analyzer。
1.在eclipse的run argument中输入以下VM参数(关于Xms,Xmx,Xmn的具体含义参考http://unixboy.iteye.com/blog/174173)。设置了堆空间为20M,年轻代为10M。通过参数-XX:+HeapDumpOnOutOfMemoryError指定发生OutOfMemoryError的时候dump下内存(文件名为java_pid〈进程ID〉.hprof)。通过参数 -XX:+PrintGCDetails -Xloggc:gc.log设置程序输出gc的信息到gc.log文件。
2.以下为java代码
总结:Memery Analyzer是一个很好的分析工具,在程序运行的时候可以通过Jmap dump下内存,然后通过它来分析。
? 一个问题是,垃圾回收动作何时执行?
当年轻代内存满时,会引发一次普通GC,该GC仅回收年轻代。需要强调的时,年轻代满是指Eden代满,Survivor满不会引发GC当年老代满时会引发Full GC,Full GC将会同时回收年轻代、年老代当永久代满时也会引发Full GC,会导致Class、Method元信息的卸载? 另一个问题是,何时会抛出OutOfMemoryException,并不是内存被耗空的时候才抛出
JVM98%的时间都花费在内存回收每次回收的内存小于2%