实战 OutOfMemoryError异常 青旅半醒 2022-05-14 13:59 147阅读 0赞 # 1、java堆溢出 # ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70][] 代码如下 import java.util.ArrayList; import java.util.List; /** * Vm args:-Xms20M -Xmx20M -XX:+HeapDumpOnOutOfMemoryError * 堆的最小值参数-Xms,堆的最大值参数-Xmx * -XX:+HeapDumpOnOutOfMemoryError表示让虚拟机在出现内存异常时Dump出当前的内存堆转储快照 * -XX:HeapDumpPath:为快照文件位置 * Java 堆内存溢出测试,深入理解java虚拟机 p51 */ //-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:/ public class HeapOOM { static class OOMObject{} //psvm public static void main(String[] args) { List<OOMObject> list = new ArrayList<OOMObject>(); while (true){ list.add(new OOMObject()); } } } ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 1][] 运行 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 2][] ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 3][] ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 4][] ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 5][] 我们用Memory Analyzer 打开 dump出来的堆转储快照 官网:http://www.eclipse.org/mat/downloads.php 下载 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 6][] 打开![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 7][] ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 8][] 具体分析就不说了 # 2、java虚拟机栈和本地方法栈溢出 # ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 9][] /** * VM args:-Xss128k * -Xss128k 减小栈内存至128k */ 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; } } } 运行 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 10][] ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 11][] ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 12][] /\*\* \* VM args:-Xss2M \* 该程序执行容易死机,我的电脑运行死机两次 \* \*/ public class JavaVMStatckOOM\{ public void dontStop()\{ while(true)\{ \} \} public void stackLeakByThread()\{ while(true)\{ Thread t = new Thread(new Runnable() \{ @Override public void run() \{ dontStop(); \} \}); t.start(); \} \} public static void main(String\[\] args) \{ JavaVMStatckOOM sofm = new JavaVMStatckOOM(); sofm.stackLeakByThread(); \} \} 书上的运行结果如下 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 13][] 3、方法区和运行时常量池溢出 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 14][] /\*\* \* VM args:-XX:PermSize=10M -XX:MaxPermSize=10M \* PermSize 方法区大小 \*/ public class RuntimeContantPoolOOM\{ public static void main(String\[\] args) \{ //使用List保存对常量池字符串的应用,避免Full GC回收常量池的行为 List<String> list = new ArrayList<String>(); //10M的PermSize在int的范围足够产生OutOfMemoryError int i = 0; while(true)\{ list.add(String.valueOf(i++).intern()); \} \} \} 运行结果(JDK1.6及之前的运行结果), Exception in thread “main” java.lang.OutOfMemoryError: PermGen space 在jdk6及之前,常量池分配在永久代内,通过-XX:PermSize10M -XX:MaxPermSize=10M限制其大小,而JDK1.7后就不会出现相同的结果,while循环将一直进行下去。。。。。。 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 15][] public static void main(String[] args) { String str1 = new StringBuilder("计算机").append("软件").toString(); System.out.println(str1.intern()==str1); String str2 = new StringBuilder("ja").append("va").toString(); System.out.println(str2.intern() == str2); String str3 = new StringBuilder("goo").append("gle").toString(); System.out.println(str3.intern() == str3); } 结果如下 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 16][] ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 17][] ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 18][] /\*\* \* VM Args: -XX:PermSize=10M -XX:MaxPermSize=10M \*/ public class JavaMethodAreaOOM \{ public static void main(String\[\] args) \{ while (true) \{ Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(OOMObject.class); enhancer.setUseCache(false); enhancer.setCallback(new MethodInterceptor() \{ @Override public Object intercept(Object obj, Method method, Object\[\] arg, MethodProxy proxy) throws Throwable \{ // TODO Auto-generated method stub return proxy.invokeSuper(obj, arg); \} \}); enhancer.create(); \} \} static class OOMObject \{ \} \} 运行结果: Caused by: java.lang.OutOfMemoryError: PermGen space ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 19][] # 4、本机直接内存溢出 # ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 20][] /\*\* \* VM Args:-Xmx20M -XX:MaxDirectMemorySize=10M \*/ public class DirectMemoryOOM \{ private static final int \_1MB = 1024 \* 1024; public static void main(String\[\] args) throws Exception \{ Field unsafeField = Unsafe.class.getDeclaredFields()\[0\]; unsafeField.setAccessible(true); Unsafe unsafe = (Unsafe) unsafeField.get(null); while (true) \{ unsafe.allocateMemory(\_1MB); \} \} \} 运行结果: Exception in thread "main" java.lang.OutOfMemoryError at sun.misc.Unsafe.allocateMemory(Native Method) at baby.oom.DirectMemoryOOM.main(DirectMemoryOOM.java:20) ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 21][] [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70]: /images/20220504/c405877eb7cc40aebcf54d7b8779a2e4.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 1]: /images/20220504/6d45e81fd2734154a915b343ace72e0a.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 2]: /images/20220504/3c8848be3af146388d2109854a8d2fcd.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 3]: /images/20220504/1f607d55f10d4639a14589512b347a68.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 4]: /images/20220504/cebd5469cc4b48199acf07d697f4c8a0.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 5]: /images/20220504/234031f5b9294f25bc934352cee1c3aa.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 6]: /images/20220504/b8b28a0b00514529991bbba8e8c43323.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 7]: /images/20220504/5b48ad4fd8c843f6a0ab1297e86f0ea3.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 8]: /images/20220504/fdc9beca6131498fb55fe37843aabcba.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 9]: /images/20220504/8404dc923df5449ca5a2025cad8abff2.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 10]: /images/20220504/18741fa2b69c40b88cd304bb416e64fd.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 11]: /images/20220504/90ac4ad6863e445f87671e76e1ebb490.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 12]: /images/20220504/3e6efa738877411da065f405ca951700.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 13]: /images/20220504/f73cb43d34a74c318659803fb73da759.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 14]: /images/20220504/cee30babdd7841bfa0d3fcccb3f6b24f.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 15]: /images/20220504/b18f984ca05a4097bce252057c1bc102.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 16]: /images/20220504/b2a900816afb4acc9db33e89e82d2775.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 17]: /images/20220504/e7370b3582a84ec28f36ceae37398308.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 18]: /images/20220504/10b2cd7a7b4644638a7287caeaddf8ee.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 19]: /images/20220504/2f8396f017a0464898edef450558dc46.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 20]: /images/20220504/0f3a57c087cb433eb94b6e01d8f608a6.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VvdGFpbA_size_27_color_FFFFFF_t_70 21]: /images/20220504/5337be3115544960a9eadce7b230791b.png
还没有评论,来说两句吧...