天天看點

JVM系列:一、JVM組成及記憶體配置設定

Java與C++之間有一堵由記憶體動态配置設定和垃圾收集技術所圍成的高牆,牆外面的人想進去,牆裡面的人想出來。
JVM系列:一、JVM組成及記憶體配置設定

Java虛拟機

其中方法區和堆是所有線程共享;虛拟機棧、本地方法棧和程式計數器是各線程獨立的。

一、運作時資料區

  1. 程式計數器:用于目前線程中訓示所執行到的位置。位元組碼解釋器就是通過這個值來決定下一個指令。而在多線程中,處理器切換線程時需要知道目前線程執行到的位置,是以程式計數器的存儲是各線程獨立的。
  2. Java虛拟機棧:也是每個線程獨享的,生命周期與線程相同。每個方法執行的時候都會建立一個棧幀,用于存儲局部變量表、操作棧、動态連結、方法出口等資訊。
  3. 本地方法棧:與Java虛拟機棧作用相似,差別是Java虛拟機棧是為Java方法服務,而本地方法棧是為Native方法服務。
  4. Java堆:是所有線程共享的,在虛拟機啟動時建立。幾乎所有的對象執行個體都在堆中配置設定,Java堆也是垃圾收集器管理的主要區域。
  5. 方法區:同樣是各線程共享的記憶體區域,用于存儲已被虛拟機加載的類資訊、常量、靜态變量、即時編譯器編譯後的代碼等資料。垃圾收集在這個區域是比較少出現的,具體看各個虛拟機的實作。

二、堆的分區機制

        程式運作中,建立的對象比較多時,堆記憶體中的對象就會比較多,這時就需要垃圾回收(GC)來防止記憶體溢出。如果GC依次判斷各對象是否需要回收那效率就太低了,是以JVM對堆記憶體采用了分區管理的機制。

堆記憶體分為下面三個區域:

  1. Young Generation Space新生代(新生代又分為三部分)
·Eden Space
·0 Survivor Space(S0)
·1 Survivor Space(S1)
  1. Tenure Generation Space舊生代
  2. Permanent Space持久代(方法區)(方法區實體上存在堆中,邏輯上和堆是獨立的)
JVM系列:一、JVM組成及記憶體配置設定