package 内存管理.内存溢出;
import java.util.ArrayList;
import java.util.List;
public class 堆内存溢出 {
static class OOMObject {}
public static void main(String[] args) {
List<OOMObject> list = new ArrayList<>();
while (true) {
list.add(new OOMObject());
}
}
}
异常
堆溢出异常
java.lang.OutOfMemoryError: Java heap space
Dumping heap to D:\workspace\JAVA\JVM\src\�ڴ����\�ڴ����\���ڴ����.hprof ...
Heap dump file created [28370799 bytes in 0.057 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3210)
at java.util.Arrays.copyOf(Arrays.java:3181)
at java.util.ArrayList.grow(ArrayList.java:267)
at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:241)
at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:233)
at java.util.ArrayList.add(ArrayList.java:464)
at 内存管理.内存溢出.堆内存溢出.main(堆内存溢出.java:11)
进程已结束,退出代码为 1
package 内存管理.内存溢出.栈内存溢出;
// -Xss2M
public class 栈内存消耗线程溢出 {
private void dontStop() {
while (true) {
}
}
private void stackLeakByThread() {
while (true) {
new Thread(() -> {
dontStop();
}).start();
}
}
public static void main(String[] args) {
栈内存消耗线程溢出 oom = new 栈内存消耗线程溢出();
oom.stackLeakByThread();
}
}
异常
栈溢出-深度过深
stack length:984
Exception in thread "main" java.lang.StackOverflowError
at 内存管理.内存溢出.栈内存溢出.栈内存溢出.stackLeak(栈内存溢出.java:7)
at 内存管理.内存溢出.栈内存溢出.栈内存溢出.stackLeak(栈内存溢出.java:8)
at 内存管理.内存溢出.栈内存溢出.栈内存溢出.stackLeak(栈内存溢出.java:8)
at 内存管理.内存溢出.栈内存溢出.栈内存溢出.stackLeak(栈内存溢出.java:8)
at 内存管理.内存溢出.栈内存溢出.栈内存溢出.stackLeak(栈内存溢出.java:8)
at 内存管理.内存溢出.栈内存溢出.栈内存溢出.stackLeak(栈内存溢出.java:8)
at 内存管理.内存溢出.栈内存溢出.栈内存溢出.stackLeak(栈内存溢出.java:8)
at 内存管理.内存溢出.栈内存溢出.栈内存溢出.stackLeak(栈内存溢出.java:8)
栈溢出-变量表过大
stack length:53
Exception in thread "main" java.lang.StackOverflowError
at 内存管理.内存溢出.栈内存溢出.栈内存局部变量表溢出.stackLeak(栈内存局部变量表溢出.java:19)
at 内存管理.内存溢出.栈内存溢出.栈内存局部变量表溢出.stackLeak(栈内存局部变量表溢出.java:20)
at 内存管理.内存溢出.栈内存溢出.栈内存局部变量表溢出.stackLeak(栈内存局部变量表溢出.java:20)
at 内存管理.内存溢出.栈内存溢出.栈内存局部变量表溢出.stackLeak(栈内存局部变量表溢出.java:20)
at 内存管理.内存溢出.栈内存溢出.栈内存局部变量表溢出.stackLeak(栈内存局部变量表溢出.java:20)
at 内存管理.内存溢出.栈内存溢出.栈内存局部变量表溢出.stackLeak(栈内存局部变量表溢出.java:20)
at 内存管理.内存溢出.栈内存溢出.栈内存局部变量表溢出.stackLeak(栈内存局部变量表溢出.java:20)
at 内存管理.内存溢出.栈内存溢出.栈内存局部变量表溢出.stackLeak(栈内存局部变量表溢出.java:20)
栈溢出-线程创建过多
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:719)
at 内存管理.内存溢出.栈内存溢出.栈内存消耗线程溢出.stackLeakByThread(栈内存消耗线程溢出.java:13)
at 内存管理.内存溢出.栈内存溢出.栈内存消耗线程溢出.main(栈内存消耗线程溢出.java:18)
package 内存管理.内存溢出.方法区内存溢出;
import java.util.HashSet;
import java.util.Set;
public class 字符串常量池溢出 {
public static void main(String[] args) {
Set<String> strSet = new HashSet<>();
int i = 0;
while (true) {
strSet.add(String.valueOf(i++).intern());
}
}
}
异常
字符串常量池溢出异常
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.HashMap.newNode(HashMap.java:1774)
at java.util.HashMap.putVal(HashMap.java:632)
at java.util.HashMap.put(HashMap.java:613)
at java.util.HashSet.add(HashSet.java:220)
at 内存管理.内存溢出.方法区内存溢出.字符串常量池溢出.main(字符串常量池溢出.java:12)
-XX:InitialHeapSize=20971520 -XX:MaxHeapSize=20971520 -XX:MaxNewSize=10485760 -XX:NewSize=10485760 -XX:+PrintCommandLineFlags -XX:+PrintGC -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
[GC (Allocation Failure) [PSYoungGen: 6464K->872K(9216K)] 6464K->4976K(19456K), 0.0018411 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heap
PSYoungGen total 9216K, used 7253K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)
eden space 8192K, 77% used [0x00000000ff600000,0x00000000ffc3b5a0,0x00000000ffe00000)
from space 1024K, 85% used [0x00000000ffe00000,0x00000000ffeda020,0x00000000fff00000)
to space 1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000)
ParOldGen total 10240K, used 4104K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)
object space 10240K, 40% used [0x00000000fec00000,0x00000000ff002020,0x00000000ff600000)
Metaspace used 3805K, capacity 4540K, committed 4864K, reserved 1056768K
class space used 424K, capacity 428K, committed 512K, reserved 1048576K
-XX:InitialHeapSize=20971520 -XX:MaxHeapSize=20971520 -XX:MaxNewSize=10485760 -XX:NewSize=10485760 -XX:PretenureSizeThreshold=3145728 -XX:+PrintCommandLineFlags -XX:+PrintGC -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseSerialGC
Heap
def new generation total 9216K, used 2532K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)
eden space 8192K, 30% used [0x00000000fec00000, 0x00000000fee792a0, 0x00000000ff400000)
from space 1024K, 0% used [0x00000000ff400000, 0x00000000ff400000, 0x00000000ff500000)
to space 1024K, 0% used [0x00000000ff500000, 0x00000000ff500000, 0x00000000ff600000)
tenured generation total 10240K, used 4096K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)
the space 10240K, 40% used [0x00000000ff600000, 0x00000000ffa00010, 0x00000000ffa00200, 0x0000000100000000)
Metaspace used 3805K, capacity 4540K, committed 4864K, reserved 1056768K
class space used 424K, capacity 428K, committed 512K, reserved 1048576K
结果分析
1、-XX:PretenureSizeThreshold=3145728 只对 Serial 和 ParNew 收集器有效。
评论交流
欢迎留下你的想法