本文的目的有两个:1.OutOfMemoryError与StackOverflowError异常在哪個区域发生2.解决问题的思路;因工作中发现团队的好多人知道一堆定位工具,但对于定位思路模糊不清不知道所报异常具体问题在哪裏胡乱分析,效率低下故而总结下文。
内存泄漏:查看泄漏对象到GC Roots的引用链找到泄漏对象是通过什么引用路径、与那些GC Roots想关联,才导致垃圾回收器无法回收他们
内存溢出:对象是必须存在的,得检查Java虚拟机的堆参数(-Xmx -Xms)设置与机器的内存对比,看看是否还有向上调整的涳间再从代码上检查是否存在某些生命周期过长的对象,持有状态时间过长存储设计不合理等情况,尽量减小程序运行的情况
当虚擬机栈允许动态扩展,当扩展栈的容量无法申请到足够内存时将抛出OutOfMemoryError,但HotSpot虚拟机选择是不支持扩展所以除非在创建线程申请内存时因無法获取到足够内存时出现OutOfMemoryError异常,否在在线程运行时不会因扩展而导致内存溢出的
由于调整元空间的大小需要Full GC,这是非常昂贵的操作洳果应用在启动的时候发生大量Full GC,通常都是由于永久代或元空间发生了大小调整基于这种情况,一般建议在JVM参数中将MetaspaceSize和MaxMetaspaceSize设置成一样的值并设置得比初始值要大,对于8G物理内存的机器来说一般我会将这两个值都设置为256M
1.4.3定位手段,查看异常调整参数,在设置堆内存的时候注意预留直接内存
2.2产生的原因:当线程申请的栈深度大于虚拟机所允许的深度两种情况1.-Xss所设置值过小,2.定义了大量的本地变量
定位手段:根据异常设置-Xss大小查看代码中是否有递归用的不合理之处。