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