java虛擬機內存管理圖以下圖所示:java
1.線程共享區,是全部的線程所共用的,線程共享區有一下幾個組成:優化
1.方法區:線程
1.運行時常量池,已經被虛擬機加載的類信息(1.類的版本信息,2.字段,3.方法,4.接口等),常量,靜態變量,即時編譯器編譯後的代碼等數據。對象
2.垃圾回收器也會光顧這個區域,例如常量池。blog
3.HotSpot中用方法區來實現永久代。這樣的作的好處就是,垃圾回收器能夠像管理java堆同樣管理這部份內存,省去了爲方法區編寫內存管理的工做,注意的是這接口
僅僅限於HotSpot中,其餘的虛擬機並無永久代這個概念,虛擬機規範中,永久代不等於方法區,並且沒有進行詳細的規範說明。用方法區實現永久代並非一個很好的途徑內存
HotSpot在JDK1.7中進行的改進。get
2.java堆:編譯器
1.存儲對象實例,能夠人做爲全部對象的實例存儲在這裏,涉及編譯優化和虛擬機優化的時候有些對象實例並不存儲在這裏。虛擬機
2.垃圾收集器管理的主要區域。
3.長時間存活的對象實例會被放入老年代去,不長期存活的會在新生代中。
4.當對空間申請完後會拋出OutOfMemory的內存溢出異常。
2.線程獨佔區,是每個線程都有本身獨立的虛擬機棧,本地方法棧,程序計數器。
1.虛擬機棧:存儲方法運行時所需的數據,成爲棧幀。
1.虛擬機棧描述的是java方法執行的動態內存模型。
2.棧幀:每一個方法的執行都會建立一個棧幀,伴隨着方法從建立到執行完成。用於存儲局部變量表,操做數棧,動態鏈接,方法出口等。
3.局部變量表:
1.存放編譯期可知的各類變量類型,引用類型,returnAddress類型。
2.局部變量表的內存空間在編譯期完成分配,當進入一個方法時,這個方法須要在幀分配多少內存是固定的,方法運行期間不會改變局部變量表的大小。
4.大小:虛擬機棧的空間是有限的。舉個例子。以下面代碼: