<em id="0a85b"><option id="0a85b"></option></em>

<abbr id="0a85b"></abbr>

      <nobr id="0a85b"></nobr>
        <tr id="0a85b"></tr>
        9久久伊人精品综合,亚洲一区精品视频在线,成 人免费va视频,国产一区二区三区黄网,99国产精品永久免费视频,亚洲毛片多多影院,精品久久久无码人妻中文字幕,无码国产欧美一区二区三区不卡
        學習啦>學習電腦>電腦硬件知識>內存知識>

        java內存溢出如何產生

        時間: 捷鋒774 分享

          Java是由Sun Microsystems公司推出的Java面向對象程序設計語言(以下簡稱Java語言)和Java平臺的總稱。下面是學習啦小編帶來的關于java內存溢出如何產生的內容,歡迎閱讀!

          java內存溢出如何產生:

          java虛擬機規(guī)范規(guī)定的java虛擬機內存其實就是java虛擬機運行時數據區(qū),其架構如下:

          其中方法區(qū)和堆是由所有線程共享的數據區(qū)。

          Java虛擬機棧,本地方法棧和程序計數器是線程隔離的數據區(qū)。

          Java官方定義: http://www.98ki.com/servlet/HomeServlet?method=get&id=53

          Java各內存區(qū)域分析: http://www.98ki.com/servlet/HomeServlet?method=get&id=43

          通過分析各個區(qū)域的內容我們分別寫出各個區(qū)域的內存溢出實例

          堆溢出

          由Java的官方文檔我們可以看出,Java堆中存放:對象、數組。下面以不斷創(chuàng)建對象為例:

          Exception in thread "main"java.lang.OutOfMemoryError: Java heap space

          public class HeapLeak {

          public static void main(String[] args){

          ArrayList list = new ArrayList ();

          while ( true ){

          list.add( new HeapLeak.method()) ;

          }

          }

          static class method{

          }

          }

          棧溢出

          從Java官方API中我們知道,棧中存儲:基本數據類型,對象引用,方法等。下面以無限遞歸創(chuàng)建方法和申請??臻g為例,分別演示棧的stackOverflow和OutOfMemory

          l Exception in thread "main" java.lang.StackOverflowError

          package Memory;

          public class StackLeak {

          public static void main(String[] args){

          method ();

          }

          public static void method (){

          method ();

          }

          }

          l Exception in thread "main"java.lang.OutOfMemoryError: unable to create new native thread

          package Memory;

          public class StackOutOfMemory {

          public static int count = 1;

          public void noStop() {

          while ( true ) {

          }

          }

          public void newThread() {

          while ( true ) {

          Thread t = new Thread( new Runnable() {

          public void run() {

          System. out .println( " 已創(chuàng)建第 " + count +++ " 個線程 " );

          noStop();

          }

          });

          t.start();

          }

          }

          public static void main(String[] args){

          new StackOutOfMemory().newThread();

          }

          }

          Java hotspot虛擬機中一個線程占用內存可通過-Xss設置,而能創(chuàng)建的線程數計算方法為:

          可創(chuàng)建線程數=(物理內存-Os預留內存-堆內存-方法區(qū)內存)/單個線程大小

          在測試的時候這里還有點小插曲,電腦強關了一次,因為把-Xss設置成了2M,內存使用增加到97%左右,操作系統(tǒng)死了,這個進程不斷在創(chuàng)建線程,但是并沒有因為內存不足而停下來,直到電腦完全死掉也沒有報出錯誤信息。最后分析是因為電腦空閑內存還有600M,在線程還沒有創(chuàng)建完的時候,已經開啟的線程太多,在死之前大概能開到200多個,對內存大量消耗,造成系統(tǒng)掛掉。

          這里又出現一個有趣的現象,當線程順序創(chuàng)建到第88個的時候,count跳了很多,并且開始無序,有興趣的可以深入學習一下線程方面的問題,我也會在后面的博客分析這個問題。

          而換成200M的時候,創(chuàng)建第二個線程的時候就報了OutOfMemory.不管Xss設置多少,報錯之后,程序都會一直走下去,執(zhí)行已開線程中的任務。

          常量池溢出

          從Java官方API中我們知道,常量區(qū)代表運行時每個class文件中的常量表。它包括幾種常量:編譯期的數字常量、方法或者域的引用(在運行時解析)。runtime constant pool的功能類似于傳統(tǒng)編程語言的符號表,盡管它包含的數據比典型的符號表要豐富的多。

          下面以不斷添加Stirng為例:

          Exception in thread "main"java.lang.OutOfMemoryError: PermGen space

          常量池在方法區(qū)中,首先設置持久代大小,使其不可擴展。

          然后需要做的就不停地往方法區(qū)中加字符串。其中intern()就是查看方法區(qū)中有沒有這個字符串,沒有的話就加進去,如果這里不用intern(),字符串是存在堆里的,會報heapOutOfMemory.

          這里需要注意的是,在 HotSpot 中,方法區(qū)是在堆的持久代中的。

          package Memory;

          import java.util.ArrayList;

          public class ConstantPoolLeak {

          public static void main(String[] args) {

          int count = 0;

          ArrayList list = new ArrayList ();

          while ( true )

          list.add(String. valueOf (count++).intern()) ;

          }

          }

          方法區(qū)溢出

          從Java官方API中我們知道,方法區(qū)存放每個Class的結構,比如說運行時常量池、域、方法數據、方法體、構造函數、包括類中的專用方法、實例初始化、接口初始化。

          Java的反射和動態(tài)代理可以動態(tài)產生Class,另外第三方的CGLIB可以直接操作字節(jié)碼,也可以動態(tài)產生Class,下面通過CGLIB來演示。

          import java.lang.reflect.Method;

          public class MethodAreaLeak {

          public static void main(String[] args){

          while ( true ){

          Enhancer enhancer = new Enhancer ();

          enhancer.setSuperClass(OOMObject. class );

          enhancer.setUseCache( false );

          enhancer.setCallback( new MethodInterceptor (){

          public Object intercept(Object obj, Method method,Object[] args,

          MethodProxy proxy) throws Throwable{

          return proxy.invokeSuper(obj, args);

          }

          });

          enhancer.create();

          }

          }

          class OOMObject{

          }

          }

          本機直接內存溢出

          Java虛擬機可以通過參數-XX:MaxDirectMemorySize設定本機直接內存可用大小,如果不指定,則默認與java堆內存大小相同。JDK中可以通過反射獲取Unsafe類(Unsafe的getUnsafe()方法只有啟動類加載器Bootstrap才能返回實例)直接操作本機直接內存。通過使用-XX:MaxDirectMemorySize=10M,限制最大可使用的本機直接內存大小為10MB,例子代碼如下

          package Memory;

          import java.lang.reflect.Field;

          public class DirectMemoryOOM {

          private static final int _1MB = 1024 * 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 直接想操作系統(tǒng)申請內存

          unsafe.allocateMemory( _1MB );

          }

          }

          }

          相關閱讀推薦

        看了java內存溢出如何產生文章內容的人還看:

        1.java讀取大文件內存溢出怎么解決

        2.java和多線程cpu

        3.內存溢出和內存泄漏是什么

        4.網絡安全技術的探討論文

        5.iphone怎么擴大內存

        6.JAVA面試題大全及答案

        java內存溢出如何產生

        Java是由Sun Microsystems公司推出的Java面向對象程序設計語言(以下簡稱Java語言)和Java平臺的總稱。下面是學習啦小編帶來的關于java內存溢出如何產生的內容,歡迎閱讀! java內存溢出如何產生: java虛擬機規(guī)范規(guī)定的java虛擬機內存其實
        推薦度:
        點擊下載文檔文檔為doc格式

        精選文章

        • java內存溢出怎么解決
          java內存溢出怎么解決

          Java是一種可以撰寫跨平臺應用程序的面向對象的程序設計語言。下面是學習啦小編帶來的關于java 內存溢出怎么解決的內容,歡迎閱讀! java 內存溢出怎么解

        • itools蘋果4內存怎么清理
          itools蘋果4內存怎么清理

          iPhone 4是結合照相手機、個人數碼助理、媒體播放器以及無線通信設備的掌上設備,i下面是學習啦小編帶來的關于itools蘋果4內存怎么清理的內容,歡迎閱讀

        • ipone6內存夠用嗎
          ipone6內存夠用嗎

          蘋果公司(Apple Inc. )是美國的一家高科技公司。由史蒂夫喬布斯、斯蒂夫沃茲尼亞克和羅韋恩(Ron Wayne)等三人于1976年4月1日創(chuàng)立,下面是學習啦小編帶來的關

        • iphone怎么刪除內存
          iphone怎么刪除內存

          蘋果公司(Apple Inc. )是美國的一家高科技公司。由史蒂夫喬布斯、斯蒂夫沃茲尼亞克和羅韋恩(Ron Wayne)等三人于1976年4月1日創(chuàng)立,下面是學習啦小編帶來的關

        672012 主站蜘蛛池模板: 无套内谢少妇高清毛片| 亚洲不卡av不卡一区二区| freechinese麻豆| 九九热在线视频只有精品| 2021亚洲va在线va天堂va国产| 亚洲一级片一区二区三区| 国产毛片A啊久久久久| 国产熟睡乱子伦视频在线播放| 久久国产免费观看精品3| 亚洲欧洲日产国码久在线| 91综合在线| 韩国三级+mp4| 国产精品福利视频导航| 亚洲精品自拍在线视频| 中文字幕亚洲制服在线看| 国产女高清在线看免费观看| 欧美成人a在线网站| 韩国理伦片年轻邻居2| 一区二区不卡国产精品| 夜夜添无码一区二区三区| 国产av一区二区精品久久凹凸 | 久久日韩精品一区二区五区| 国产精品v片在线观看不卡| 色悠悠成人综合在线视频| 亚洲AV永久无码一区| 少妇乳大丰满在线播放| 少妇撒尿一区二区在线视频| 久久精品国产亚洲欧美| 亚洲国产精品成人综合色| 自拍偷在线精品自拍偷99| 亚洲中文字幕无码专区| 欧美性色欧美a在线播放| 在线午夜精品自拍小视频| 久久精品a亚洲国产v高清不卡| 丰满的已婚女人hd中字| 午夜精品一区二区三区成人| 免费久久人人爽人人爽AV| 国产精品自拍中文字幕| 亚洲精品日韩在线观看| 护士被两个病人伦奷日出白浆| 高潮精品熟妇一区二区三区|