1.JVM结构
线程共享:Java堆 直接内存 方法区(常量池,类信息)
线程私有:程序计数器 虚拟机栈 本地方法栈
2.堆内存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
-Xss128k
java.lang.StackOverflowError
public static void main(String[] args) {
SOEDemo soeDemo = new SOEDemo();
soeDemo.leak();
}
private void leak() {
int x = 0;
leak();
}
4.元数据区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();
}
}
如果是JDK1.7,这里应该是永久代(-XX:PermSize=128m -XX:MaxPermSize=128m)
5.直接内存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);
}
}