JVM總結-內存區域

運行時數據區

JVM在運行java程序的時候會把管理的內存劃分爲若干個不一樣的數據區域。java

  1. 線程共享的數據區域

  • 方法區:

        用於存儲已被JVM加載的類變量、常量、靜態變量、即時編譯器編譯出的代碼等。spa

        (有人將方法區稱爲永久代是由於有一些虛擬機把GC分代手機擴展到方法區,使用永久代來管理方法區。這樣垃圾收集器能夠像管理堆同樣管理這部份內存,不須要再專門爲方法區編寫內存管理代碼,原則上講實現虛擬機方法區屬於實現細節,不該受規範約束,但使用永久代方法實現方法區,更容易遇到內存溢出的問題)線程

內存回收:這一區域的內存回收主要集中在常量池和對類型卸載。對象

  • 運行時常量:

        Class文件中除了類的版本,字段、方法、接口等描述信息外,還有就是常量池,用於存放編譯器生成的各類字面量和符號引用。這部分在類加載後放進運行時常量池中。接口

  • 堆: 

    是虛擬機所管理內存的最大一塊,惟一的目的就是存放對象實例,是垃圾收集器管理的主要區域。內存

JVM規定,Java堆能夠處於物理上不連續的內存空間,只要邏輯上是連續的便可。編譯器

 

  1. 線程隔離的數據區域

  • 虛擬機棧:

        描述Java方法執行的內存模式,每一個方法執行的同時會建立一個棧幀,用於存儲局部變量表、操做數棧、動態連接、方法出口等信息,每一個方法從調用直至完成的過程當中都對應着一個棧幀在虛擬機棧中從入棧到出棧的過程。虛擬機

  • 程序計數器:

       能夠看作當前線程所執行的字節碼行號指令。經過改變這個計數器的值來選取下一條須要執行的字節碼指令。內存管理

        各個線程之間的計數器獨立存儲互不影響。編譯

  • 本地方法棧:

        爲虛擬機使用到的Native方法服務,與虛擬機棧發揮的功能相似。(有些虛擬機將本地方法棧和虛擬機棧合二爲一)

直接內存:

並非虛擬機運行時數據區域的一部分,也不是JVM規範定義中得內存區域。也會出現OutOfMemoryError異常。

總結自《深刻理解JVM》

相關文章
相關標籤/搜索