探索OutOfMemoryError与StackOverflowError
本文的目的有两个:1.OutOfMemoryError与StackOverflowError异常在哪个区域发生,2.解决问题的思路;因工作中发现团队的好多人知道一堆定位工具,但对于定位思路模糊不清,不知道所报异常具体问题在哪里胡乱分析,效率低下,故而总结下文。 一、OutOfMemoryError异常 1.1 Java堆(-Xmx -Xms) 1.1.1标识: java.lang.OutOfMemoryError:heap space(比较常见) 1.1.2产生的原因:1.内存泄漏(Memory Leak) 2.内存溢出(Memory OverFlow) 1.1.3定位手段:可以通过参数-XX:+HeapDumpOnOutOfMemoryError让虚拟机在出现内存异常的时候Dump出当前内存堆转存快照以便进行事后分析。 内存泄漏:查看泄漏对象到GC Roots的引用链,找到泄漏对象是通过什么引用路径、与那些GC Roots想关联,才导致垃圾回收器无法回收他们。 内存溢出:对象是必须存在的,得检查Java虚拟机的堆参数(-Xmx -Xms)设置,与机器的内存对比,看看是否还有向上调整的空间。再从代码上检查是否存在某些生命周期过长的对象,持有状态时间过长,存储设计不合理等情况,尽量减小程序运行的情况。 1.2虚拟机栈与本地方法栈 当虚拟机栈允许动态扩展