導航:首頁 > 萬維百科 > cms回收原理

cms回收原理

發布時間:2021-01-15 13:30:42

1、如何指定定java cms垃圾回收

如果你的JAVA應用程序有以下幾個特點,那麼可以使用Concurrent Mark Sweep (CMS) 垃圾收集器。
希望JAVA垃圾回收器回收垃圾的時間盡可能短;
應用運行在多CPU的機器上,有足夠的CPU資源;
有比較多生命周期長的對象;
希望應用的響應時間短。

2、請問下phpcms2008是否有回收站功能如題 謝謝了

發布信息 | 我發布的信息 | 審核 | 管理 | 回收站 | 碎片 | 搜索 查看原帖>>

滿意請採納

3、cms垃圾回收演算法在gc過程中哪幾個階段會暫停

P

4、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的基本原理就是找到程序中不再被使用的對象,然後回收掉這些對象佔用的內存。

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

Phase 1: Initial Mark(初始化標記)和 Phase 5: Final Remark(重新標記)這兩個階段會發生stop-the-world,暫停所有應用線程。

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的基本原理就是找到程序中不再被使用的對象,然後回收掉這些對象佔用的內存。

主要的收集器有哪些?
引用計數器和跟蹤計數器兩種。
引用計數器記錄對象是否被引用,當計數器為零時,說明對象已經不再被使用,可以進行回收。java中的對象有復雜的引用關系,不是很適合引用計數器,所以sun jdk中並沒有實現這種GC方式。
跟蹤收集器,全局記錄數據的引用狀態,基於一定的條件觸發。執行的時候,從根集合開始掃描對象的引用關系,主要有復制(copying)、標記-清除(Mark-Sweep)、標記-壓縮(Mark-Compact)那種演算法。

7、CMS GC會不會回收Direct ByteBuffer的內存

Oracle JDK 6u32前的版本不會。

Direct ByteBuffer是在Java Heap外分配內存,NIO等東西里使用的比較多,但Direct ByteBuffer分配出去的內存其實也是由GC負責回收的,而不像之前一篇文章里的Unsafe是完全自行管理的,Hotspot在GC時會掃描Direct ByteBuffer對象是否有引用,如沒有則同時也會回收其佔用的堆外內存,但不幸的是在6u32前的版本里,CMS GC有bug會導致可能回收不掉,具體的bug id為 7112034 ,在鏈接的Backport信息里,可以看到這個bug是在hotspot 20.7的版本里修復的(hotspot的版本號通過java -version的最後一行Java Hotspot Version之類的可以看到),6u32帶的就是這個版本,所以6u32是會回收的。

回收不掉的情況下會造成的問題是明明已經不用了,但堆外內存仍然被消耗掉,悲慘的情況下可能會導致堆外內存耗光。

Direct ByteBuffer除了上面這個bug可能造成堆外內存耗光外,還有一種場景也可能會造成堆外內存耗光,如Direct ByteBuffer對象晉升到了Old區,那這個時候就只能等Full GC觸發(CMS GC的情況下等CMS GC),因此在Direct ByteBuffer使用較多,存活時間較長的情況下,有可能會導致堆外內存耗光(因為Direct ByteBuffer本身對象所佔用的空間是很小的)。

對於上面這種類型的應用,最好是在啟動參數上增加-XX:MaxDirectMemorySize=x[m|g],例如-XX:MaxDirectMemorySize=500m

這個參數默認的大小是-Xmx的值(在沒設置MaxDirectMemorySize參數的情況下,用jinfo -flag等方式會看到默認值是-1,但VM.maxDirectMemory這個方法里發現是-1,則會以-Xmx作為默認值),此參數的含義是當Direct ByteBuffer分配的堆外內存到達指定大小後,即觸發Full GC(這段邏輯請見Bits.reserveMemory的代碼),如Full GC後仍然分配不出Direct ByteBuffer需要的空間,則會報OOM錯誤:
java.lang.OutOfMemoryError: Direct buffer memory

因為上面所說的狀況,如碰到堆外內存佔用較多的場景,可以嘗試強制執行Full GC(強制的方法為執行jmap -histo:live)看看,多執行一兩次,如堆外內存下降的話,很有可能就是Direct ByteBuffer造成的,對於這種情況,通常加上上面的啟動參數就可解決。

與cms回收原理相關的知識