您好,登錄后才能下訂單哦!
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 內(nèi)存區(qū)域
主要分為線程私有區(qū)域【程序計(jì)數(shù)器、虛擬機(jī)棧、本地方法區(qū)】、線程共享區(qū)
域【JAVA 堆、方法區(qū)】、直接內(nèi)存。
四、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 運(yùn)行時(shí)內(nèi)存
新生代:gc回收主要用復(fù)制算法
老年代:gc回收主要用標(biāo)記清除算法
永久代:jdk8移除,被元數(shù)據(jù)區(qū)取代
堆內(nèi)存結(jié)構(gòu)
棧和堆的區(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ì)億速云的支持。
免責(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)容。