如何減少長時間的GC暫停?

2020-12-21 Java從零開始

長時間的GC暫停對於應用程式而言是不可取的。它會影響您的SLA,導致不良的客戶體驗,並對關鍵任務應用程式造成嚴重損害。因此,在本文中,我列出了可能導致長時間GC暫停的主要原因,以及解決這些問題的潛在解決方案。

1.高對象創造率

如果您的應用程式的對象創建率很高,那麼為了跟上它,垃圾回收率也將很高。高垃圾回收率也會增加GC暫停時間。因此,優化應用程式以創建更少的對象是減少長時間GC暫停的有效策略。這可能是一個耗時的練習,但值得100%進行。為了優化應用程式中的對象創建速率,可以考慮使用Java Profiler(如 JProfiler, YourKit或JVisualVM)。這些分析器將報告:

·

創建了哪些對象?

這些對象的創建速率是多少?

它們在內存中佔用多少空間?

誰在創造它們?

始終嘗試優化佔用最大內存量的對象。追捕池塘裡的大魚。

.年齡不足的年輕一代

當年輕一代過小時,對象會過早地提升到老一代。從年輕一代收集垃圾比從年輕一代收集垃圾要花費更多的時間。因此,增加年輕代的大小有可能減少長時間的GC暫停。可以通過設置兩個JVM參數之一來增加年輕一代的大小

-Xmn:指定年輕代的大小。

-XX:NewRatio:指定年輕一代相對於老一代的大小。例如,設置-XX:NewRatio = 2表示老一代與年輕一代之間的比率為1:2。年輕一代將是整個堆的一半。因此,如果堆大小為2 GB,則年輕代大小將為1 GB。

3. GC算法的選擇

GC算法對GC暫停時間有很大影響。如果您是GC專家或打算成為一名GC專家(或者您團隊中的某人是GC專家),則可以調整GC設置以獲得最佳的GC暫停時間。如果您沒有很多GC專業知識,那麼我建議您使用G1 GC算法,因為它具有 自動調整功能。在G1 GC中,您可以使用系統屬性「 -XX:MaxGCPauseMillis」設置GC暫停時間目標。例:

- XX:MaxGCPauseMillis = 200

根據上面的示例,最大GC暫停時間設置為200毫秒。這是一個軟目標,JVM將盡力實現這一目標。

4.交換流程

有時由於缺少內存(RAM),作業系統可能會從內存中交換應用程式。交換非常昂貴,因為它需要磁碟訪問,與物理內存訪問相比要慢得多。以我的拙見,在生產環境中沒有認真的應用可以互換。交換過程時,GC將花費很長時間才能完成。

下面是從StackOverflow獲得的腳本 (感謝作者),該腳本 在執行時將顯示所有正在交換的進程。請確保您的進程沒有被交換。

#!/bin/bash

# Get current swap usage for all running processes

# Erik Ljungstrom 27/05/2011

# Modified by Mikko Rantalainen 2012-08-09

# Pipe the output to "sort -nk3" to get sorted output

# Modified by Marc Methot 2014-09-18

# removed the need for sudo

SUM=0

OVERALL=0

for DIR in `find /proc/ -maxdepth 1 -type d -regex "^/proc/[0-9]+"`

do

PID=`echo $DIR | cut -d / -f 3`

PROGNAME=`ps -p $PID -o comm --no-headers`

for SWAP in `grep VmSwap $DIR/status 2>/dev/null | awk '{ print $2 }'`

do

let SUM=$SUM+$SWAP

done

if (( $SUM > 0 )); then

echo "PID=$PID swapped $SUM KB ($PROGNAME)"

fi

let OVERALL=$OVERALL+$SUM

SUM=0

done

echo "Overall swap used: $OVERALL KB"

如果發現進程正在交換,請執行以下一項操作:

為服務分配更多的RAM。

減少伺服器上運行的進程數,以便它可以釋放內存(RAM)。

減少應用程式的堆大小(我不建議這樣做,因為它可能導致其他副作用。但是,它有可能解決您的問題)。

5.調整GC線程數

對於GC日誌中報告的每個GC事件,將列印用戶,sys和實時。例:

[ 時間:用戶= 25.56 sys = 0.35,實際= 20.48 秒 ]

