亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JVM的內存溢出異常說明

發布時間:2021-09-18 15:52:00 來源:億速云 閱讀:111 作者:chen 欄目:編程語言

本篇內容介紹了“JVM的內存溢出異常說明”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

舉例說明含義:

-Xss128k

每個線程的java棧大小,一個線程java棧所有棧幀大小總和***允許的尺寸128k。

-Xms128m

表示JVM Heap(堆內存)最小尺寸128MB,初始分配

-Xmx512m

表示JVM Heap(堆內存)***允許的尺寸256MB,按需分配。

-XX:PermSize=20M

設置方法區的初始大小

-XX:MaxPermSize=30M

設置方法區的***值

Java棧溢出

在Java虛擬機規范中,對這個區域規定了兩種異常狀況:StackOverflowError和OutOfMemoryError異常。

1.StackOverflowError異常

每當java程序代碼啟動一個新線程時,Java虛擬機都會為它分配一個Java棧。Java棧以幀為單位保存線程的運行狀態。當線程調用java方法時,虛擬機壓入一個新的棧幀到該線程的java棧中。只要這個方法還沒有返回,它就一直存在。如果線程的方法嵌套調用層次太多(如遞歸調用),隨著java棧中幀的逐漸增多,最終會由于該線程java棧中所有棧幀大小總和大于-Xss設置的值,而產生StackOverflowError內存溢出異常。例子如下:

/**    * VM Args: -Xss128k    */  public class Test {              private int count = 0;          public static void main(String[] args) {           new Test().method();       }              public void method() {           System.out.println(++count);           method();       }      }

-Xss為128k。其中的一次測試結果為,當count的值累加到2312時,發生如下異常:

Exception in thread "main" java.lang.StackOverflowError      at sun.nio.cs.UTF_8.updatePositions(UTF_8.java:58)      at sun.nio.cs.UTF_8$Encoder.encodeArrayLoop(UTF_8.java:392)      at sun.nio.cs.UTF_8$Encoder.encodeLoop(UTF_8.java:447)      at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:544)      at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:252)      at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:106)      at java.io.OutputStreamWriter.write(OutputStreamWriter.java:190)      at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:111)      at java.io.PrintStream.write(PrintStream.java:476)      at java.io.PrintStream.print(PrintStream.java:547)      at java.io.PrintStream.println(PrintStream.java:686)      at jvm.Test.method(Test.java:17)

修改-Xss為1280k。其中的一次測試結果為,當count的值累加到26888時,發生StackOverflowError異常。隨著-Xss參數值的增大,可以嵌套的方法調用層次也相應增加。

綜上所述,StackOverflowError異常是由于方法調用的層次太深,最終導致為某個線程分配的所有棧幀大小總和大于-Xss設置的值,從而發生StackOverflowError異常。

2.OutOfMemoryError異常

java程序代碼啟動一個新線程時,沒有足夠的內存空間為該線程分配java棧(一個線程java棧的大小由-Xss參數確定),jvm則拋出OutOfMemoryError異常。例子如下:

/**    * VM Args: -Xss128k    */  public class Test {              public static void main(String[] args) {           int count = 0;           while (true) {               Thread thread = new Thread(new Runnable() {                   public void run() {                       while (true) {                           try {                               Thread.sleep(5000);                           } catch (Exception e) {}                       }                   }               });                 thread.start();               System.out.println(++count);           }       }      }

-Xss為128k。其中的一次測試結果為,當count的值累加到11887時,發生如下異常:

Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread      at java.lang.Thread.start0(Native Method)      at java.lang.Thread.start(Thread.java:640)      at jvm.Test.main(Test.java:20)

修改-Xss為1280k。其中的一次測試結果為,當count的值累加到1270時,發生OutOfMemoryError異常。隨著-Xss參數值的增大,java程序可以創建的總線程數越少。

Java堆溢出

Java堆用于儲存對象實例。當需要為對象實例分配內存,而堆的內存占用又已經達到-Xmx設置的***值。將會拋出OutOfMemoryError異常。例子如下:

/**    * VM Args: -Xmx5m    */  public class Test {              public static void main(String[] args) {           int count = 0;           List<Object> list = new ArrayList<Object>();           while (true) {               list.add(new Object());               System.out.println(++count);           }       }      }

-Xmx為5m。其中的一次測試結果為,當count的值累加到297868時,發生如下異常:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space      at java.util.Arrays.copyOf(Arrays.java:2760)      at java.util.Arrays.copyOf(Arrays.java:2734)      at java.util.ArrayList.ensureCapacity(ArrayList.java:167)      at java.util.ArrayList.add(ArrayList.java:351)      at jvm.Test.main(Test.java:15)

修改-Xmx為10m。其中的一次測試結果為,當count的值累加到670205時,發生OutOfMemoryError異常。隨著-Xmx參數值的增大,java堆中可以存儲的對象也越多。

方法區溢出

方法區用于存放java類型的相關信息,如類名、訪問修飾符、常量池、字段描述、方法描述等。在類裝載器加載class文件到內存的過程中,虛擬機會提取其中的類型信息,并將這些信息存儲到方法區。當需要存儲類信息而方法區的內存占用又已經達到-XX:MaxPermSize設置的***值。將會拋出OutOfMemoryError異常。對于這種情況的測試,基本的思路是運行時產生大量的類去填滿方法區,直到溢出。這里需要借助CGLib直接操作字節碼運行時,生成了大量的動態類。例子如下:

/**     * VM Args: -XX:MaxPermSize=50M     */   public class Test {                public static void main(String[] args) {            int count = 0;            while (true) {                 Enhancer enhancer = new Enhancer();                 enhancer.setSuperclass(Test.class);                 enhancer.setUseCache(false);                 enhancer.setCallback(new MethodInterceptor() {                    public Object intercept(Object obj, Method method, Object[] args,                       MethodProxy proxy) throws Throwable {                        return proxy.invoke(obj, args);                    }                 });                 enhancer.create();                 System.out.println(++count);            }        }        }

-XX:MaxPermSize為50m。其中的一次測試結果為,當count的值累加到3953時,發生如下異常:

Caused by: java.lang.OutOfMemoryError: PermGen space      at java.lang.ClassLoader.defineClass1(Native Method)      at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)      at java.lang.ClassLoader.defineClass(ClassLoader.java:615)      ... 8 more

修改-XX:MaxPermSize為100m。其中的一次測試結果為,當count的值累加到8022時,發生OutOfMemoryError異常。隨著-XX:MaxPermSize參數值的增大,java方法區中可以存儲的類型數據也越多。

“JVM的內存溢出異常說明”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

jvm
AI

华蓥市| 天全县| 肃宁县| 安丘市| 婺源县| 休宁县| 勐海县| 海林市| 什邡市| 花莲市| 仙居县| 融水| 新野县| 苍梧县| 靖边县| 永康市| 翁源县| 南雄市| 天等县| 镇康县| 横山县| 洞口县| 如皋市| 逊克县| 明星| 长葛市| 策勒县| 重庆市| 浮梁县| 天峨县| 南部县| 上虞市| 衡水市| 开封市| 宁河县| 灌阳县| 乌兰浩特市| 禄劝| 福建省| 平昌县| 和静县|