您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“Java虛擬機OOM怎么用”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Java虛擬機OOM怎么用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
通過代碼模擬Java虛擬機規范中描述的各個運行時區域內存溢出的場景。
首先,虛擬機啟動參數配置如下:
-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 1
輸出:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:2245) at java.util.Arrays.copyOf(Arrays.java:2219) at java.util.ArrayList.grow(ArrayList.java:213) at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:187) at java.util.ArrayList.add(ArrayList.java:411) at HeapOOM.main(HeapOOM.java:15) Heap def new generation total 9216K, used 8920K [0x32570000, 0x32f70000, 0x32f70000) eden space 8192K, 100% used [0x32570000, 0x32d70000, 0x32d70000) from space 1024K, 71% used [0x32d70000, 0x32e26040, 0x32e70000) to space 1024K, 0% used [0x32e70000, 0x32e70000, 0x32f70000) tenured generation total 10240K, used 5693K [0x32f70000, 0x33970000, 0x33970000) the space 10240K, 55% used [0x32f70000, 0x334ff7f8, 0x334ff800, 0x33970000) compacting perm gen total 12288K, used 135K [0x33970000, 0x34570000, 0x37970000) the space 12288K, 1% used [0x33970000, 0x33991dd8, 0x33991e00, 0x34570000) ro space 10240K, 45% used [0x37970000, 0x37df1888, 0x37df1a00, 0x38370000) rw space 12288K, 54% used [0x38370000, 0x389f04f8, 0x389f0600, 0x38f70000) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
2. 虛擬機棧和本地方法棧溢出
2.1 StackOverflowError
虛擬機拋出StackOverflowError異常,輸出:
Exception in thread "main" java.lang.StackOverflowError at JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:7) at JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:8) ... 1 2 3 4
/** * * * 功能描述: 棧OutOfMemoryError * VM Args:-Xss2M 調大單線程可使用棧空間大小 * @author zhuyiquan90 * @created 2017-9-1 上午11:20:06 * @version 1.0.0 * @date 2017-9-1 上午11:20:06 */ public class JavaVMStackOOM { private void dontStop() { while (true) { } } public void stackLeakByThread() { while (true) { Thread thread = new Thread(new Runnable() { @Override public void run() { dontStop(); } }); thread.start(); } } public static void main(String[] args) { JavaVMStackOOM oom = new JavaVMStackOOM(); oom.stackLeakByThread(); } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
3. 方法區和運行時常量池溢出
import java.util.ArrayList; import java.util.List; /** * * * 功能描述: 運行時常量池內存溢出 * VM Args: -XX:PermSize=10M -XX:MaxPermSize=10M * @author 作者 zhuyiquan90 * @created 2017-9-1 上午11:50:48 * @version 1.0.0 * @date 2017-9-1 上午11:50:48 */ public class RuntimeConstantPoolOOM { public static void main(String[] args) { // 使用List保持常量池引用,避免Full GC回收常量池行為 List<String> list = new ArrayList<String>(); // 10MB的PermSize在integer范圍內足夠產生OOM int i =0; while(true) { list.add(String.valueOf(i++).intern()); } } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
在JDK 1.7及以上,while循環將一直進行下去。
package com.suning; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; /** * * * 功能描述: 方法區內存溢出 * VM Args: -XX:PermSize=10M -XX:MaxPermSize=10M * @author 作者 zhuyiquan90 * @created 2017-9-1 下午3:31:27 * @version 1.0.0 * @date 2017-9-1 下午3:31:27 */ 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[] args, MethodProxy proxy) throws Throwable { // TODO Auto-generated method stub return proxy.invokeSuper(obj, args); } }); enhancer.create(); } } static class OOMObject { } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
4. 本機直接內存溢出
運行結果:
Exception in thread "main" java.lang.OutOfMemoryError at sun.misc.Unsafe.allocateMemory(Native Method) at DirectMemoryOOM.main(DirectMemoryOOM.java:14) 1 2 3
讀到這里,這篇“Java虛擬機OOM怎么用”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。