真正學(xué)做網(wǎng)站要多久北京seo優(yōu)化排名
1、jvm由本地方法棧、虛擬機(jī)棧、方法區(qū)、程序計(jì)數(shù)器、堆組成,其中堆和方法區(qū)是線程間共享的,程序計(jì)數(shù)器、虛擬機(jī)棧和本地方法棧是線程私有的。
2、虛擬機(jī)棧:
保存每個(gè)java方法的調(diào)用、保存局部變量表、等
??赡艹霈F(xiàn)內(nèi)存溢出,如果出現(xiàn)調(diào)用方法死循環(huán),會(huì)出現(xiàn)棧溢出,stackoverflow。
3、oom和stackOverflow
OOM是內(nèi)存溢出,內(nèi)存不足線程太多導(dǎo)致的。
stackoverflow是棧溢出,調(diào)用的方法太深了會(huì)這樣,可能是調(diào)用出現(xiàn)了死循環(huán)。
4、本地方法棧
用于保存Java調(diào)用native方法的,native就是非java代碼實(shí)現(xiàn)的方法。
5、堆
5.1 所有類的對象和數(shù)組分配內(nèi)存的地方。
5.2 各個(gè)線程之間貢獻(xiàn)
5.3 堆中放的是對象,棧幀中放的是對象的地址,也就是內(nèi)存引用。
5.4 方法結(jié)束后,堆中的對象會(huì)等到垃圾回收時(shí)被移除。
5.5 堆中分為新生代和老年代
新生代分為eden和survivor(s0/from、s1/to)
新生代的gc叫young gc/minor gc
老年代的gc叫major gc/full gc
6、TLAB
thread local allocation buffer
堆中有一部分是用來放線程私有的,在eden區(qū),線程本地分配緩存區(qū)。
那threadLocal放在堆里,threadLocal的key是弱引用,但是value不是,在使用完后需要remove,不然會(huì)引起內(nèi)存泄漏。
7、方法區(qū)(線程共享)
7.1 存儲(chǔ)了每個(gè)類的結(jié)構(gòu)信息、類型信息、常量、靜態(tài)變量等等。
7.2 運(yùn)行時(shí)常量池放在方法區(qū)中
JDK6、JDK7 時(shí),方法區(qū) 就是 PermGen(永久代)。
JDK8 時(shí),方法區(qū)就是 Metaspace(元空間)
垃圾回收
會(huì)考,不好記
哪些可以作為GC ROOT
1、虛擬機(jī)棧中的對象引用
2、本地方法棧中的本地方法對象的引用
3、方法區(qū)中引用數(shù)據(jù)類型的靜態(tài)變量
4、方法區(qū)中常量對象的引用
5、被synchronized持有的對象引用
1、垃圾回收時(shí)的對象存活判斷
1.1 引用計(jì)數(shù)法
每個(gè)對象保存一個(gè)引用計(jì)數(shù)器,記錄對象被引用的次數(shù)
缺點(diǎn)是無法發(fā)現(xiàn)循環(huán)引用
1.2 可達(dá)性分析
以GC ROOT為起點(diǎn),按照從上到下所有被連接的對象是否可達(dá),沒連接上的就會(huì)被回收。
GCRoot可以簡單記成 虛擬機(jī)棧和方法棧里對象的引用以及方法區(qū)中靜態(tài)變量和常量對象的引用,或者是synchronized的對象引用
1、標(biāo)記-清除算法
第一步標(biāo)記,用根可達(dá)性分析,標(biāo)記處被引用的對象
第二部清除,清除沒有被標(biāo)記的
缺點(diǎn)是會(huì)造成內(nèi)存碎片,可用內(nèi)存不連續(xù)。
2、復(fù)制算法
將內(nèi)存分成兩塊,每次只使用其中一塊,垃圾回收的時(shí)候把s0的存活對象復(fù)制到s1上,再清空s0。
3、標(biāo)記-壓縮算法
標(biāo)記-清除-壓縮:將存活的對象都移動(dòng)到一塊。
4、分代收集算法
是目前大部分jvm垃圾回收使用的算法,將內(nèi)存分成老年代和新生代,老年代使用標(biāo)記整理算法,新生代使用復(fù)制算法。
垃圾回收器
垃圾回收器
1.8默認(rèn)的是 UseParallelGC
ParallelGC 默認(rèn)的是 Parallel Scavenge(新生代)+ Parallel Old(老年代)
1、serial收集器:串行回收
使用的是復(fù)制算法 新生代的垃圾回收器
2、serial Old收集器:串行回收
老年代的
垃圾回收器 | 使用的算法 | 作用在 | |
---|---|---|---|
serial收集器 | 串行回收 | 復(fù)制算法 | 新生代的垃圾回收器 |
serial Old收集器 | 串行回收 | 標(biāo)記-壓縮算法 | 老年代的 |
parNew | 并行 | 復(fù)制算法 | 新生代 |
Parallel Scavenge | 并行 | 復(fù)制 | 新生代 |
Parallel Old | 并行 | 標(biāo)記-壓縮 | 老年代 |
CMS | 并發(fā) | 標(biāo)記清除 | 老年代 |
G1 | 并發(fā) 并行 | 復(fù)制算法 標(biāo)記-壓縮 | 老年代、新生代 |
ZGC | 并發(fā) | 標(biāo)記-復(fù)制 | 老年代 |
CMS:初始標(biāo)記(STW)-并發(fā)標(biāo)記-重新標(biāo)記-并發(fā)清除
停頓時(shí)間短
G1:將內(nèi)存分成邏輯層面的region區(qū)域,屬于分代垃圾回收器,區(qū)分老年代和新生代,region之間是復(fù)制算法,總體看是標(biāo)記-壓縮算法,可以避免內(nèi)存碎片,
垃圾回收過程:新生代GC-老年代并發(fā)標(biāo)記-混合回收
新生代GC:根可達(dá)性分析,存活對象從eden區(qū)復(fù)制到survivor區(qū)
老年代并發(fā)標(biāo)記:在整個(gè)堆進(jìn)行并發(fā)標(biāo)記,回收完全為垃圾的老年代region,標(biāo)記部分為垃圾的老年代region
混合回收:回收整個(gè)新生代,回收一部分老年代,按垃圾比例回收老年代的。
jdk1.8垃圾回收過程:
young GC:eden區(qū)滿了就開始垃圾回收,將eden區(qū)存活的對象放到s0/s1區(qū),每存活一次年齡+1,超過15就進(jìn)老年代。