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