java joptionpane调整大小_JAVA应用性能监控之JVM层GC调优
1. JVM內(nèi)存結(jié)構(gòu)
1.1 運(yùn)行時(shí)數(shù)據(jù)區(qū)
程序計(jì)數(shù)器PC Register:JVM支持多線程同時(shí)執(zhí)行,每一個(gè)線程都有自己的PC Register,線程正在執(zhí)行的方法叫做當(dāng)前方法,如果是java代碼,PC Register里面存放的就是房錢(qián)正在執(zhí)行的指令的地址,如果你是C代碼,則為空。
- Java虛擬機(jī)棧(Java Virtual Machine Stacks)是線程私有的,它的生命周期與線程相同。虛擬機(jī)棧描述的是Java方法執(zhí)行的內(nèi)存模型:每個(gè)方法在執(zhí)行的同時(shí)都會(huì)創(chuàng)建一個(gè)棧幀,用于存儲(chǔ)局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口燈信息。每一個(gè)方法從調(diào)用直至執(zhí)行完成的過(guò)程,就對(duì)應(yīng)著一個(gè)棧幀在虛擬機(jī)棧中入棧到出棧的過(guò)程。
- Java堆(Java Heap)是Java虛擬機(jī)所管理的內(nèi)存中最大的一塊。堆是被所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建。此內(nèi)存區(qū)域的唯一目的就是存放對(duì)象實(shí)例,幾乎所有的對(duì)象實(shí)例都在這里分配內(nèi)存。Java堆可以處于物理上不連續(xù)的內(nèi)存空間中,只要邏輯上是連續(xù)的即可。
- 方法區(qū)(Method Area):方法區(qū)域java堆一樣,是各個(gè)線程共享的內(nèi)存區(qū)域,它用于存儲(chǔ)已被虛擬機(jī)加載的類(lèi)信息、常亮、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。雖然Java虛擬機(jī)規(guī)范把方法區(qū)描述為堆的一個(gè)邏輯部分,但是它卻有一個(gè)別名叫做Non-Heap(非堆),目的是與Java堆區(qū)分開(kāi)來(lái)。
- 運(yùn)行時(shí)常量池(Runtime Constant Pool)是方法區(qū)的一部分。Class文件中除了有類(lèi)的版本、字段、方法、接口等描述信息外,還有一項(xiàng)信息是常量池(Constant Pool Table),用于存放編譯器生成的各種字面量和符號(hào)引用,這部分內(nèi)容將在類(lèi)加載后進(jìn)入方法區(qū)的常量池中存放。
- 本地方法棧(Native Method Stacks)與虛擬機(jī)棧所放回的作用是非常相似的,它們之間的區(qū)別不過(guò)是虛擬機(jī)棧為虛擬機(jī)執(zhí)行的Java方法(也就是字節(jié)碼)服務(wù),而本地方法棧則為虛擬機(jī)使用到的Native方法服務(wù)。
1.2 JVM的內(nèi)存結(jié)構(gòu)
實(shí)例:
啟用壓縮類(lèi)空間:
jstat -gc 13144
禁用壓縮類(lèi)空間:
jstat -gc 13523
codecache也是一樣操作。
-xint
常用參數(shù):
- -Xms-Xmx
- -XX:NewSize -XX:MaxNewSize
- -XX:NewRatio -XX:SurvivorRatio
- -XX:MetaspaceSize -XX:MaxMetaspaceSize
- -XX:+UseCompressedClassPointers
- -XX:CompressedClassSpaceSize
- -XX:InitialCodeCacheSize
- -XX:ReservedCodeCacheSize
2. 垃圾回收算法
2.1 如何確定垃圾
2.2 各類(lèi)算法
對(duì)象分配:
- 對(duì)象優(yōu)先分配在Eden區(qū)。
- 大對(duì)象直接進(jìn)入老年代:-XX:PretenureSizeThreshold,該參數(shù)規(guī)定多大的對(duì)象會(huì)直接分配在老年代。
- 長(zhǎng)期存活對(duì)象進(jìn)入老年代:
-XX:MaxTenuringThreshold 晉升閾值
-XX:+PrintTenuringDistribution 發(fā)生Young GC時(shí)候,打印存活對(duì)象的年齡的分布情況
-XX:TargetSurivorRatio 設(shè)置Surivor區(qū),Young區(qū)垃圾回收后存活對(duì)象的比例,假設(shè)該值設(shè)置為80%,意味著發(fā)生一次Young GC,Surivor區(qū)存活對(duì)象為80%,這時(shí)候需要計(jì)算這些80%存活對(duì)象的平均年齡,用平均年齡和晉升閾值之間取一個(gè)最小值,如果有對(duì)象年齡大于該最小值,也會(huì)將該對(duì)象晉升到老年代。
3. 垃圾收集器
3.1 三種類(lèi)型垃圾收集器
- 串行收集器Serial:Serial、Serial Old。單線程,適用于內(nèi)存小的嵌入式設(shè)備。
- 并行收集器Parallel:Paralel Scavenge、Parallel Old,吞吐量?jī)?yōu)先。
- 并發(fā)收集器Concurrent:CMS、G1,停頓時(shí)間優(yōu)先。
3.2 并行VS并發(fā)
- 并行是指多條垃圾收緊線程并行工作,但此時(shí)用戶(hù)線程仍然處于等待狀態(tài)。適合科學(xué)計(jì)算、后臺(tái)處理等弱交互場(chǎng)景。
- 并發(fā)指用戶(hù)線程與垃圾收集線程同時(shí)執(zhí)行(但不一定是并行的,可能會(huì)交替執(zhí)行),垃圾收集線程在執(zhí)行的時(shí)候不會(huì)停頓用戶(hù)程序的運(yùn)行。適合對(duì)響應(yīng)時(shí)間有要求的場(chǎng)景,比如Web。
3.3 停頓時(shí)間VS吞吐量
- 停頓時(shí)間:垃圾收集器做垃圾回收中斷應(yīng)用執(zhí)行的時(shí)間,-XX:MaxGCPauseMillis
- 吞吐量:花在垃圾收集的時(shí)間和花在應(yīng)用時(shí)間的占比。-XXGCTimeRatio=<n>,來(lái)及收集時(shí)間占:1/1+n。
3.4 如何評(píng)價(jià)一個(gè)垃圾回收器的好壞
3.5 三種類(lèi)型垃圾收集器開(kāi)啟與停用
串行收集器:
并行收集器:
并發(fā)收集器:
3.6 垃圾收集器搭配
- 有連線的是可以相互搭配使用。
- JDK8推薦使用G1,性能比較好,在Yong區(qū)和Old區(qū)都可以使用。
- 虛線表示CMS可能退化成SerialOld,空間擔(dān)保分配失敗。
如何選擇垃圾收集器?
優(yōu)先調(diào)整堆的大小,讓JVM自己來(lái)選擇;
- 如果內(nèi)存小于100M,使用串行收集器;
- 如果是單核,并沒(méi)有停頓時(shí)間的要求,串行或JVM自己選;
- 如果允許停頓時(shí)間超過(guò)1秒,選擇并行或JVM自己選;
- 如果響應(yīng)時(shí)間非常重要,并且不能超過(guò)1秒,使用并發(fā)收集器;
3.7 兩種常用垃圾收集器
3.7.1 Parallel Collector
工作原理:當(dāng)發(fā)現(xiàn)內(nèi)存不夠時(shí),暫停應(yīng)用程序,啟動(dòng)多個(gè)垃圾回收線程來(lái)回收垃圾,垃圾回收結(jié)束后,重新啟動(dòng)應(yīng)用程序。
-XX:+UseParallelGC 手動(dòng)開(kāi)啟,server模式默認(rèn)開(kāi)啟;
-XX:ParallelGCThreads=<n> 開(kāi)啟多少個(gè)GC線程;
并行收集器的自適應(yīng)特性(Parallel Collector Ergonomics),會(huì)自動(dòng)調(diào)整堆得大小,來(lái)自適應(yīng)調(diào)整滿足我們?cè)O(shè)定的指標(biāo):
- -XX:MaxGCPauseMills=<n> 最大停頓時(shí)間;
- -XX:GCTimeRatio=<n> 吞吐量;
- -Xmx<n> 堆的大小;
優(yōu)先滿足停頓時(shí)間要求,然后滿足吞吐量要求,如果兩個(gè)都滿足的話,它會(huì)減小堆得大小,來(lái)滿足停頓時(shí)間的要求,直到這三個(gè)條件中有一個(gè)是滿足不了的。自適應(yīng)其實(shí)不是最優(yōu)的,因?yàn)樗枰獎(jiǎng)討B(tài)調(diào)整堆得大小來(lái)滿足這些條件。
動(dòng)態(tài)內(nèi)存調(diào)整
并行收集器在自適應(yīng)的時(shí)候會(huì)動(dòng)態(tài)調(diào)整內(nèi)存; - -XX:YongGenerationSizeIncrement=<Y> Yong區(qū)動(dòng)態(tài)調(diào)整每次增加的大小,默認(rèn)20%;
- -XX:TenuredGenerationSizeIncrement=<T> Old區(qū)動(dòng)態(tài)調(diào)整每次增加的大小,默認(rèn)20%;
- -XX:AdaptiveSizeDecrementScaleFactor=<D> 動(dòng)態(tài)減小時(shí)每次減小的大小,默認(rèn)4%;
在生產(chǎn)環(huán)境下很少使用自適應(yīng)功能,主要通過(guò)手動(dòng)調(diào)整。
3.7.2 CMS Collector
(1)CMS垃圾收集過(guò)程
由于篇幅限制原因,更多關(guān)于jvm知識(shí)點(diǎn)的學(xué)習(xí)思維導(dǎo)圖以及上面垃圾收集的高清大圖可以私信筆者“jvm”領(lǐng)取
總結(jié)
以上是生活随笔為你收集整理的java joptionpane调整大小_JAVA应用性能监控之JVM层GC调优的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: carplay是否可以用安卓系统_是否可
- 下一篇: 爸爸的运动员特质和妈妈的军人气概,可以这