JVM常谈
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
下面羅列了JVM的常見概念,本文只作概述性的記錄。
JVM 種類: Oralce-Sun Hotspot, Oralce JRockit, IBM J9, 其他; 對JVM歷史感興趣就狂點(diǎn)這里
JVM 內(nèi)存管理-運(yùn)行時(shí)數(shù)據(jù)區(qū):
?? ?堆,方法區(qū),Java棧,本地方法棧,PC(程序計(jì)數(shù)器/寄存器)
?? ?
?? ?堆,方法區(qū) 是程序共享的內(nèi)存區(qū)域,不是線程安全的;
?? ?Java棧,本地方法棧,PC(程序計(jì)數(shù)器/寄存器) 是線程私有的,對,是線程安全的;
?? ?
?? ?堆的劃分
?? ??? ?1. 年輕代-Young Generation(Eden+From/Survive1+To/Survive2) //對象朝生暮死,98%都會(huì)很快死掉
?? ??? ?2. 年老代-Tenured/Old Generation?? ?//對象存活時(shí)間長
??? 堆:所有對象,數(shù)組存放于此
?? ?方法區(qū):類的信息和常量信息
?? ?Java棧:程序每啟動(dòng)一個(gè)線程,VM都會(huì)分配一個(gè)基于棧的數(shù)據(jù)結(jié)構(gòu)的Java棧(或者叫做虛擬機(jī)棧),羅嗦一下,Java棧是一片內(nèi)存區(qū)域;
?? ??? ? Java棧由棧幀組成,方法的調(diào)用意味著棧幀的入棧和出棧;棧幀又可劃分為局部變量區(qū),操作數(shù)棧和棧數(shù)據(jù)區(qū);
?? ??? ? 局部變量區(qū)保存了方法調(diào)用時(shí)傳入的參數(shù),局部變量,返回值等信息;
?? ??? ? 操作數(shù)棧是程序計(jì)算的地方,通過字節(jié)碼和操作數(shù)來完成計(jì)算;
?? ??? ? 棧數(shù)據(jù)區(qū)保存方法返回和異常處理等信息;
?? ?本地方法棧:與java棧類似,主要用于JVM調(diào)用native方法時(shí)使用;
?? ?PC:較小的內(nèi)存空間,當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器;每條線程都有一條獨(dú)立的PC;
對象在內(nèi)存中的分配:
?? ?1. 對象首先分配到年輕代(Young Generation)
?? ?2. 大對象(大字符串,大數(shù)組)直接分配到年老代(Tenured/Old Generation)
?? ?3. 對象年齡 //TODO
?? ?4. 動(dòng)態(tài)判斷
?? ?5. 分配擔(dān)保
GC:Garbage Collection
GC主要針對堆的內(nèi)存回收,不同JVM實(shí)現(xiàn)可能也會(huì)對方法區(qū)進(jìn)行回收。
1. 判斷對象存活
?? ?1.1 引用計(jì)數(shù)算法?? //Reference Counting, 存在循環(huán)引用的問題
?? ?1.2 根搜索算法 ?? ? //Root Tracing, Reference Chain, 由此引出根對象/對象鏈的概念
?? ?1.3 什么樣的對象可以作為根對象??
?? ??? ?1.3.1 虛擬機(jī)棧(棧幀中的本地變量表)中的引用對象
?? ??? ?1.3.2 方法區(qū)中的類靜態(tài)屬性引用的對象
?? ??? ?1.3.3 方法區(qū)中的常量引用的對象
?? ??? ?1.3.4 本地方法棧中JNI的引用對象
?? ?
2. 對象回收算法
?? ?2.1 標(biāo)記-清除算法?? ?//Mark-Sweep ,容易產(chǎn)生內(nèi)存碎片
?? ?2.2 復(fù)制算法?? ??? ??? //Coping ,如果存活的對象多了,那么復(fù)制這些對象就需要很大的代價(jià)
?? ?2.3 標(biāo)記-整理算法?? ?//Mark-Compact,解決了內(nèi)存碎片的問題
?? ?2.4 分代回收算法 ?? ?//根據(jù)不同的(內(nèi)存)代,采用上述3種算法
?? ?一般年輕代存活下來的對象很少,適合使用復(fù)制算法;而年老代里的對象多且存活時(shí)間長,適合使用另外兩種算法。
?? ?
3. Hotspot 垃圾回收器種類
?? ?3.1 Young Generation 使用的垃圾回收器
?? ??? ?3.1.1 Serial回收器 ?? ??? ??? ??? ?//單線程,復(fù)制算法
?? ??? ?3.1.2 ParNew回收器 ?? ??? ??? ??? ?//多線程,復(fù)制算法
?? ??? ?3.1.3 Parallel Scavenge回收器 ? //多線程,復(fù)制算法,自適應(yīng)特點(diǎn)
?? ?3.2 Tenured Generation 使用的垃圾回收器
?? ??? ?3.2.1 Serial Old回收器?? ??? ??? ?//單線程,標(biāo)記-整理算法
?? ??? ?3.2.2 Parallel Old回收器?? ??? ? //多線程,標(biāo)記-整理算法
?? ??? ?3.2.3 CMS(Concurrent Mark-Sweep) //多線程,標(biāo)記-清除算法
?? ?3.3 G1(Garbage First)回收器 ??? ? //把內(nèi)存劃分為多個(gè)區(qū)域,跟蹤每個(gè)區(qū)域,根據(jù)不用區(qū)域內(nèi)存的使用情況進(jìn)行回收。
Sun JDK1.6 GC:
上圖中的"?"跨了兩代內(nèi)存區(qū),是將被引入到JDK7的G1收集器。
Reference:
?? ?圖書:《深入Java虛擬機(jī)》《深入理解Java虛擬機(jī)》 ???
?? ?JVM內(nèi)存管理:深入Java內(nèi)存區(qū)域與OOM ??? ????
?? ?JVM內(nèi)存管理:深入垃圾收集器與內(nèi)存分配策略??
?? ?還有一篇不錯(cuò)的帖子
轉(zhuǎn)載于:https://my.oschina.net/placeholder/blog/116005
總結(jié)
- 上一篇: SQL Server死锁
- 下一篇: atomikos log alrea