溫馨提示×

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

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

如何理解JAVA JVM

發(fā)布時(shí)間:2021-11-23 10:37:04 來(lái)源:億速云 閱讀:136 作者:柒染 欄目:大數(shù)據(jù)

如何理解JAVA JVM,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

什么是JVM

JVM是Java Virtual Machine(Java虛擬機(jī))的縮寫,JVM是一種用于計(jì)算設(shè)備的規(guī)范,它是一個(gè)虛構(gòu)出來(lái)的計(jì)算機(jī),是通過(guò)在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來(lái)實(shí)現(xiàn)的。

市面上是有很多虛擬機(jī)

了解JVM的結(jié)構(gòu),通過(guò)合理的參數(shù)配置,有助于我們更好的發(fā)揮JVM的性能。

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

如何理解JAVA JVM

內(nèi)存空間的主要組成

如何理解JAVA JVM

  1. 方法區(qū)

    方法區(qū)(Method Area),是各個(gè)線程共享的內(nèi)存區(qū)域,它用于存儲(chǔ)已被虛擬機(jī)加載的類型信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼緩存等數(shù)據(jù)

  2. 對(duì)于Java應(yīng)用程序來(lái)說(shuō),Java堆(Java Heap)是虛擬機(jī)所管理的內(nèi)存中最大的一塊。Java堆是被所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建。此內(nèi)存區(qū)域的唯一目的就是存放對(duì)象實(shí)例,Java世界里“幾乎”所有的對(duì)象實(shí)例都在這里分配內(nèi)存

  3. 虛擬機(jī)棧

    線程私有的,它的生命周期與線程相同。虛擬機(jī)棧描述的是Java方法執(zhí)行的線程內(nèi)存模型:每個(gè)方法被執(zhí)行的時(shí)候,Java虛擬機(jī)都會(huì)同步創(chuàng)建一個(gè)棧幀(Stack Frame)用于存儲(chǔ)局部變量表、操作數(shù)棧、動(dòng)態(tài)連接、方法出口等信息。每一個(gè)方法被調(diào)用直至執(zhí)行完畢的過(guò)程,就對(duì)應(yīng)著一個(gè)棧幀在虛擬機(jī)棧中從入棧到出棧的過(guò)程

  4. 本地方法棧

    本地方法棧(Native Method Stacks)與虛擬機(jī)棧所發(fā)揮的作用是非常相似的,其區(qū)別只是虛擬機(jī)棧為虛擬機(jī)執(zhí)行Java方法(也就是字節(jié)碼)服務(wù),而本地方法棧則是為虛擬機(jī)使用到的本地(Native)方法服務(wù)

  5. 程序計(jì)數(shù)器

    程序計(jì)數(shù)器(Program Counter Register)是一塊較小的內(nèi)存空間,它可以看作是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器??梢岳斫鉃闃?biāo)記程序下一行執(zhí)行什么。

方法區(qū),堆,線程共享

虛擬機(jī)棧,本地方法棧,程序計(jì)數(shù)器,線程私有,創(chuàng)建一個(gè)線程時(shí)(可以理解為運(yùn)行一個(gè)方法),創(chuàng)建一個(gè)棧幀,專門服務(wù)與此線程

內(nèi)存分配

堆內(nèi)存是我們主要使用的內(nèi)存,堆內(nèi)存組成如下

如何理解JAVA JVM

包括,年輕代,老年代(默認(rèn)比例是 1:2)

  1. 年輕代:

1.1 包含一個(gè)Eden,二個(gè)Survivor(默認(rèn)比例 8:1:1),年輕代用于保存新創(chuàng)建的對(duì)象,如果年輕代的內(nèi)存不夠,會(huì)進(jìn)行一次MinorGC,如果經(jīng)歷15次MinorGC(默認(rèn)值),還存活的,會(huì)被轉(zhuǎn)移到老年代(如果新對(duì)象年輕代,放不下,會(huì)被直接放到老年代)

1.2 年輕代使用復(fù)制算法,把內(nèi)存區(qū)域分為兩塊(Eden+Survivor,另一個(gè)Survivor),每次使用一塊,GC的時(shí)候把一塊中的內(nèi)容移動(dòng)到另一塊中,原始內(nèi)存中的對(duì)象就可以被回收了

  1. 老年代:

2.1 老年代內(nèi)存不夠時(shí),會(huì)進(jìn)行一次MajorGC(也有說(shuō)法是FullGC)

因?yàn)镚C會(huì)造成"Stop the world",線程暫停,所以要合理調(diào)整堆內(nèi)存大小,并分配年輕代,老年代的比例,以達(dá)到減少GC頻率,降低GC時(shí)間的目的

垃圾回收

在堆里面存放著Java世界中幾乎所有的對(duì)象實(shí)例,垃圾收集器在對(duì)堆進(jìn)行回收前,第一件事情就是要確定這些對(duì)象之中哪些還“存活”著,哪些已經(jīng)“死去”(“死去”即不可能再被任何途徑使用的對(duì)象)了。

一般采用“引用計(jì)數(shù)算法”來(lái)判定引用

內(nèi)存優(yōu)化調(diào)整

總結(jié)以上,內(nèi)存調(diào)優(yōu)的目的是,提高代碼的執(zhí)行效率,減少GC頻率,降低GC時(shí)間,這就需要合理的分配堆內(nèi)存(堆的總大小,年輕代的大?。?/p>

  1. 下載安裝工具 使用工具:JDK Mission Control 簡(jiǎn)稱JMC

下載安裝參考 https://www.cnblogs.com/jhxxb/p/13279286.html

本地程序可以直接在工具中看到,也可以遠(yuǎn)程連接到JVM,一般在服務(wù)器生成飛行數(shù)據(jù),下載到本地,再用工具打開

  1. 啟動(dòng)程序

一般先設(shè)置JVM參數(shù),運(yùn)行程序(-Xms1024m -Xmx1024m -Xmn512m)

Xms: 初始堆大小,默認(rèn)無(wú)聊內(nèi)存的1/64

Xmx: 最大堆大小,默認(rèn)物理內(nèi)存的1/4

Xmn: 新生代大?。ㄐ陆▽?duì)象,建議堆的25%-50%),默認(rèn)整個(gè)堆的1/3

  1. 收集程序的飛行數(shù)據(jù)

    jcmd <pid> JFR.start delay=10s duration=15m filename=log.jfr

    說(shuō)明: pid: 服務(wù)的進(jìn)程號(hào). 使用ps -ef | grep java 查詢. (使用時(shí)去除尖括號(hào))

    delay: 延遲開啟配置. delay=10s 代表延遲10秒開啟.

    duration: 指收集的日志時(shí)長(zhǎng). duration=15m, 代表收集15分鐘的JVM信息.

    filename: 指將收集的日志存在指定的日志文件中. filename=log.jfr, 代表將收集的日志存放在log.jfr中.

看完上述內(nèi)容,你們掌握如何理解JAVA JVM的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

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

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

AI