一、Java堆溢出
堆参数设置-Xms 、-Xmx 均设置成20M
-XX:+HeapDumpOnOutOfMemoryError :可以让虚拟机在出现内存溢出异常时Dump出当前的内存堆转储快照以便事后进行 分析
程序代码如下
抛出异常如下
二、堆转存快照的获取与分析
2.1 通过ps命令查询进程id; 例如pid = 8052
2.2 通过如下命令可以获取堆转存快照: jmap -dump:format=b,file=heap.hprof 8052 (heap.hprof 文件名自己定义)
2.3 通过MAT分析heap.hprof文件
三、 jvm堆溢出异常的分析思路
1、确认是内存泄露(Memory leak ) 还是内存溢出(Memory overflow)
2、如果是内存泄露, 可进一步通过工具查看泄露对象到GC Roots的引用链。于是就能找到泄露对象是通过怎样的路径与GC Roots相关联并 导致垃圾收集器无法自动回收它们的。
3、如果不存在泄露, 换句话说, 就是内存中的对象确实都还必须存活着, 那就应当检查虚拟机的堆参数(-Xmx 与-Xms), 与机器物理内存对比看是否还可以调大, 从代码上检查是否存在某些对象生命周期过长、 持有状态时间过长的情况, 尝试减少程序运行期的内存消耗。