導航:首頁 > 萬維百科 > gcjavacms

gcjavacms

發布時間:2021-02-25 16:31:43

1、如何查看 java gc 類型

Java中的GC有哪幾種類型?

參數

描述

UseSerialGC

虛擬機運行在Client模式的默認值,打開此開關參數後,
使用Serial+Serial Old收集器組合進行垃圾收集。

UseParNewGC

打開此開關參數後,使用ParNew+Serial Old收集器組合進行垃圾收集。

UseConcMarkSweepGC

打開此開關參數後,使用ParNew+cms+Serial Old收集器組合進行垃圾收集。Serial Old作為CMS收集器出現Concurrent Mode Failure的備用垃圾收集器。

UseParallelGC

虛擬機運行在Server模式的默認值,打開此開關參數後,使用Parallel Scavenge+Serial Old收集器組合進行垃圾收集。

UseParallelOldGC

打開此開關參數後,使用Parallel Scavenge+Parallel Old收集器組合進行垃圾收集。

在Java程序啟動完成後,通過jps觀察進程來查詢到當前運行的java進程,使用
jinfo –flag UseSerialGC 進程

的方式可以定位其使用的gc策略,因為這些參數都是boolean型的常量,如果使用該種gc策略會出現+號,否則-號。

使用-XX:+上述GC策略可以開啟對應的GC策略。

GC日誌查看
可以通過在java命令種加入參數來指定對應的gc類型,列印gc日誌信息並輸出至文件等策略。

GC的日誌是以替換的方式(>)寫入的,而不是追加(>>),如果下次寫入到同一個文件中的話,以前的GC內容會被清空。

對應的參數列表
-XX:+PrintGC 輸出GC日誌
-XX:+PrintGCDetails 輸出GC的詳細日誌
-XX:+PrintGCTimeStamps 輸出GC的時間戳(以基準時間的形式)
-XX:+PrintGCDateStamps 輸出GC的時間戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在進行GC的前後列印出堆的信息
-Xloggc:../logs/gc.log 日誌文件的輸出路徑

這里使用如下的參數來進行日誌的列印:
-XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:./gclogs

