無論任何語言,只要能編譯成.class文件,就可以被Java虛擬機(jī)識(shí)別和執(zhí)行
一,虛擬機(jī)內(nèi)存區(qū)域劃分
1,程序計(jì)數(shù)器
為了保證程序能夠有序的執(zhí)行下去,處理器必須要具有某些手段來確定下一條指令的地址,程序計(jì)數(shù)器就是這樣的作用。
由于Java虛擬機(jī)的多線程是通過輪流分配和切換處理器執(zhí)行時(shí)間來實(shí)現(xiàn)的,為了能夠在線程切換之后恢復(fù)到正確的執(zhí)行位置,每個(gè)線程都有一個(gè)獨(dú)立的程序計(jì)數(shù)器
2,Java虛擬機(jī)棧
每一個(gè)Java虛擬機(jī)線程都有一個(gè)虛擬機(jī)棧,保存Java方法的調(diào)用狀態(tài),包括局部變量,參數(shù),返回值等
3,堆內(nèi)存
所有線程共享的內(nèi)存區(qū)域
4,方法區(qū)
所有線程共享的內(nèi)存區(qū)域,保持已經(jīng)被虛擬機(jī)加載的類的結(jié)構(gòu)信息,運(yùn)行時(shí)常量,字段和方法信息
5,本地方法棧
用來支持Native方法的
二,引用的類型
1,強(qiáng)引用
new創(chuàng)建的引用關(guān)系,如果一個(gè)對(duì)象具有強(qiáng)引用,虛擬機(jī)不會(huì)回收該對(duì)象,即使虛擬機(jī)拋出outofmemoryerror
2,軟引用
如果一個(gè)對(duì)象具有軟引用,那么當(dāng)虛擬機(jī)內(nèi)存不足的時(shí)候,就會(huì)回收該對(duì)象
3,弱引用
如果一個(gè)對(duì)象具有軟引用,那么當(dāng)虛擬機(jī)進(jìn)行垃圾回收的時(shí)候,就會(huì)回收該對(duì)象
4,虛引用
如果一個(gè)對(duì)象具有軟引用,那么當(dāng)被虛擬機(jī)回收的時(shí)候,會(huì)收到一個(gè)被對(duì)象被回收的通知
三,垃圾回收機(jī)制
四,垃圾回收算法
1,標(biāo)記-清除算法
標(biāo)記可以回收的內(nèi)存地址,當(dāng)虛擬機(jī)進(jìn)行垃圾回收的時(shí)候,回收標(biāo)記的對(duì)象即可
缺點(diǎn)是回收后會(huì)產(chǎn)生大量的不連續(xù)內(nèi)存空間,可能導(dǎo)致后續(xù)大對(duì)象分配內(nèi)存的時(shí)候,沒有連續(xù)的內(nèi)存空間,提前觸發(fā)垃圾回收,降低了效率
2,復(fù)制算法
為了解決標(biāo)記清除算法的缺點(diǎn)
將內(nèi)存區(qū)域劃分為相同的倆塊,當(dāng)進(jìn)行垃圾回收的時(shí)候,將可用的對(duì)象復(fù)制到另一塊,回收當(dāng)前區(qū)域的所有內(nèi)存,不存在內(nèi)存碎片問題
缺點(diǎn):復(fù)制算法的效率和存活的對(duì)象數(shù)量由關(guān)系,當(dāng)存活的對(duì)象較少的時(shí)候,效率很高
3,標(biāo)記-壓縮算法
和標(biāo)記-清除算法不同的是將所有存活的對(duì)象移動(dòng)到一邊,回收剩余的所有空間,解決了碎片化問題
4,分代收集算法
結(jié)合不同的垃圾收集算法處理不同空間的內(nèi)存
新生代:復(fù)制算法
老年代:標(biāo)記-清除或壓縮算法
五,早期的垃圾回收算法
1,引用標(biāo)記算法
給對(duì)象加一個(gè)引用計(jì)數(shù)器,每有一個(gè)地方引用它的時(shí)候,引用計(jì)數(shù)就加一。當(dāng)引用失效的時(shí)候,計(jì)數(shù)器值就減一;任何對(duì)象的引用計(jì)數(shù)為0的對(duì)象就不可能被使用
引用計(jì)數(shù)算法,實(shí)現(xiàn)簡單,判定的效率也很高,大部分情況下都是不錯(cuò)的算法。但是無法解決對(duì)象之間互相循環(huán)引用的情況
2,根搜索算法
基本思路就是通過一系列的名為“GC Root”的對(duì)象作為起始點(diǎn),從這些節(jié)點(diǎn)向下搜索,搜索走過的路徑稱為引用鏈(Reference chain),當(dāng)一個(gè)對(duì)象到GC Root沒有任何引用鏈相連(用圖論的方法就是GC Root到這個(gè)對(duì)象不可達(dá)),則證明這個(gè)對(duì)象是不可用的
在Java語言里,可作為GC Root的對(duì)象包括下面幾種:
- 虛擬機(jī)棧(棧幀的本地變量表)中引用的對(duì)象
- 方法區(qū)中的類靜態(tài)屬性引用的對(duì)象
- 方法區(qū)中常量引用的對(duì)象
- 本地方法棧中JNI(即一般的native方法)的引用的對(duì)象