要了解這些時間之間的區別,請 閱讀本文。(我強烈建議您在繼續本節之前先閱讀本文)。如果在GC事件中,您始終注意到「實時」時間並不比「用戶」時間顯著少,則可能表明GC線程不足。考慮增加GC線程數。假設「用戶」時間為25秒,並且您已將GC線程數配置為5,那麼實際時間應接近5秒(因為25秒/ 5個線程= 5秒)。

警告:添加過多的GC線程將消耗大量CPU,並佔用應用程式資源。因此,您需要在增加GC線程數之前進行徹底的測試。

6.後臺IO流量

如果文件系統的I / O活動繁重(即發生大量讀寫操作),這也可能導致長時間的GC暫停。這種繁重的文件系統I / O活動可能不是由您的應用程式引起的。可能是由同一臺伺服器上運行的另一個進程引起的。仍然可能導致您的應用程式遭受長時間的GC暫停。這是LinkedIn工程師的精彩 文章 ,詳細介紹了此問題。

當繁瑣的I / O活動時,您會注意到「實時」時間明顯高於「用戶」時間。例:

[ 時間:用戶= 0.20 sys = 0.01,實際= 18.45 秒 ]

發生這種情況時,以下是一些可能的解決方案:

如果您的應用程式引起了很高的I / O活動,請對其進行優化。

消除導致伺服器上大量I / O活動的進程。

將您的應用程式移到I / O活動較少的其他伺服器上。

提示:如何監視I / O活動

您可以在Unix中使用sar (系統活動報告) 監視I / O活動 。例:

sar -d -p 1

上面的命令每1秒報告一次對設備的讀取/秒和寫入/秒。有關「 sar」命令的更多詳細信息,請參考 本教程。

7. System.gc()調用

當 System.gc()的 或 調用Runtime.getRuntime()。GC() 方法調用被調用時,它會導致停止的世界充滿選區。在世界各地的完整GC期間,整個JVM被凍結(即,在此期間將不執行任何用戶活動)。從以下來源之一進行System.gc()調用:

1. 您自己的開發人員可能會顯式調用System.gc()方法。

2. 它可能是第三方庫,框架,有時甚至是您使用的應用程式伺服器。任何這些都可能調用System.gc()方法。

3. 可以通過使用JMX從外部工具(如VisualVM)觸發。

4. 如果您的應用程式正在使用RMI,則RMI會定期調用System.gc()。可以使用以下系統屬性來配置此間隔:

-Dsun.rmi.dgc.server.gcInterval=n

-Dsun.rmi.dgc.client.gcInterval=n

評估是否絕對需要顯式調用System.gc()。如果不需要,請刪除它。另一方面,可以通過傳遞JVM參數來強制禁用System.gc()調用:-XX:+ DisableExplicitGC

最後,開發這麼多年我也總結了一套學習Java的資料與面試題,如果你在技術上面想提升自己的話,可以關注我,私信發送領取資料或者在評論區留下自己的聯繫方式,有時間記得幫我點下轉發讓跟多的人看到哦。

