Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 開發入門 >> JDK8中JVM堆內存劃分

JDK8中JVM堆內存劃分

編輯:開發入門

一:JVM中內存

JVM中內存通常劃分為兩個部分,分別為堆內存與棧內存,棧內存主要用執行線程方法

存放本地臨時變量與線程中方法執行時候需要的引用對象地址。JVM所有的對象信息都

存放在堆內存中,相比棧內存,堆內存可以所大的多,所以JVM一直通過對堆內存劃分

不同的功能區塊實現對堆內存中對象管理。

堆內存不夠最常見的錯誤就是OOM(OutOfMemoryError)

棧內存溢出最常見的錯誤就是StackOverflowError,程序有遞歸調用時候最容易發生

 

二:堆內存劃分

在JDK7以及其前期的JDK版本中,堆內存通常被分為三塊區域Nursery內存(young 

generation)、長時內存(old generation)、永久內存(Permanent Generation for 

VM Matedata),顯示如下圖:


其中最上一層是Nursery內存,一個對象被創建以後首先被放到Nursery中的Eden內

存中,如果存活期超兩個Survivor之後就會被轉移到長時內存中(Old Generation)中

永久內存中存放著對象的方法、變量等元數據信息。通過如果永久內存不夠,我們

就會得到如下錯誤:

Java.lang.OutOfMemoryError: PermGen

而在JDK8中情況發生了明顯的變化,就是一般情況下你都不會得到這個錯誤,原因

在於JDK8中把存放元數據中的永久內存從堆內存中移到了本地內存(native memory)

中,JDK8中JVM堆內存結構就變成了如下:


這樣永久內存就不再占用堆內存,它可以通過自動增長來避免JDK7以及前期版本中

常見的永久內存錯誤(Java.lang.OutOfMemoryError: PermGen),也許這個就是你的

JDK升級到JDK8的理由之一吧。當然JDK8也提供了一個新的設置Matespace內存

大小的參數,通過這個參數可以設置Matespace內存大小,這樣我們可以根據自己

項目的實際情況,避免過度浪費本地內存,達到有效利用。


-XX:MaxMetASPaceSize=128m 設置最大的元內存空間128兆


注意:如果不設置JVM將會根據一定的策略自動增加本地元內存空間。

如果你設置的元內存空間過小,你的應用程序可能得到以下錯誤:

Java.lang.OutOfMemoryError: Metadata space

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved