国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

JVM的內存溢出異常

開發 后端
在Java虛擬機規范的描述中,除了PC(程序計數器)寄存器外,虛擬機內存的其他幾個運行時區域都有發生OutOfMemoryError異常的可能。當發生OutOfMemoryError異常時,無法用try...catch捕捉。

在Java虛擬機規范的描述中,除了PC(程序計數器)寄存器外,虛擬機內存的其他幾個運行時區域都有發生OutOfMemoryError異常的可能。當發生OutOfMemoryError異常時,無法用try...catch捕捉。

在開始講解之前,在這里先簡單介紹下虛擬機啟動相關的一些內存設置參數。因為OutOfMemoryError異常發生,與這些參數的設置密切相關。

舉例說明含義:

-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內存溢出異常。例子如下:

  1. /**  
  2.   * VM Args: -Xss128k  
  3.   */ 
  4.  public class Test {  
  5.        
  6.      private int count = 0;  
  7.    
  8.      public static void main(String[] args) {  
  9.          new Test().method();  
  10.      }  
  11.        
  12.      public void method() {  
  13.          System.out.println(++count);  
  14.          method();  
  15.      }  
  16.    
  17.  } 

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

  1. Exception in thread "main" java.lang.StackOverflowError  
  2.     at sun.nio.cs.UTF_8.updatePositions(UTF_8.java:58)  
  3.     at sun.nio.cs.UTF_8$Encoder.encodeArrayLoop(UTF_8.java:392)  
  4.     at sun.nio.cs.UTF_8$Encoder.encodeLoop(UTF_8.java:447)  
  5.     at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:544)  
  6.     at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:252)  
  7.     at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:106)  
  8.     at java.io.OutputStreamWriter.write(OutputStreamWriter.java:190)  
  9.     at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:111)  
  10.     at java.io.PrintStream.write(PrintStream.java:476)  
  11.     at java.io.PrintStream.print(PrintStream.java:547)  
  12.     at java.io.PrintStream.println(PrintStream.java:686)  
  13.     at jvm.Test.method(Test.java:17

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

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

2.OutOfMemoryError異常

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

  1. /**  
  2.   * VM Args: -Xss128k  
  3.   */ 
  4.  public class Test {  
  5.        
  6.      public static void main(String[] args) {  
  7.          int count = 0;  
  8.          while (true) {  
  9.              Thread thread = new Thread(new Runnable() {  
  10.                  public void run() {  
  11.                      while (true) {  
  12.                          try {  
  13.                              Thread.sleep(5000);  
  14.                          } catch (Exception e) {}  
  15.                      }  
  16.                  }  
  17.              });    
  18.              thread.start();  
  19.              System.out.println(++count);  
  20.          }  
  21.      }  
  22.    
  23.  } 

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

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

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

Java堆溢出

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

  1. /**  
  2.   * VM Args: -Xmx5m  
  3.   */ 
  4.  public class Test {  
  5.        
  6.      public static void main(String[] args) {  
  7.          int count = 0;  
  8.          List<Object> list = new ArrayList<Object>();  
  9.          while (true) {  
  10.              list.add(new Object());  
  11.              System.out.println(++count);  
  12.          }  
  13.      }  
  14.    
  15.  } 

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

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

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

方法區溢出

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

  1. /**  
  2.    * VM Args: -XX:MaxPermSize=50M  
  3.    */ 
  4.   public class Test {  
  5.         
  6.       public static void main(String[] args) {  
  7.           int count = 0;  
  8.           while (true) {  
  9.                Enhancer enhancer = new Enhancer();  
  10.                enhancer.setSuperclass(Test.class);  
  11.                enhancer.setUseCache(false);  
  12.                enhancer.setCallback(new MethodInterceptor() {  
  13.                   public Object intercept(Object obj, Method method, Object[] args,   
  14.                     MethodProxy proxy) throws Throwable {  
  15.                       return proxy.invoke(obj, args);  
  16.                   }  
  17.                });  
  18.                enhancer.create();  
  19.                System.out.println(++count);  
  20.           }  
  21.       }  
  22.     
  23.   } 

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

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

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

 

相關的參考資料:

1.深入Java虛擬機(原書第2版)

2.深入理解Java虛擬機:JVM高級特性與***實踐

3.互聯網相關的文章

原文鏈接:http://www.cnblogs.com/evan2012/archive/2012/05/12/2497086.html

【編輯推薦】

  1. JVM程序員的閱讀清單
  2. JVM加載過程及異常
  3. 當下主流JVM語言一覽
責任編輯:林師授 來源: evan2012的博客
相關推薦

2020-08-10 17:49:25

JVM內存溢出

2025-06-16 07:40:00

2015-12-28 11:41:57

JVM內存區域內存溢出

2024-04-25 10:06:03

內存泄漏

2023-03-03 12:37:50

JavaJVM內存溢出

2010-09-26 15:53:25

JVM內存溢出

2019-08-29 14:29:42

JVM內存 Java

2018-12-04 10:54:20

JVM內存模型

2010-09-26 16:04:48

JVM內存溢出

2015-03-30 11:18:50

內存管理Android

2024-09-09 09:41:03

內存溢出golang開發者

2013-08-02 10:06:36

Android內存溢出

2024-03-11 08:22:40

Java內存泄漏

2021-08-30 07:22:14

JVM OutOfMemory異常

2018-12-20 10:17:35

JVM模型內存溢出

2017-09-20 08:48:09

JVM內存結構

2021-03-06 10:25:19

內存Java代碼

2023-08-01 08:20:42

JVM優化虛擬機

2012-03-01 10:51:37

JavaJVM

2010-09-25 15:40:52

配置JVM內存
點贊
收藏

51CTO技術棧公眾號

久久99精品久久久久| 亚洲高清视频中文字幕| 91精品国产91久久久| 在线观看免费网站| 狠狠色丁香婷婷综合| 国产精品永久免费观看| 2019年精品视频自拍| 91国产丝袜在线播放| 色一情一乱一伦一区二区三区日本| 精品999成人| 97av在线视频| 亚洲第一会所| 日韩欧美国产不卡| 视频三区在线观看| 中文字幕在线不卡一区二区三区| 亚洲高清在线播放| 精品国产乱码久久久久久闺蜜| 青青在线免费观看视频| 美国十次了思思久久精品导航| 国产日韩精品在线播放| 久9re热视频这里只有精品| 国产丝袜一区二区三区| 男人影院在线观看| 欧美性20hd另类| 337p日本| 日本一区二区在线不卡| 欧美日韩在线一| 韩国女主播成人在线观看| 国产丝袜不卡| 爽成人777777婷婷| 国产精品成人va在线观看| 盗摄系列偷拍视频精品tp| 在线视频国产日韩| 超碰aⅴ人人做人人爽欧美| 欧美精品免费视频| 视频一区二区三区不卡| 欧美亚洲丝袜传媒另类| 美女欧美视频在线观看免费 | 91麻豆国产福利在线观看| 正在播放一区| 韩国一区二区三区| 视频一区不卡| 捆绑调教美女网站视频一区| 欧美一级二级三级| 日韩av一二三| 自拍偷拍一区二区三区| 国产麻豆视频一区| 国产欧美123| 懂色中文一区二区在线播放| 免费av手机在线观看| 成人精品电影在线观看| 日韩精品综合在线| 26uuu色噜噜精品一区二区| 国产偷人视频免费| 国产精品色婷婷| 黑巨人与欧美精品一区| 亚洲国产精品一区二区第一页| 久久久精品性| 一区二区精品免费视频| 不卡电影免费在线播放一区| 日韩精品免费播放| 国产精品不卡一区二区三区| 在线观看视频免费| 在线观看亚洲一区| 伊人福利在线| 一本色道久久综合狠狠躁篇怎么玩| 成人免费一区| 国产精品99一区| 在线国产一区| 五月天男人天堂| 日本一区二区免费在线| caoporen人人| 欧美三级在线视频| 性感女国产在线| 中文字幕亚洲欧美日韩高清| 欧美aaaaa级| 99久久精品免费看国产四区| 蜜桃伊人久久| 日本精品一区二区三区四区| 亚洲一区在线观看免费观看电影高清| 香蕉视频免费在线| 亚洲精品一区在线观看| 四虎国产精品永久在线国在线| 欧美影院在线播放| 亚洲精品在线二区| 欧美在线观看视频免费| 国产精品视频在线看| 成人18在线| 日韩亚洲欧美中文高清在线| 99精品视频在线观看播放| 亚洲欧美日韩国产成人综合一二三区 | 国产乱码精品1区2区3区| 日本精品免费在线观看| 亚洲精品乱码久久久久久黑人 | 中文字幕欧美日韩一区二区| 国产亚洲成年网址在线观看| 欧美黄色小说| 亚洲人a成www在线影院| 久久99国内| 欧美成ee人免费视频| 91色porny| 国产二区视频在线观看| 中文字幕日韩欧美在线| 综合一区在线| 国产男女激情视频| 欧美福利视频一区| 国产在线播放精品| 在线码字幕一区| 欧美日韩一区二区三区在线免费观看 | 女人另类性混交zo| 日本韩国欧美三级| 巨大黑人极品videos精品| 俄罗斯精品一区二区| 久久久久久久久久久久久久久99 | 色综合久久九月婷婷色综合| 精品女同一区二区三区在线观看| 91精品国产综合久久久久久久久| 国产成人精品午夜视频免费| 在线播放av网站| 美女精品久久久| 国产日韩亚洲欧美精品| 91九色最新地址| 一本大道香蕉久久| 中文字幕av一区二区三区谷原希美| 久久精品高清| 欧美精品色婷婷五月综合| 欧美一区二区三区在线| 教室别恋欧美无删减版| 精品国产av无码一区二区三区| 欧美日韩高清一区二区不卡| 成人在线免费观看91| 亚洲午夜精品久久久久久人妖| 欧美三级日韩三级国产三级| 香蕉久久精品| 亚洲免费av一区二区三区| 国产视频精品免费播放| 国产日韩欧美在线播放不卡| 在线欧美成人| 日本a级片电影一区二区| av成人免费在线| 一区二区三区四区日本视频| 麻豆传媒一区二区| 色天使久久综合网天天| 欧美日韩xxxx| 美女一区二区三区视频| 日韩中文字幕av| 国产在线播放一区二区三区| 黄色的网站在线观看| 国产精成人品localhost| 天天综合天天综合色| 国产剧情在线观看一区| 国产成人av影视| 按摩亚洲人久久| 99国产精品久久久久久久久久 | 色婷婷精品国产一区二区三区| 亚洲18色成人| 国产成人一区二区三区影院| 欧美18 19xxx| 97超视频免费观看| 亚洲欧美综合色| 婷婷成人综合| 婷婷六月激情| 99精品国产高清一区二区| 欧美专区亚洲专区| 欧美日韩国产高清| 91ph在线| 三级三级久久三级久久18| 精品久久久久久最新网址| 日韩中文字幕av电影| 日本中文字幕中出在线| 亚洲一区美女| 一区二区三区精品99久久 | 亚洲电影av在线| 裸体在线国模精品偷拍| 国产粉嫩在线观看| 中国一级黄色录像| 亚洲一区www| 久久精品夜色噜噜亚洲a∨| 国产精品自在| 女人被爽到呻吟gif动态图下载| 国产精品美女www爽爽爽视频| 色屁屁一区二区| 日韩精品每日更新| 日韩毛片一区| 777永久免费网站国产| 成人免费午夜电影| 91精品国产一区二区三区香蕉| 日本成人在线不卡视频| 欧美日韩在线精品一区二区三区激情综合 | 久久99久久久久久| 操日韩av在线电影| 亚洲日本一区二区三区| 香蕉精品视频在线观看| av电影在线网| 国产资源第一页| 国内精品久久久久影院 日本资源| 亚洲精品免费在线| 亚洲永久在线| 国产亚洲精aa在线看| 国产乱视频在线观看|