編輯:開發入門
一: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
使用小部件的樣例應用程序現在我們要修改現有應用程序,使其像圖 8 中所示的那樣。本例的目的在於讓讀者熟悉在真實應用程序中對 textVIEw、editText
大家好,我是一個android的初學者,現把在極地星空學習的一些學習筆記發上來,我們共同學習一下。望對初學者的你我有所幫助。android學習有一段時間了,從今天開始,
跨進程訪問(AIDL服務)android系統中的進程之間不能共享內存,因此,需要提供一些機制在不同進程之間進行數據通信。我們知道4個Android應用程序組件中的3個(
public class DraftTest extends Activity { /** Called when the activity