Disclaimer: This article is a blogger original article, shall not be reproduced without the bloggers allowed. https://blog.csdn.net/u013219624/article/details/89098603
1.JVM structure
线程共享:Java堆 直接内存 方法区(常量池,类信息)
线程私有:程序计数器 虚拟机栈 本地方法栈
2. heap memory OOM
-XX:+HeapDumpOnOutOfMemoryError -Xms20m -Xmx20m
java.lang.OutOfMemoryError: Java heap space
public static void main(String[] args) throws Exception {
List<OOMDemo> oomDemoList = new ArrayList<>();
while (true) {
oomDemoList.add(new OOMDemo());
}
}
3. SOE stack overflow
-Xss128k
java.lang.StackOverflowError
public static void main(String[] args) {
SOEDemo soeDemo = new SOEDemo();
soeDemo.leak();
}
private void leak() {
int x = 0;
leak();
}
4. The metadata area OOM (JDK1.8)
-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m
java.lang.OutOfMemoryError: Metaspace
public static void main(final String[] args) {
while (true) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(MMSDemo.class);
enhancer.setUseCache(false);
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
return methodProxy.invokeSuper(o, objects);
}
});
enhancer.create();
}
}
If JDK1.7, there should be a permanent Generation (-XX: PermSize = 128m -XX: MaxPermSize = 128m)
5. Direct Memory OOM
-XX:+HeapDumpOnOutOfMemoryError -Xms20m -Xmx20m -XX:MaxDirectMemorySize=20m
java.lang.OutOfMemoryError
public static void main(String[] args) throws Exception {
Field field = Unsafe.class.getDeclaredFields()[0];
field.setAccessible(true);
Unsafe unsafe = (Unsafe) field.get(null);
while (true) {
unsafe.allocateMemory(_1MB);
}
}