Java虛擬機以內存區域

    小白一枚,最近在看深刻理解java虛擬機2這本書,怕看過以後就忘了,看一節而後寫一片博客消化消化,加深印象與理解。有理解錯誤的地方還望指出。java

    Java虛擬機主要分爲方法區,虛擬機棧,本地方法棧,程序計數器,堆。其中方法區與堆是線程共享區域;虛擬機棧,本地方法棧,程序計數器是線程私有區域。算法

    方法區主要存放加載的類信息,常量,靜態常量,即時編譯器編譯後的代碼等,也有人稱之爲永久代,兩者並不是同樣,或者說是HotSpot虛擬機用永久代實現了虛擬機的方法區,爲了方便HotSpot垃圾收集器能夠向管理java堆同樣去管理這塊區域。線程

    虛擬機棧是線程私有的,在java方法執行的時候會建立一個棧幀,用來存放局部變量表,動態連接,操做數棧,方法出口等信息。其中局部變量表存放8個基本數據類型與對象的引用。64位長度的long類型與double會佔用2個局部變量空間,其他的佔用1個。在編譯期間,方法須要分配的局部變量空間是肯定的。對象

    本地方法棧與虛擬機棧很是相似,只不過虛擬機棧是爲java方法服務,本地方法棧是爲Native方法服務。編譯器

    程序計數器是線程私有的,用來記錄當前線程正在執行的虛擬機字節碼指令地址,若是正在執行Native方法,計數器值則爲undefined。博客

    堆是虛擬機所管理的最大區域,全部的線程共享,用來存放對象實例。如今的垃圾收集器基本採用了分代收集算法,還能夠細分新生代和老年代,其中新生代還能夠細分爲Eden,From Survivor, To Survivor三個區域。虛擬機提供了-XX:PretenureSizeThreshold參數,能夠設置當對象佔用空間的大小超過這個值,將直接在老年代建立,避免來回複製。虛擬機

相關文章
相關標籤/搜索