0%

Java虚拟机

Java堆溢出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

/**
* VM Args 堆的最大、最小值设置为一样可以避免堆自动扩展
* -Xms20m 堆的最小值
* -Xmx20m 堆的最大值
* -XX:+HeapDumpOnOutOfMemoryError 虚拟机在出现内存溢出异常时Dump出当前的堆转储快照
*/
public class HeapOOM{
static class OOMObject{
}
public static void main(String[] args){
List<OOMObject> list = new ArrayList<>();
while(true){
list.add(new OOMObject);
}
}
}

异常堆栈信息:

1
java.lang.OutOfMemoryError  Java heap space

首先要确认是内存泄漏(Memory Leak)还是内存溢出(Memory Overflow)

如果是内存泄漏

可以通过工具查看泄漏对象到GC Roots的引用链,定位到泄漏代码的位置。

如果是内存溢出

检查虚拟机的堆参数(-Xmx与-Xms),与机器物理内存对比看是否可以调大,从代码上检查是否存在某些对象生命周期过长、持有状态时间过长的情况,尝试减少程序运行期间的内存消耗。

虚拟机栈和本地方法栈溢出

如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常。

如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。``