溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

JVM基礎(chǔ)知識(shí)都有什么

發(fā)布時(shí)間:2021-10-23 16:13:16 來源:億速云 閱讀:149 作者:柒染 欄目:大數(shù)據(jù)

JVM基礎(chǔ)知識(shí)都有什么,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

一、什么是JVM?

        

JVM是可運(yùn)行Java代碼的假想計(jì)算機(jī) ,包括一套字節(jié)碼指令集、一組寄存器、一個(gè)棧、一個(gè)垃圾回收,堆和一個(gè)存儲(chǔ)方法域。JVM 是運(yùn)行在操作系統(tǒng)之上的,它與硬件沒有直接的交互。

二、運(yùn)行過程

         ① Java 源文件—->編譯器—->字節(jié)碼文件

         ② 字節(jié)碼文件—->JVM—->機(jī)器碼

JVM基礎(chǔ)知識(shí)都有什么

三、JVM 內(nèi)存區(qū)域

主要分為線程私有區(qū)域【程序計(jì)數(shù)器、虛擬機(jī)棧、本地方法區(qū)】、線程共享區(qū)

域【JAVA 堆、方法區(qū)】、直接內(nèi)存。


JVM基礎(chǔ)知識(shí)都有什么

四、jvm內(nèi)加載機(jī)制

       Java源代碼被編譯成class字節(jié)碼,JVM把描述類數(shù)據(jù)的字節(jié)碼.Class文件加載到內(nèi)存,并對(duì)數(shù)據(jù)進(jìn)行校驗(yàn)、轉(zhuǎn)換解析和初始化,最終形成可以被虛擬機(jī)直接使用的java類型,這就是虛擬機(jī)的類加載機(jī)制。

        類從被加載到虛擬機(jī)內(nèi)存中開始,到卸載出內(nèi)存為止,它的生命周期包括了:加載(Loading)、驗(yàn)證(Verification)、準(zhǔn)備(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸載(Unloading)七個(gè)階段,其中驗(yàn)證、準(zhǔn)備、解析三個(gè)部分統(tǒng)稱鏈接。

JVM基礎(chǔ)知識(shí)都有什么

五、JVM 運(yùn)行時(shí)內(nèi)存

    新生代:gc回收主要用復(fù)制算法

    老年代:gc回收主要用標(biāo)記清除算法

    永久代:jdk8移除,被元數(shù)據(jù)區(qū)取代

堆內(nèi)存結(jié)構(gòu)

JVM基礎(chǔ)知識(shí)都有什么

棧和堆的區(qū)別?

棧的優(yōu)勢(shì):存取速度比堆要快,僅次于直接位于 CPU 中的寄存器。但缺點(diǎn)是,棧中的數(shù)據(jù)大小與生存周期必須是確定的。

堆的優(yōu)勢(shì):可以動(dòng)態(tài)地分配內(nèi)存大小,生存周期也不必事先告訴編譯器,Java 的垃圾回收器會(huì)自動(dòng)收走那些不再使用的數(shù)據(jù)。但由于要在運(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存,存取速度較慢。

六、GC垃圾回收

    (1)如何確定垃圾

            引用計(jì)數(shù)法

            可達(dá)性分析 

    (2)回收對(duì)象

            超出作用域的對(duì)象/引用計(jì)數(shù)為空的對(duì)象。

            從gc root開始搜索,搜索不到的對(duì)象。

            回收新生代區(qū)。

    (3)回收算法

            引用計(jì)數(shù)法

            標(biāo)記清除法

            標(biāo)記壓縮法

            復(fù)制算法

            分代算法

七、JAVA 引用類型       

強(qiáng)引用:把一個(gè)對(duì)象賦給一個(gè)引用變量,這個(gè)引用變量就是一個(gè)強(qiáng)引

用。當(dāng)一個(gè)對(duì)象被強(qiáng)引用變量引用時(shí),它處于可達(dá)狀態(tài),它是不可能被垃圾回收機(jī)制回收的,即使該對(duì)象以后永遠(yuǎn)都不會(huì)被用到 JVM 也不會(huì)回收。因此強(qiáng)引用是造成 Java 內(nèi)存泄漏的主要原因之一。

軟引用:需要用 SoftReference 類來實(shí)現(xiàn),對(duì)于只有軟引用的對(duì)象來說,當(dāng)系統(tǒng)內(nèi)存足夠時(shí)它不會(huì)被回收,當(dāng)系統(tǒng)內(nèi)存空間不足時(shí)它會(huì)被回收。軟引用通常用在對(duì)內(nèi)存敏感的程序中

引用:需要用 WeakReference 類來實(shí)現(xiàn),它比軟引用的生存期更短,對(duì)于只有弱引用的對(duì)象來說,只要垃圾回收機(jī)制一運(yùn)行,不管 JVM 的內(nèi)存空間是否足夠,總會(huì)回收該對(duì)象占用的內(nèi)存。

引用:需要 PhantomReference 類來實(shí)現(xiàn),它不能單獨(dú)使用,必須和引用隊(duì)列聯(lián)合使用。虛引用的主要作用是跟蹤對(duì)象被垃圾回收的狀態(tài)。

八、常用JVM參數(shù)調(diào)優(yōu) 

Xss:每個(gè)線程的Stack大小

-verbose:gc 現(xiàn)實(shí)垃圾收集信息

-Xloggc:gc.log 指定垃圾收集日志文件

-Xmn:young generation的heap大小,一般設(shè)置為Xmx的3、4分之一

-XX:+UseParNewGC :縮短minor收集的時(shí)間

-XX:+UseConcMarkSweepGC :縮短major收集的時(shí)間

重要參數(shù):

-Xms 堆初始值

-Xmx 堆最大可用值

-Xmn 新生代堆最大可用值

-Xmn 新生代大小,一般設(shè)為整個(gè)堆的1/3到1/4左右

注意:堆初始值=堆最大值,減少垃圾回收次數(shù),提升效率。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

jvm
AI