對於新生代回收的一行日誌,其基本內容如下:
2014-07-18T16:02:17.606+0800: 611.633: [GC 611.633: [DefNew: 843458K->2K(948864K), 0.0059180 secs] 2186589K->1343132K(3057292K), 0.0059490 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

其含義大概如下:
2014-07-18T16:02:17.606+0800(當前時間戳): 611.633(時間戳): [GC(表示Young GC) 611.633: [DefNew(單線程Serial年輕代GC): 843458K(年輕代垃圾回收前的大小)->2K(年輕代回收後的大小)(948864K(年輕代總大小)), 0.0059180 secs(本次回收的時間)] 2186589K(整個堆回收前的大小)->1343132K(整個堆回收後的大小)(3057292K(堆總大小)), 0.0059490 secs(回收時間)] [Times: user=0.00(用戶耗時) sys=0.00(系統耗時), real=0.00 secs(實際耗時)]

老年代回收的日誌如下:
2014-07-18T16:19:16.794+0800: 1630.821: [GC 1630.821: [DefNew: 1005567K->111679K(1005568K), 0.9152360 secs]1631.736: [Tenured:
2573912K->1340650K(2574068K), 1.8511050 secs] 3122548K->1340650K(3579636K), [Perm : 17882K->17882K(21248K)], 2.7854350 secs] [Times: user=2.57 sys=0.22, real=2.79 secs]

gc日誌中的最後貌似是系統運行完成前的快照:
Heap
def new generation total 1005568K, used 111158K [0x00000006fae00000, 0x000000073f110000, 0x0000000750350000)
eden space 893888K, 12% used [0x00000006fae00000, 0x0000000701710e90, 0x00000007316f0000)
from space 111680K, 3% used [0x0000000738400000, 0x000000073877c9b0, 0x000000073f110000)
to space 111680K, 0% used [0x00000007316f0000, 0x00000007316f0000, 0x0000000738400000)
tenured generation total 2234420K, used 1347671K [0x0000000750350000, 0x00000007d895d000, 0x00000007fae00000)
the space 2234420K, 60% used [0x0000000750350000, 0x00000007a2765cb8, 0x00000007a2765e00, 0x00000007d895d000)
compacting perm gen total 21248K, used 17994K [0x00000007fae00000, 0x00000007fc2c0000, 0x0000000800000000)
the space 21248K, 84% used [0x00000007fae00000, 0x00000007fbf92a50, 0x00000007fbf92c00, 0x00000007fc2c0000)
No shared spaces configured.

GC日誌的離線分析
可以使用一些離線的工具來對GC日誌進行分析,比如sun的gchisto( java.net/projects/gchisto),gcviewer( github.com/chewiebug/GCViewer ),這些都是開源的工具,用戶可以直接通過版本控制工具下載其源碼,進行離線分析。

下面就已gcviewer為例,簡要分析一下gc日誌的離線分析,gcviewer源代碼工程是maven結構的,可以直接用maven進行package,這里編譯的是1.34版本,本版本的快照已經上傳至附件中。

需要說明的是,gcviewer支持多種參數生成的gc日誌,直接通過java –jar的方式運行,載入生成的gc日誌即可

2、如何查看 java gc 類型

Java中的GC有哪幾種類型?

參數

描述

UseSerialGC

虛擬機運行在Client模式的默認值,打開此開關參數後,
使用Serial+Serial Old收集器組合進行垃圾收集。

UseParNewGC

打開此開關參數後,使用ParNew+Serial Old收集器組合進行垃圾收集。

UseConcMarkSweepGC

打開此開關參數後,使用ParNew+CMS+Serial Old收集器組合進行垃圾收集。Serial Old作為CMS收集器出現Concurrent Mode Failure的備用垃圾收集器。

UseParallelGC

虛擬機運行在Server模式的默認值,打開此開關參數後,使用Parallel Scavenge+Serial Old收集器組合進行垃圾收集。

UseParallelOldGC

打開此開關參數後,使用Parallel Scavenge+Parallel Old收集器組合進行垃圾收集。

在Java程序啟動完成後,通過jps觀察進程來查詢到當前運行的java進程,使用
jinfo –flag UseSerialGC 進程

的方式可以定位其使用的gc策略,因為這些參數都是boolean型的常量,如果使用該種gc策略會出現+號,否則-號。

使用-XX:+上述GC策略可以開啟對應的GC策略。

GC日誌查看
可以通過在java命令種加入參數來指定對應的gc類型,列印gc日誌信息並輸出至文件等策略。

GC的日誌是以替換的方式(>)寫入的,而不是追加(>>),如果下次寫入到同一個文件中的話,以前的GC內容會被清空。

對應的參數列表
-XX:+PrintGC 輸出GC日誌
-XX:+PrintGCDetails 輸出GC的詳細日誌
-XX:+PrintGCTimeStamps 輸出GC的時間戳(以基準時間的形式)
-XX:+PrintGCDateStamps 輸出GC的時間戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在進行GC的前後列印出堆的信息
-Xloggc:../logs/gc.log 日誌文件的輸出路徑

這里使用如下的參數來進行日誌的列印:
-XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:./gclogs

對於新生代回收的一行日誌,其基本內容如下:
2014-07-18T16:02:17.606+0800: 611.633: [GC 611.633: [DefNew: 843458K->2K(948864K), 0.0059180 secs] 2186589K->1343132K(3057292K), 0.0059490 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

其含義大概如下:
2014-07-18T16:02:17.606+0800(當前時間戳): 611.633(時間戳): [GC(表示Young GC) 611.633: [DefNew(單線程Serial年輕代GC): 843458K(年輕代垃圾回收前的大小)->2K(年輕代回收後的大小)(948864K(年輕代總大小)), 0.0059180 secs(本次回收的時間)] 2186589K(整個堆回收前的大小)->1343132K(整個堆回收後的大小)(3057292K(堆總大小)), 0.0059490 secs(回收時間)] [Times: user=0.00(用戶耗時) sys=0.00(系統耗時), real=0.00 secs(實際耗時)]

老年代回收的日誌如下:
2014-07-18T16:19:16.794+0800: 1630.821: [GC 1630.821: [DefNew: 1005567K->111679K(1005568K), 0.9152360 secs]1631.736: [Tenured:
2573912K->1340650K(2574068K), 1.8511050 secs] 3122548K->1340650K(3579636K), [Perm : 17882K->17882K(21248K)], 2.7854350 secs] [Times: user=2.57 sys=0.22, real=2.79 secs]

gc日誌中的最後貌似是系統運行完成前的快照:
Heap
def new generation total 1005568K, used 111158K [0x00000006fae00000, 0x000000073f110000, 0x0000000750350000)
eden space 893888K, 12% used [0x00000006fae00000, 0x0000000701710e90, 0x00000007316f0000)
from space 111680K, 3% used [0x0000000738400000, 0x000000073877c9b0, 0x000000073f110000)
to space 111680K, 0% used [0x00000007316f0000, 0x00000007316f0000, 0x0000000738400000)
tenured generation total 2234420K, used 1347671K [0x0000000750350000, 0x00000007d895d000, 0x00000007fae00000)
the space 2234420K, 60% used [0x0000000750350000, 0x00000007a2765cb8, 0x00000007a2765e00, 0x00000007d895d000)
compacting perm gen total 21248K, used 17994K [0x00000007fae00000, 0x00000007fc2c0000, 0x0000000800000000)
the space 21248K, 84% used [0x00000007fae00000, 0x00000007fbf92a50, 0x00000007fbf92c00, 0x00000007fc2c0000)
No shared spaces configured.

GC日誌的離線分析
可以使用一些離線的工具來對GC日誌進行分析,比如sun的gchisto( https://java.net/projects/gchisto),gcviewer( https://github.com/chewiebug/GCViewer ),這些都是開源的工具,用戶可以直接通過版本控制工具下載其源碼,進行離線分析。

下面就已gcviewer為例,簡要分析一下gc日誌的離線分析,gcviewer源代碼工程是maven結構的,可以直接用maven進行package,這里編譯的是1.34版本,本版本的快照已經上傳至附件中。

需要說明的是,gcviewer支持多種參數生成的gc日誌,直接通過java –jar的方式運行,載入生成的gc日誌即可:

3、java的gc為什麼要分代?

假如哈,現在的計算機能做的1ms掃描完所有live object,10ms完成live set的整理(compaction),大多數java應用都會覺得「這沒毛病了」,那麼,現在Hotspot JVM設計的那幾套GC演算法組合確實就沒意義了。下面,再繼續談一哈GC的哲學。類似分布式系統的CAP theorem,GC演算法設計也是有這個3取2的三角組合的:即延時(latency)、吞吐(throughput)和內存消耗(footprint)。基本的設計原理就是footprint為有限值的條件下,我們再在latency和throughput上挑一個優化,比如Hotspot JVM實現中,CMS演算法主攻latency,Parallel GC 主攻throughput,G1 GC較關注latency同時兼顧一點throughput。來來來,我們開個腦洞:我們能不能放棄或減弱「footprint為有限值」這個條件。嗯~比如,一個應用1小時使用100G memory(暫時不管這100G會產生多少垃圾),伺服器24小時會重啟一次,那麼,每次重啟前java應用需要使用的內存會達到2,400G。也就是說,在這個case中,java能使用的內存如果能大於2,400G,我們根本就是不需要任何GC演算法,not to mention 什麼分代了;「java的gc為什麼要分代」的哲學又是啥。我認為,是熵增原理 和 80/20法則。

4、問一個java GC CMS 的問題

看一下java的官方網站

5、cms垃圾回收演算法在gc過程中的哪個階段會暫停應用線程

GC在java中是垃圾回收機制,當你創建一個對象時,它就開始跟蹤,當對象「可到達」時,就自動回收,也可以手動調用,但一般不推薦使用

6、cms gc過程中哪幾個階段暫停應用程序

問題解決:中間調整過幾次,先搞了幾台機器做了驗證,後來逐步推廣的。
1、調大heap區,由原來的4g,調整到5g,young區的大小不變,還是2g,這時候old區就由2g變為3g了(這樣保證old區有足夠的空間);
2、設置-XX:UseCMSInitiatingOccupancyOnly,其實這個不關這個問題,只是發現半夜CMS進行的有點頻繁,就禁止掉了悲觀策略;
3、設置CMS區回收的比例,從80%調整到75%,讓old區盡早的進行,有足夠的空間剩餘;

為什麼要有GC(垃圾回收)?

JVM通過GC來回收堆和方法區中的內存,GC的基本原理就是找到程序中不再被使用的對象,然後回收掉這些對象佔用的內存。

與gcjavacms相關的知識