JVM-基礎概念(1)

JVM的做用

形象解釋:算法

它是一個虛構出來的計算機,是經過在實際的計算機上仿真模擬各類計算機功能來實現的。Java虛擬機包括一套字節碼指令集、一組寄存器、一個棧、一個垃圾回收堆和一個存儲方法域。數據庫

執行的時候是將 字節碼解釋成具體平臺上的機器指令執行,所以這樣就屏蔽了系統的自己的差別,作到了「一次編寫,處處運行」,其實就是在jvm上運行。緩存

JVM的內存區域

 jvm區域整體分兩類,heap區和非heap區。heap區又分:Eden Space(伊甸園)、Survivor Space(倖存者區)、Tenured Gen(老年代-養老區)。 非heap區又分:Code Cache(代碼緩存區)、Perm Gen(永久代)、Jvm Stack(Java虛擬機棧)、Local Method Statck(本地方法棧)。(注意永久區和老年區的區分)jvm

perm(永久代):存放的是類和方法的定義,是不會改變的。spa

tenure(老年代): 生命裏特別旺盛的對象,對象都是存在heap中的。剛來的對象都活躍在伊甸區,而後繼續使用的會移動到倖存區,而後就是生命力旺盛的對象,會生活在老年區,總體來講都是存在heap中的。對象

JVM的誕生

能夠不可讓一部分高手寫出完善的內存管理模塊,再加上一堆各式各樣的類庫和標準,最後構成一個龐大的運行時?這一想法被無數語言團隊採用.生命週期

int i = 5; 在C語言裏,這句話申請了幾個字節的內存,而後放了個5進去,Java也是這麼搞的。只不過,C語言裏申請了之後要本身管理,而Java你不用本身煩惱這個事情,虛擬機會幫你處理。它會判斷什麼時候須要,什麼時候不須要。內存

更加複雜的業務,好比鏈接數據庫,讀取文件,咱們要作的只是調用類庫而已,內存申請和釋放都由虛擬機全盤接管虛擬機

所以虛擬機就頭疼了。這麼多對象,何時該銷燬,何時該保持,何時要檢查這些關係呢?在JVM裏,這個事情有一個模塊來作,也就是咱們這片文章的主角,GC,Garbage Collection,垃圾回收。it

gc負責負責分配內存,負責控制對象的持有計數,負責銷燬內存對象,還得負責內存整理什麼的

JVM分類

現有的JVM,主流的,分別是HotSpot和JRockit,主要研究對象也是這兩個。這篇文章裏,咱們只研究HotSpot,也就是所謂的Sun JVM,Sun的GC方式主要有CMS和G1兩種。這裏討論GMS(CMS,全稱Concurrent Low Pause Collector)

分代思想:JVM在程序運行過程中,會建立大量的對象,這些對象,大部分是短週期的對象,小部分是長週期的對象,對於短週期的對象,須要頻繁地進行垃圾回收以保證無用對象儘早被釋放掉,對於長週期對象,則不須要頻率垃圾回收以確保無謂地垃圾掃描檢測。爲解決這種矛盾,Sun JVM的內存管理採用分代的策略

  1. 年輕代(Young Gen):年輕代主要存放新建立的對象,內存大小相對會比較小,垃圾回收會比較頻繁,年輕代分紅1個Eden Space和2個Suvivor Space
  2. 年老代(Tenured Gen):年老代主要存放JVM認爲生命週期比較長的對象(通過幾回的Young Gen的垃圾回收後仍然存在),內存大小相對會比較大,垃圾回收也相對沒有那麼頻繁(譬如可能幾個小時一次)
  3. 持久代(Perm Gen):持久代主要存放類定義、字節碼和常量等不多會變動的信息

分區的目的:新生區因爲對象產生的比較多而且大都是朝生夕滅的,因此直接採用標記-清理算法。而養老區生命力很強,則採用複製算法,針對不一樣狀況使用不一樣算法

總結:Jvm區域整體分兩類,heap區和非heap區。heap區又分:Eden Space(伊甸園)、Survivor Space(倖存者區)、Tenured Gen(老年代-養老區)

相關文章
相關標籤/搜索