除了PC(程序计数器)Java虚拟机的其他几个运行时区域均可能出现 OOM异常。
package day0413; import java.util.ArrayList; import java.util.List; /** * VM Args: -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError * @author 多多 * */ public class HeapOOM { static class OOMObject{ } public static void main(String [] args) { List<OOMObject> list=new ArrayList<OOMObject>(); while(true) { list.add(new OOMObject()); } } }
实验:
package day0413; /** * VM Args: -Xss128k * @author 多多 * */ public class JavaVMStackSOF { private int stackLength=1; public void stackLeak() { stackLength++; stackLeak(); } public static void main(String [] args) throws Throwable{ JavaVMStackSOF oom=new JavaVMStackSOF(); try { oom.stackLeak(); }catch (Throwable e) { System.out.println("stack length:"+ oom.stackLength); throw e; } } }
package day0413; /** * VM Args: -Xss2M * @author 多多 * */ public class JavaVMStackOOM { private void dontStop() { while(true) { } } public void stackLeakByThread() { while(true) { Thread thread=new Thread(new Runnable() { public void run() { dontStop(); } }); thread.start(); } } public static void main(String [] args) throws Throwable{ JavaVMStackOOM oom=new JavaVMStackOOM(); oom.stackLeakByThread(); } }
package day0413; import java.util.ArrayList; import java.util.List; /** * VM Args: -XX:PermSize-10M -XX:MaxPermSize-10M * @author 多多 * */ public class RuntimeConstantPoolOOM { public static void main(String [] args) { List<String> list=new ArrayList <String>(); int i=0; while(true) { list.add(String.valueOf(i++).intern()); } } }