程序計數器:java
存放下一條要運行的指令;每一個線程都必須用一個獨立的程序計數器,用於記錄下一條要運行的指令。程序計數器是一塊線程私有的內存空間。數組
JAVA虛擬機棧:數據結構
線程私有的內存空間,它保存方法的局部變量,部分返回結果,並參與方法的調用和返回。虛擬機棧在運行的時候使用一種叫作棧幀的數據結構保存上下文數據。在棧幀中,存放了方法的局部變量表、操做數棧、動態鏈接方法和返回地址等信息。每一個方法的調用都伴隨着棧幀的入棧操做,每一個方法的返回都伴隨着棧幀的出棧操做。線程
本地方法棧:管理本地方法的調用。和虛擬機同樣,它也會拋出StackOverFlowErrow和OutOfMemoryError。對象
java堆:blog
幾乎全部的對象和數組都是在堆中分配空間的,堆是線程共享的。堆分爲新生代和老年代兩部分,新生代用於存放剛剛產生的對象和年輕的對象,新生代又能夠細分爲eden,s0和s1區。eden表示對象的出生地,大部分剛剛出生的對象會存放在這裏,s0和s1區空間,稱爲倖存者,其中存放的對象至少經歷了一次垃圾回收,並得以倖存。若是在倖存區的對象到了指定年齡尚未被回收,則有機會進入老年代。內存
方法區:虛擬機
被JVM全部線程共享。方法區也稱爲永久區,主要存放常量和類的定義信息。方法區中最爲重要的是類的類型信息,常量池,域信息,方法信息。類的類型信息包括類的完整名稱,父類的完整名稱,類型修飾符等;常量池包括這個類方法引用的常量信息;域信息包括域名稱、域類型和域修飾符;方法信息包括方法名,返回類型、方法參數、方法修飾符。域名
對永久代的回收,主要從兩個方面分析:1是GC對永久區常量池的回收;2是永久區對類元數據的回收。變量
1是GC對永久區常量池的回收:常量池中的常量沒有被任何地方應用,就能夠被回收。
2是永久區對類元數據的回收:若系統中動態的生成大量類,可能會致使方法區溢出。JVM要確認一個類信息是否被回收,基本條件有:全部該類的實例被回收,且裝載該類的ClassLoader被回收。