Java虛擬機所管理的內存圖:java
1程序計數器:數組
該模塊做用是記錄線程執行字節碼的位置,記錄程序執行狀態,以便該線程下次得到CPU時繼續執行。程序裏的每一個線程程序計數器相互獨立,互不影響,該內存區也稱「線程私有」內存。線程
二、java虛擬機棧:對象
與程序計數器同樣,java虛擬機棧也是「線程私有」,’每一個方法執行的時候進入虛擬機棧,會建立一個棧幀,用於存儲局部變量表,操做棧,動態連接,方法出口等信息,每個方法從調用到執行完成,對應着每個棧幀在虛擬機棧中從入棧到出棧的過程。blog
其中局部變量表包括java基本數據類型以及對象引用類型(reference)、returnAddress類型,該區域在代碼編譯時即肯定佔用內存大小,不會在執行方法中改變。內存
在虛擬機規範中,該區會產生兩種異常,一種是線程請求的棧深度大於虛擬機所容許的深度會拋出StackOverFlowError 異常;當虛擬機動態拓展java虛擬機棧沒有足夠的內存時,會產生OutOfMemoryError異常編譯器
三、本地方法棧虛擬機
本地方法棧跟java虛擬機棧相似,不過java虛擬機棧是爲java方法(java字節碼)服務,本地方法棧是爲Native方法服務,本地方法棧也會拋出StackOverFlowError以及OutOfMemoryError異常。編譯
四、Java堆變量
Java堆是java虛擬機佔用內存最大一塊,全部對象共享該內存區。該區域存放對象,全部實例對象以及數組都在該區域分配內存進行實例化(隨着JTI編譯器的發展與逃逸分析技術的成熟,該說法再也不絕對)
Java堆是垃圾回收的主要區域,該區域實例化時可用是連續的內存區域或者分開的區域,只要邏輯上是連續的便可,若是該區域實例化的時候分配不到內存或成熟OutOfMemoryError異常。
五、方法區
方法區和java堆同樣都是共享區域,用於存儲虛擬機已經加載的類信息、常量、靜態變量以及即時編譯器編譯的代碼數據,雖然java虛擬機規範描述該區爲java堆的邏輯部分,可是該區有一個別名「非堆」,應該區分爲方法區。
六、運行常量池
運行時常量池是方法區的一部分。Class文件中除了有版本、字段、方法、描述等信息,還有一項常量池,用於存儲編譯期生成的各類字面量和符號引用。
七、直接內存