相關焦點

  • JVM 解剖公園:JNI 臨界區與 GC Locker
    問題JNI `Get*Critical` 如何與 GC 配合?GC Locker 是什麼?3.但是,如何使用這些函數有很多限制。實際運行的效果又該如何?4. 實驗像往常一樣,接下來通過設計實驗來申請 JNI 關鍵區 的 `int[]` 數組,然後「故意違反」指南中的建議釋放該數組。
  • 長時間曝光攝影如何運用?慢門攝影技巧
    長曝光(慢門),顧名思義就是延長快門獲取長時間的曝光,相機不再是捕捉一個短暫的瞬間,而是記錄一個時間段的畫面變化。那麼長時間曝光攝影如何運用呢?使用ND鏡主要的目的是防止過曝,如果光線太亮就很難選擇較慢的快門速度拍攝,這時使用ND鏡減少進入鏡頭的光線,就能夠使用較慢的快門拍攝了。不得不說,ND鏡使得長曝光更廣泛被使用。
  • 長時間曝光攝影入門指南
    很少能見到長時間曝光攝影師會使用HDR攝影或後期添加紋理層這類技術。什麼是長時間曝光攝影?目前還並沒有準確的定義。我認為長時間曝光攝影是曝光時間在1/10秒以上的攝影,但我確信有些攝影師認為它是曝光時間在1分鐘以上的攝影。這些目的都是相同的:通過足夠長的曝光時長,記錄景象中的變動,如水的波動,使之模糊化,以創造出迷人的超現實畫面。
  • 59家國際航空公司減少或暫停往返中國航班情況!
    受新型冠狀病毒感染的肺炎疫情影響,全球多家航空公司調整對華運力,減少或停飛了往來中國的航班。再次提醒大家,近期如有出行計劃,請提前做好安排,以免耽誤行程!據不完全統計,目前已宣布減少或暫停中國航線的航空公司如下:1. 美國聯合航空2月6日至3月28日期間,除每日1班舊金山-香港外,所有中美航線暫停運營。
  • 酒店旅遊業周報|受疫情影響各國減少航班,酒店郵輪暫停營業;日本...
    來源:全球企業動態本周焦點:受疫情影響,各國紛紛減少甚至暫停航班。美國暫停多數國家的常規籤證服務,澳大利亞、紐西蘭、韓國等國家也先後宣布對旅客實施入境管制。希爾頓因疫情計劃關閉美國大部分酒店。嘉年華旗下四家郵輪品牌將暫停運營一個月。
  • RNG的經理提到時空回顧的長時間停頓使小虎耳鳴加重
    前言JDG反饋遊戲問題,裁判決定利用時空休息那些觀看夏季賽JDGvsRNG的人可能都知道遊戲在第一局暫停了很長一段時間,顯然是在處理遊戲中的一個非常大的變化。當時,JDG協助綠髮的電話被暫停,當綠髮用鐵錘石把燈籠扔到yagao橫穿牆壁時,燈籠沒有穿過牆直接掉到他的腳下,接到反饋後,裁判立即暫停比賽。經過長時間的測試和談判,裁判最終決定使用時空斷裂技術,將比賽追溯到「死球時間」之前,綠髮扔燈籠。
  • 線上一次fullgc搞得雞飛狗跳後,我總結了這篇文章
    考慮堆轉儲過程中會暫停程序,因此我們先從服務管理平臺摘掉了此節點,然後通過以下命令dump堆內存:jmap -dump:format=b,file=heap 7276通過JVisualVM工具導入dump出來的堆內存文件,同樣可以看到各個對象所佔空間,其中int[]佔到了50%以上的內存,進一步往下便可以找到 int[]
  • 彈簧夾頭套筒廠家教你如何減少彈簧夾頭的磨損問題?
    彈簧夾頭套筒廠家教你如何減少彈簧夾頭的磨損問題?任何產品長時間的使用都會產生磨損,對於彈簧夾頭來說,如果磨損超過一定限度就會出現夾不牢工件的問題現象,這會直接影響加工精度和生產效率,無形中增加了夾具的製造成本,給企業帶來了巨大的經濟損失。
  • 暫停赴臺自由行 島內該如何理解?
    「鑑於當前兩岸關係,決定自2019年8月1日起暫停47個城市大陸居民赴臺個人遊試點。特此公告。」周三,文化和旅遊部下轄海峽兩岸旅遊交流協會一則41字的公告震動了臺灣島內。這是大陸方面首次對赴臺自由行進行限制。臺灣旅遊業預估,此舉將導致大陸遊客減少超過70萬人次,相當於每年約260萬人次赴臺遊客總數的26%。
  • 長時間曝光需要注意的問題
    不過對於長時間打開快門,有許多潛在的錯誤是必須要避開的,一些原本些微的變化,都會因為時間的拉長而成為明顯的問題,所以拍攝過程影響結果的變數更多。低估了風和振動長時間曝光需要相機和鏡頭能保持在一個極度穩定、不搖晃的狀態。
  • 「JVM第八篇——垃圾回收」GC和GC算法
    2、如何判斷垃圾2.1、引用計數算法垃圾回收操作應該有如下兩種行為:①判斷那些對象屬於垃圾。②將判斷為垃圾的對象清除。首先是判斷對象是否存活(是否已成為垃圾)。* * 1、先不顯式地執行GC,看堆區中的佔用情況 * 2、顯式地執行垃圾回收,再看堆區中的佔用情況 * 使用虛擬機參數列印出GC細節:-XX:+PrintGCDetaile */ System.gc(); }}則在為引用類型obj1和obj2賦值,以及為他們所指向的對象的屬性ref賦值後,他們在內存中關係圖如下
  • 長時間曝光拍攝技巧指南,揭秘簡單易學的拍攝方法!
    在下文中,讓我們將分享七個長時間曝光拍攝技巧,為大家解決拍攝中的一些困惑。1、解決相機抖動問題拍攝長時間曝光作品時,最害怕的就是相機的抖動。長時間曝光意味著將快門速度設置遠遠超過正常時間,儘管沒有明確的時間設置,通常我們可以認為曝光時間超過10秒左右的就可以算是長時間曝光了。瀑布或湖泊就是最典型的例子。這時,我們首先要保證相機穩定,出現輕微的晃動都會對照片造成影響。
  • 如何減少皮下脂肪
    因此想解決肥胖問題就是要想辦法減少皮下脂肪,具體如何減少皮下脂肪,確實要找對方法。 肥胖與脂肪有直接關係,脂肪多少決定了肥瘦程度,平時飲食方面沒有做好控制,長期出現暴飲暴食,熱量攝入過多的現象就會使皮下脂肪越來越厚,形成肥胖。因此想解決肥胖問題就是要想辦法減少皮下脂肪,具體如何減少皮下脂肪,確實要找對方法。
  • 快訊 | 義大利米蘭斯卡拉歌劇院將暫停演出,為減少疫情擴散做出提前響應
    2020年2月23日,義大利米蘭斯卡拉歌劇院官方臉書宣布,為減少聚集、防止冠狀病毒的擴散,劇院將做出提前響應,暫停近期在劇院的所有演出項目,並為已售出的演出票進行退票處理。在近一個月內,可能涉及暫停的演出為2月23日歌唱家Aleksandra Kurzak和鋼琴家Julius Drake的音樂會、3月8-31日理查·施特勞斯的歌劇《莎樂美》、3月22日-4月16日即將世界首演的芭蕾作品《麥地那 (Medina)》。
  • 大連人:暫停 !暫停 !暫停 !
    1月12日,洛陽白馬寺發布通知,為積極配合疫情防控要求,響應上級領導部門號召,白馬寺將於2021年1月13日起暫停對外開放,暫停集體宗教活動,具體開放時間另行通知。「雙暫停」期間,白馬寺常住師父自行誦經祈福,希望廣大善信非必要不外出,不聚集。
  • 肥胖與阻塞性睡眠呼吸暫停
    因為,這類人可能患上了一種叫「睡眠呼吸暫停」的疾病。那麼,什麼是睡眠呼吸暫停?睡眠呼吸暫停又稱睡眠呼吸暫停低通氣症候群(SAHS),是指各種原因導致睡眠狀態下反覆出現呼吸暫停,因通氣不足而憋醒導致睡眠中斷,從而使機體發生一系列病變的臨床症候群。睡眠呼吸暫停大致分成2個類型。一類是「中樞性睡眠呼吸暫停」,主要因為呼吸中樞神經受損致睡眠時呼吸暫停。
  • 英雄聯盟如果被封號一周該如何減少懲罰時間?
    在一個公平的遊戲環境下,隨著中國禁賽玩家的數量越來越多,所以我提出了lol如何減少禁賽天數的方法供你參考。二、不要出現消極態度第一次違規只作記錄;第二次違規的,給予警告;第三次違規將暫停24小時;第四次違規,帳戶凍結7天;五分之一或更多將被永久凍結。PS:如果你沒有任何違規超過兩周,它將清除你所有的違規並重新加起來。
  • gc車隊又誅仙!最後結局神反轉?
    這時隊友的倒地引起gc車隊的注意,超遠距離連續的命中,判斷出對方可能是外掛車隊,於是犄角與隊友改變戰術,先到安全區,在與之抗衡。在經歷了幾波拉槍後,犄角與隊友多次配合,封煙作掩護。隊友還是被外掛擊倒。犄角抓住空隙成功擊殺外掛車隊極限吃雞,這波極限操作引發網友的稱讚!
  • 【GC系列】JVM的常用GC參數及GC日誌解析
    常見垃圾回收器組合設定在oracle官網上可以看到如何開啟使用指定垃圾回收的命令:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
  • 長時間曝光常犯的錯誤
    在2015年,我在義大利開設的所有研討班上都會做一個小調查。今天,我來對10個最常在長曝光攝影中犯的錯誤來進行說明。 錯誤一:防抖系統設置為開啟狀態防抖性能可以幫助我們獲得更加銳利的圖像,並且減少由於機身震動所帶來的模糊,在我們進行弱光慢速攝影時非常有用。