2019-07-28-Java虛擬機(jī)相關(guān)知識(shí)點(diǎn)簡單總結(jié)

無論任何語言,只要能編譯成.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ì)象
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、運(yùn)行時(shí)數(shù)據(jù)區(qū)域 Java虛擬機(jī)管理的內(nèi)存包括幾個(gè)運(yùn)行時(shí)數(shù)據(jù)內(nèi)存:方法區(qū)、虛擬機(jī)棧、本地方法棧、堆、程序計(jì)數(shù)器,...
    luhanlin閱讀 609評(píng)論 0 0
  • 第二部分 自動(dòng)內(nèi)存管理機(jī)制 第二章 java內(nèi)存異常與內(nèi)存溢出異常 運(yùn)行數(shù)據(jù)區(qū)域 程序計(jì)數(shù)器:當(dāng)前線程所執(zhí)行的字節(jié)...
    小明oh閱讀 1,282評(píng)論 0 2
  • 一、運(yùn)行時(shí)數(shù)據(jù)區(qū)域 Java虛擬機(jī)管理的內(nèi)存包括幾個(gè)運(yùn)行時(shí)數(shù)據(jù)內(nèi)存:方法區(qū)、虛擬機(jī)棧、本地方法棧、堆、程序計(jì)數(shù)器,...
    加油小杜閱讀 1,588評(píng)論 1 15
  • 《深入理解Java虛擬機(jī)》筆記_第一遍 先取看完這本書(JVM)后必須掌握的部分。 第一部分 走近 Java 從傳...
    xiaogmail閱讀 5,473評(píng)論 1 34
  • 1.1 概述 Java優(yōu)點(diǎn): 1、結(jié)構(gòu)嚴(yán)謹(jǐn),面向?qū)ο?2、擺脫硬件平臺(tái)束縛,實(shí)現(xiàn)了“一次編寫,到處運(yùn)行”的理想; ...
    viciyforever閱讀 1,328評(píng)論 1 9

友情鏈接更多精彩內(nèi)容