堆溢出
异常堆栈信息:java.lang.OutOfMemoryError: Java heap space。
JVM配置:gc -Xms10M -Xmx10M -Xmn7M -Xss1M -XX:+PrintGCDetails -XX:SurvivorRatio=8
-Xms:堆初始化内存大小
-Xmx:堆扩展最大内存大小
-Xmn:新生代内存大小
-XX:SurvivorRatio=8 Eden区与Survivor0+Survivor1相加的比例:8分类:
内存泄露:memory leak,应该回收的对象垃圾收集器没有回收。
解决方案:1,找到没有被回收的对象(堆转储快照分析)2,调节堆内存大小
内存溢出:memory overflow,
解决方案:1,找到生命周期长的对象(堆转储快照分析)2,调节堆内存大小案例
代码片段:
public static void main(String[] args) {
try {
List<String> list = new ArrayList<>();
int i = 1;
while (true) {
list.add("ss");
i++;
}
} catch (Exception e) {
e.printStackTrace();
}
}
异常信息:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.util.Arrays.copyOf(Unknown Source)
at java.util.ArrayList.grow(Unknown Source)
at java.util.ArrayList.ensureExplicitCapacity(Unknown Source)
at java.util.ArrayList.ensureCapacityInternal(Unknown Source)
at java.util.ArrayList.add(Unknown Source)
at test.TestDemo.main(TestDemo.java:13)
栈溢出
异常堆栈信息:java.lang.StackOverflowError。
JVM配置:gc -Xms10M -Xmx10M -Xmn7M -Xss1M -XX:+PrintGCDetails -XX:SurvivorRatio=8
-Xss:初始化栈内存大小
-Xoss:初始化本地方法栈内存大小(无效的,一般不使用)分类:
1:栈深度异常
现象:线程请求的栈的深度大于方法编译时候设定的深度(针对虚拟机栈)。
抛出:StackOverflowError异常。
解决方案:找到造成该现象的代码块片段,分析原因。也可以适当增加物理内存。
2:栈扩展异常
现象:虚拟机栈在扩展栈内存大小的时候申请不到足够的内存空间。
抛出:OutOfMemoryError异常。
解决方案:适当增加物理内存。案例
代码片段:
int j = 0;
@Test
public void test11() {
try {
test();
} catch (Exception e) {
e.printStackTrace();
}
}
private void test() {
System.out.println(j++);
test();
}
异常信息:
java.lang.StackOverflowError
at sun.nio.cs.UTF_8$Encoder.encodeLoop(Unknown Source)
at java.nio.charset.CharsetEncoder.encode(Unknown Source)
at sun.nio.cs.StreamEncoder.implWrite(Unknown Source)
at sun.nio.cs.StreamEncoder.write(Unknown Source)
at java.io.OutputStreamWriter.write(Unknown Source)
at java.io.BufferedWriter.flushBuffer(Unknown Source)
at java.io.PrintStream.write(Unknown Source)
at java.io.PrintStream.print(Unknown Source)
at java.io.PrintStream.println(Unknown Source)
方法区溢出
异常堆栈信息:java.lang.OutOfMemoryError:PermGen space。
JVM配置:gc -Xms10M -Xmx10M -Xmn7M -Xss1M -XX:PermSize1oM -XX:MaxPeramSize10M -XX:+PrintGCDetails -XX:SurvivorRatio=8
-XX:PermSize:初始化方法区内存大小
-XX:MaxPermSize:最大方法区内存大小案例
待添加
本机直接内存溢出
异常堆栈信息:java.lang.OutOfMemoryError.
JVM配置:gc -Xms10M -Xmx10M -Xmn7M -Xss1M -XX:PeramSize10M -XX:MaxPeramSize20M -XX:MaxDirectMemorySize=10M -XX:+PrintGCDetails -XX:SurvivorRatio=8
-XX:MaxDirectMemorySize:最大直接内存大小。不指定 -XX:MaxDirectMemorySize = -Xmx 即默认为最大的堆内存的大小。案例
待添加