日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java虚拟机详解05----垃圾收集器及GC参数

發布時間:2025/3/21 java 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java虚拟机详解05----垃圾收集器及GC参数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文主要內容:

  • 堆的回顧
  • 串行收集器
  • 并行收集器
  • CMS收集器

?

零、堆的回顧:

新生代中的98%對象都是“朝生夕死”的,所以并不需要按照1:1的比例來劃分內存空間,而是內存分為一塊比較大的Eden空間和兩塊較小的Survivor空間,每次使用Eden和其中一塊Survivor。當回收時,將Eden和Survivor中還存活著的對象一次性地復制到另外一塊Survivor空間上,最后清理掉Eden和剛才用過的Survivor空間。HotSpot虛擬機默認Eden和Survivor的大小比例是8:1,也就是說,每次新生代中可用內存空間為整個新生代容量的90%(80%+10%),只有10%的空間會被浪費。

當然,98%的對象可回收只是一般場景下的數據,我們沒有辦法保證每次回收都只有不多于10%的對象存活,當Survivor空間不夠用時,需要依賴于老年代進行分配擔保,所以大對象直接進入老年代。

堆的結構如下圖所示:

垃圾收集器:

如果說收集算法時內存回收的方法論,那么垃圾收集器就是內存回收的具體實現。

雖然我們在對各種收集器進行比較,但并非為了挑出一個最好的收集器。因為直到現在位置還沒有最好的收集器出現,更加沒有萬能的收集器,所以我們選擇的只是對具體應用最合適的收集器

?

一、串行收集器:Serial收集器

  • 最古老,最穩定
  • 簡單而高效
  • 可能會產生較長的停頓
  • -XX:+UseSerialGC

    新生代、老年代都會使用串行回收

      新生代復制算法

    老年代標記-整理

總結:Serial收集器對于運行在Client模式下的虛擬機來說是一個很好的選擇。

這個收集器是一個單線程的收集器,但它的單線程的意義并不僅僅說明它只會使用一個CPU或一條收集線程去完成垃圾收集工作,更重要的是在它進行垃圾收集時,必須暫停其他所有的工作線程,直到它收集結束。收集器的運行過程如下圖所示:

?

二、并行收集器:

1、ParNew收集器:

  • ParNew收集器其實就是Serial收集器新生代的并行版本。
  • 多線程,需要多核支持。
  • -XX:+UseParNewGC

    新生代并行

    老年代串行

  • -XX:ParallelGCThreads 限制線程數量

2、Parallel Scanvenge收集器:

  • 類似ParNew,但更加關注吞吐量
  • -XX:+UseParallelGC? 使用Parallel Scanvenge收集器:新生代并行,老年代串行

3、Parallel Old收集器:

  • Parallel Old收集器是Parallel Scanvenge收集器的老年代版本
  • -XX:+UseParallelGC? 使用Parallel Old收集器:新生代并行,老年代并行

如下圖所示:

各種參數設置:

  • -XX:MaxGCPauseMills

    最大停頓時間,單位毫秒

    GC盡力保證回收時間不超過設定值

  • -XX:GCTimeRatio

    0-100的取值范圍

    垃圾收集時間占總時間的比

    默認99,即最大允許1%時間做GC

注:這兩個參數是矛盾的。因為停頓時間和吞吐量不可能同時調優。我們一方買希望停頓時間少,另外一方面希望吞吐量高,其實這是矛盾的。因為:在GC的時候,垃圾回收的工作總量是不變的,如果將停頓時間減少,那頻率就會提高;既然頻率提高了,說明就會頻繁的進行GC,那吞吐量就會減少,性能就會降低。

吞吐量:CPU用于用戶代碼的時間/CPU總消耗時間的比值,即=運行用戶代碼的時間/(運行用戶代碼時間+垃圾收集時間)。比如,虛擬機總共運行了100分鐘,其中垃圾收集花掉1分鐘,那吞吐量就是99%。

注2:以上所有的收集器當中,當執行GC時,都會stop the world,但是下面的CMS收集器卻不會這樣。

?

三、CMS收集器:

CMS收集器(Concurrent Mark Sweep:并發標記清除)是一種以獲取最短回收停頓時間為目標的收集器。適合應用在互聯網站或者B/S系統的服務器上,這類應用尤其重視服務器的響應速度,希望系統停頓時間最短。

  • Concurrent Mark Sweep 并發標記清除,并發低停頓
  • 標記-清除算法
  • 并發階段會降低吞吐量(因為停頓時間減少了,于是GC的頻率會變高)
  • 老年代收集器(新生代使用ParNew)
  • -XX:+UseConcMarkSweepGC?? 打開這收集器

注:這里的并發指的是與用戶線程一起執行。

?

2、CMS收集器運行過程:(著重實現了標記的過程)

(1)初始標記

根可以直接關聯到的對象

速度快

(2)并發標記(和用戶線程一起)

主要標記過程,標記全部對象

(3)重新標記

由于并發標記時,用戶線程依然運行,因此在正式清理前,再做修正

(4)并發清除(和用戶線程一起)

基于標記結果,直接清理對象

整個過程如下圖所示:

其中,初始標記和重新標記時,需要stop the world。

整個過程中耗時最長的是并發標記和并發清除,這兩個過程都可以和用戶線程一起工作。

打印GC日志舉例如下:

3、CMS收集器特點:

(1)盡可能降低停頓

(2)會影響系統整體吞吐量和性能

比如,在用戶線程運行過程中,分一半CPU去做GC,系統性能在GC階段,反應速度就下降一半

(3)清理不徹底

因為在清理階段,用戶線程還在運行,會產生新的垃圾,無法清理

(4)因為和用戶線程一起運行,不能在空間快滿時再清理

-XX:CMSInitiatingOccupancyFraction設置觸發GC的閾值

如果不幸內存預留空間不夠,就會引起concurrent mode failure

我們來看一下concurrent mode failure的日志:

碰到上圖中的情況,我們需要使用串行收集器作為后備。

?

4、既然標記清除算法會造成內存空間的碎片化,CMS收集器為什么使用標記清除算法而不是使用標記整理算法:

答案:

??? CMS收集器更加關注停頓,它在做GC的時候是和用戶線程一起工作的(并發執行),如果使用標記整理算法的話,那么在清理的時候就會去移動可用對象的內存空間,那么應用程序的線程就很有可能找不到應用對象在哪里。

為了解決碎片的問題,CMS收集器會有一些整理上的參數,接下來就來講這個。

?

5、整理時的各種參數:

  • -XX:+ UseCMSCompactAtFullCollection?????

Full GC后,進行一次整理。整理過程是獨占的,會引起停頓時間變長

  • -XX:+CMSFullGCsBeforeCompaction

設置進行幾次Full GC后,進行一次碎片整理

  • -XX:ParallelCMSThreads

設定CMS的線程數量

?

四、GC參數的整理:

-XX:+UseSerialGC:在新生代和老年代使用串行收集器

-XX:SurvivorRatio:設置eden區大小和survivior區大小的比例

-XX:NewRatio:新生代和老年代的比

-XX:+UseParNewGC:在新生代使用并行收集器

-XX:+UseParallelGC :新生代使用并行回收收集器

-XX:+UseParallelOldGC:老年代使用并行回收收集器

-XX:ParallelGCThreads:設置用于垃圾回收的線程數

-XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用CMS+串行收集器

-XX:ParallelCMSThreads:設定CMS的線程數量

-XX:CMSInitiatingOccupancyFraction:設置CMS收集器在老年代空間被使用多少后觸發

-XX:+UseCMSCompactAtFullCollection:設置CMS收集器在完成垃圾收集后是否要進行一次內存碎片的整理

-XX:CMSFullGCsBeforeCompaction:設定進行多少次CMS垃圾回收后,進行一次內存壓縮

-XX:+CMSClassUnloadingEnabled:允許對類元數據進行回收

-XX:CMSInitiatingPermOccupancyFraction:當永久區占用率達到這一百分比時,啟動CMS回收

-XX:UseCMSInitiatingOccupancyOnly:表示只在到達閥值的時候,才進行CMS回收

?

最后的總結:

為了減輕GC壓力,我們需要注意些什么?

  • 軟件如何設計架構(性能的根本在應用)
  • GC參數屬于微調(設置不合理會影響性能,產生大的延時)
  • 堆空間如何管理和分配
  • 代碼如何寫
from:?https://yq.aliyun.com/articles/37183?spm=5176.100239.blogcont37180.23.7H5zl8

總結

以上是生活随笔為你收集整理的Java虚拟机详解05----垃圾收集器及GC参数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。