精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

揪出一個導(dǎo)致GC慢慢變長的JVM設(shè)計缺陷

開發(fā) 開發(fā)工具
Java 堆分為新生代和老生代,YGC 其實就是針對新生代的垃圾回收,對象都是優(yōu)先在新生代分配的,因此當新生代內(nèi)存不夠分配的時候就會觸發(fā)垃圾回收,正常情況下可能觸發(fā)一次 YGC 就可以解決問題并正常分配的,當然也有極端情況可能要進行大掃除,對整個堆進行回收,也就是我們說的 Full GC,這種情況發(fā)生就會比較悲劇了。

今天要給大家分享的內(nèi)容和 YGC(Young GC)有關(guān),是我最近碰到的一個案例,希望將排查思路分享給大家,如果大家后面碰到類似的問題,可以直接作為一個經(jīng)驗來排查。

我之前里寫過幾篇 YGC 的文章,也許其中有人已經(jīng)看過了,沒看過的可以去看看,那兩個坑在這里就不再描述,大家可以直接當經(jīng)驗使用。

Java 堆分為新生代和老生代,YGC 其實就是針對新生代的垃圾回收,對象都是優(yōu)先在新生代分配的,因此當新生代內(nèi)存不夠分配的時候就會觸發(fā)垃圾回收,正常情況下可能觸發(fā)一次 YGC 就可以解決問題并正常分配的,當然也有極端情況可能要進行大掃除,對整個堆進行回收,也就是我們說的 Full GC,這種情況發(fā)生就會比較悲劇了。

這里再提一下,YGC 也是會 STW(stop the world) 的,也就是會暫停整個應(yīng)用,不要覺得 YGC 發(fā)生頻繁不是問題。

說實話我比較不喜歡排查 YGC 的問題,因為 YGC 的日志太簡單了,正常情況下只能知道新生代內(nèi)存從多少變到了多少,花了多長時間,再無其它信息了。

所以當有人來咨詢?yōu)槭裁次业某绦?YGC 越來越長的問題的時候,我其實是抗拒的,不過也無奈,總得嘗試去幫人家解決,包括前面說的那兩個問題,也是費了不少精力查出來的,希望大家珍惜。。。

有些時候你越想逃避,偏偏就會找上你,YGC 的問題最近說實話找我的挺多的,不過有好些都是踩過的坑,所以能順利幫人家解決,但是今天要說的這個問題是之前從未碰到過的,是一個全新的問題,所以也費了我不少精力,也因為其他問題要查被拖延了幾天。

這個問題最終排查下來其實是 JVM 本身設(shè)計上面的一個缺陷,我改天也會提到 openjdk 社區(qū)去和大家一起討論下這個設(shè)計,希望能徹底***這個問題。

這個問題現(xiàn)象也很明顯,就是發(fā)現(xiàn) YGC 的時間越來越長,從 20ms 慢慢增加到100ms+,甚至還一直在漲。

不過這個增長過程還是挺緩慢的,其實 YGC 時間在幾十毫秒我個人認為算正常現(xiàn)象,沒必要去深究,再說了還是經(jīng)過壓測了一個晚上才漲上來的,所以平時應(yīng)該也不是啥問題吧,不過這次正巧趕上年中大促,所以大家對時間也比較敏感,便接手來排查這個案例了。

首先排除了之前碰到的幾種情況,然后我要同事加了一個我們 alijdk 特定的參數(shù),可以打印 YGC 過程里具體各個階段的耗時情況,可惜的是并沒有找出問題,因為我們漏掉了一些點,導(dǎo)致沒有直接定位出來。

于是我懷疑那些沒跟蹤到的邏輯,首先懷疑的就是引用這塊的處理,所以叫同事加上了 -XX:+PrintReferenceGC 這個參數(shù),這個參數(shù)會打印各種引用的處理時間,大概如下:

點擊下面圖片進入小程序查看PrintReferenceGC參數(shù)詳情

從當時的那個日志里,我發(fā)現(xiàn)了一個現(xiàn)象,就是隨著 YGC 時間的增長,JNI Weak Reference 的處理耗時也在不斷增長,所以基本就定位到了 YGC 增長的直接原因。

JNI Weak Reference 到底是什么呢?大家都知道 Java 層面有各種引用,包括 SoftReference,WeakReference 等,其中 WeakReference 可以保證在 GC 的時候不會阻礙其引用對象的回收,同樣的在 native 代碼里,我們也可以做類似的事情,有個叫做 JNIHandles::make_weak_global 的方法來達到這樣的效果。

于是我開始修改 JVM,嘗試打印一些信息出來,不知道大家注意過,我們 dump 線程的時候,使用 jstack 命令,***一條輸出里會看到類似 JNI global references: 328 的日志,這里其實就是打印了 JNI 里的兩種全局引用總數(shù),分別是 _global_handles 和 _weak_global_handles。

于是嘗試將這兩種情況分開來,看具體哪種有多少個,于是改了***個版本,從修改之后的輸出來看,_global_handles 的引用個數(shù)基本穩(wěn)定不變,但是 _weak_global_handles 的變化卻比較明顯。

至此也算佐證了 JNI Weak Reference的問題,于是我想再次修改 JVM,打印了這些 JNI Weak Reference 引用的具體對象是什么對象。

在每次我執(zhí)行 jstack 時,就會順帶把那些對象都打印出來,當然那個時候是為了性能,畢竟程序還跑在線上,不敢動太大,比如要是大量輸出日志不可控,那就麻煩了,所以就借助 jstack 來手動觸發(fā)這個邏輯。

從輸出來看,看到了大量的下面的內(nèi)容:

于是詢問同事是不是存在大量的 Java 對 JavaScript 的調(diào)用,被告知確實有使用,那問題點基本算定位到了,我馬上要同事針對他們的用法寫一個簡單的 demo 出來復(fù)現(xiàn)下問題。

沒想到很快就寫好,而且真的很容易復(fù)現(xiàn),大概邏輯如下:

于是我開始 debug,最終確認和上面的 demo 完全等價于下面的 demo。

所以大家直接運行上面的 demo 就能復(fù)現(xiàn)問題,JVM 參數(shù)如下:

  1. -Xmx300M -Xms300M -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintReferenceGC 

對了,運行平臺是 JDK 8,JDK 6 是不存在這個問題的,因為 invokedynamic 指令以及 nashorn 是在 JDK 6 里不存在的。

上面的 demo 看起來是不是沒毛病,但是卻真的會讓你的 GC 越來越慢,通過對 JVM 進行 debug 的方式抓出了下面的類似堆棧。

在 JDK 層面的棧如下:

最上面的 resolve 方法是一個 native 方法,這個方法發(fā)現(xiàn)可以直接調(diào)用到上面提到的 JNIHandles::make_weak_global 方法。

JNIHandles::make_weak_global 方法其實就是創(chuàng)建了一個 JNI Weak Reference。

在這里我要稍微描述下了,因為太繁瑣就不準備貼代碼了。

JVM 里有個數(shù)據(jù)結(jié)構(gòu)叫做 JNIHandleBlock,之前提到了 global_handles 和 _weak_global_handles,其實他們都是一個 JNIHandleBlock 鏈表。

可以想象下里面有個 next 字段鏈到下一個 JNIHandleBlock,同時里面還有一個數(shù)組 _handle[],長度是 32,當我們要分配一個 JNI Weak Reference 的時候,就相當于在這個 JNIHandleBlock 鏈表里找一個空閑的位置(就是那些 _handle 數(shù)組),如果發(fā)現(xiàn)每個 JNIHandleBlock 的 _handle 數(shù)組都滿了,就會創(chuàng)建一個新的 JNIHandleBlock,然后加到鏈里,注意這個鏈可以***長,所以問題就來了,假如我們上層代碼不斷觸發(fā)底層調(diào)用 JNIHandles::make_weak_global 來創(chuàng)建一個 JNI Weak Reference,那是不是意味著這個 JNIHandleBlock 鏈會不斷增長,那會不會無窮增長呢,答案是肯定的,既然有創(chuàng)建 JNI Weak Reference 的 API,是不是也存在銷毀 JNI Weak Reference 的 API?

當然是存在的,可以看到有 JNIHandles::destroy_weak_global 方法,這個實現(xiàn)其實很簡單,就是相當于設(shè)計一個標記,表示這個數(shù)組里的這個位置是可以重用的了,在 GC 發(fā)生的時候,如果發(fā)現(xiàn)這個坑被標記了,于是就將這個坑加入到一個 free_list 里,當我們下面再想要分配一個 JNI Weak Reference 的時候,就可以有機會從 free_list 里去分配一個重用了。

但是這個 api 是在什么情況下才能調(diào)用的呢,其實只有在類卸載的時候才會去調(diào)用這個 api,那到底是什么類被卸載了,那就是調(diào)用了 MethodHandles.lookup() 這個方法的那個類,從我們上面的 demo 來看,就是 MHTest 這個主類本身,從同事給我的 demo 來看,其實是 jdk.nashorn.internal.runtime.Context 這個類,但是這個類其實是被 ext_classloader 加載的,也就是說這個類根本就不會被卸載,不能卸載那問題就嚴重了,意味著 GC 發(fā)生的時候并不能將那些引用對象已經(jīng)死掉的坑置空,這樣在我們需要再次分配 JNI Weak Reference 的時候,沒有機會來重用那些坑,最終的結(jié)果就是不斷地創(chuàng)建新的 JNIHandleBlock 加到鏈表里,導(dǎo)致鏈表越來越長,然而 GC 的時候是會去不斷掃描這個鏈表的,因此看到 GC 的時候也會越來越長。

那還有一個問題,假如說調(diào)用 MethodHandles.lookup() 的類真的被卸載了還存在這個問題嗎,答案是 GC 時間不會再惡化了,但是之前已經(jīng)達到的惡化結(jié)果已經(jīng)無法再修復(fù)了。

所以,這算是一個 JVM 設(shè)計上的缺陷吧,只要 Java 層面能觸發(fā)不斷調(diào)用到JNIHandles::make_weak_global,那這個問題將會立馬重現(xiàn)。

其實解決方案我也想了一個,就是在遍歷這些 JNIHandleBlock 的時候,如果發(fā)現(xiàn)對應(yīng)的_handle數(shù)組全是空的話,那就直接將 JNIHandleBlock 回收掉,這樣在 GC 發(fā)生的過程中并不會掃描到很多的 JNIHandleBlock 而耗時掉。

至于同事的那個問題的解決方案,其實也簡單,對于同一個 JavaScript 腳本,不要每次都去調(diào)用 eval 方法,可以緩存起來,這樣就減少了不斷去觸發(fā)調(diào)用 JNIHandles::make_weak_global 的動作從而可以避免 JNIHandleBlock 不斷增長的問題。

【本文是51CTO專欄作者李嘉鵬的原創(chuàng)文章,轉(zhuǎn)載請通過微信公眾號(你假笨,id:lovestblog)聯(lián)系作者本人獲取授權(quán)】

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2017-04-17 11:07:19

GC數(shù)組動態(tài)擴容

2015-06-15 12:30:10

Hadooplong編碼剖析

2009-10-27 09:05:44

Windows 7進程查看

2011-06-30 16:10:01

JavaScript

2021-11-12 08:07:31

SQL緩存RabbitMQ

2020-07-29 15:01:50

JVMGCJDK

2023-03-29 16:31:09

2015-07-29 10:28:59

JVM參數(shù)配置參數(shù)

2012-08-16 10:43:10

GC

2021-09-11 19:00:54

Intro元素MemoryCache

2013-07-01 11:01:22

API設(shè)計API

2018-11-22 14:09:45

iOS架構(gòu)組件開發(fā)

2011-11-01 16:57:22

iOS 5蘋果iPhone4s

2017-09-26 16:32:03

JavaGC分析

2021-04-12 09:36:14

JVM生產(chǎn)問題JVM FULL GC

2024-04-24 10:38:22

2020-09-22 07:50:23

API接口業(yè)務(wù)

2021-05-28 18:12:51

C++設(shè)計

2024-11-20 13:18:21

2024-09-14 14:14:26

Dubbo框架微服務(wù)
點贊
收藏

51CTO技術(shù)棧公眾號

久久五月婷婷丁香社区| 欧美女激情福利| 欧美中文字幕久久| 青青视频免费在线| 天堂网av2014| 免费人成黄页网站在线一区二区| 久久的精品视频| 野花社区视频在线观看| 欧美一级做一级爱a做片性| 亚洲一区二区三区四区的| 日本不卡二区| 亚洲福利在线观看视频| 日韩成人免费电影| 久久久久久18| 精品一区二区在线观看视频| 久久香蕉精品香蕉| 在线播放中文一区| 国内外免费激情视频| 在线三级中文| 国产精品国产三级国产有无不卡| 国产精品一区视频| a天堂视频在线| 日本va欧美va精品发布| 91精品国产色综合| 精品99在线观看| 97精品国产福利一区二区三区| 欧美精品一区二区三区蜜臀| 日韩成人av免费| 免费污视频在线一区| 亚洲va韩国va欧美va| 91手机视频在线| 9191在线观看| 亚洲国产精品99久久久久久久久| 精品国产乱码久久久久久郑州公司| 国产女无套免费视频| 日本成人在线不卡视频| 5252色成人免费视频| 国产污视频在线看| 欧美激情偷拍| 欧美成人免费在线视频| 日韩免费av一区| 成人嫩草影院| 中文字幕日韩欧美在线| 摸摸摸bbb毛毛毛片| 最新国产精品视频| 精品一区二区三区四区| 朝桐光av一区二区三区| 国产精品99久久免费观看| 欧美日韩国产乱码电影| 日韩中文字幕a| 久久精品资源| 欧美高清视频不卡网| 五月天丁香花婷婷| 欧美一级片网址| 欧美一区二区三区精品| 中文字幕avav| youjizz亚洲| 精品国产露脸精彩对白| 黄色网址在线视频| 国产精品手机在线播放| 一区二区三区天堂av| 无码人妻丰满熟妇啪啪欧美| 三上亚洲一区二区| 日韩在线激情视频| 国产又粗又长免费视频| 日韩精品网站| 久久成人18免费网站| 久草视频在线免费看| 亚洲视频精品| 欧美与黑人午夜性猛交久久久| 亚洲综合图片网| 日韩1区2区3区| 成人写真福利网| 成人黄色免费视频| 99视频国产精品| 天堂精品视频| 91精选在线| 精品国产乱码久久久久酒店| 不要播放器的av网站| 日本欧美在线| 亚洲丁香婷深爱综合| 能免费看av的网站| 欧美福利在线| 日韩美女写真福利在线观看| 国产精品人人爽| 成人免费视频一区| 天天好比中文综合网| av激情在线| 一本到不卡精品视频在线观看| 手机看片福利日韩| 成人另类视频| 中文字幕亚洲综合| 欧美亚洲天堂网| 青青青伊人色综合久久| 99在线视频首页| 黄色av网站在线| 亚洲欧美日韩久久精品| 国产av天堂无码一区二区三区| 香蕉久久免费电影| 日韩精品一区国产麻豆| 日本少妇xxxxx| 亚洲网站视频| 国产精品扒开腿做爽爽爽视频 | 老司机精品久久| 91精品中文在线| 你懂的在线网址| 亚洲午夜电影在线| 黄色小视频免费网站| 亚洲美女久久| 国内揄拍国内精品| 99久久夜色精品国产亚洲| 国产亚洲欧美日韩俺去了| 日韩成人手机在线| 青青青国产精品| 亚洲人成电影网站色| 国产亚洲精品成人| 中文字幕免费看| 久久久久高潮毛片免费全部播放| 在线视频日本亚洲性| 国产做受高潮漫动| 国产福利精品一区| 伊人久久青草| 97成人超碰| 亚洲人成电影网站色| 日本三级网站在线观看| 国产福利一区二区三区| 亚洲欧美在线网| 欧美日韩成人影院| 日韩成人av网| 日产精品久久久久| 成人一区在线观看| 一本—道久久a久久精品蜜桃| 桃色一区二区| 亚洲欧美日韩在线高清直播| 国产无码精品久久久| 国产馆精品极品| 四虎4hu永久免费入口| 自拍偷拍亚洲图片| 精品国产拍在线观看| 亚洲视频一区在线播放| 国产亚洲精久久久久久| 国产精品无码专区av在线播放 | 91精品国产免费| 国产三级aaa| 九九国产精品视频| 日本黄色播放器| av日韩在线免费观看| 日韩在线不卡视频| 91肉色超薄丝袜脚交一区二区| 国产人久久人人人人爽| 日韩av手机版| 日本一区二区三区视频| 国产日韩在线视频| 国产素人视频在线观看| 欧美一区欧美二区| 久久久精品视频在线| 成人免费观看男女羞羞视频| 欧美日韩不卡在线视频| 加勒比视频一区| 欧美在线观看日本一区| 国产一区二区影视| 欧美日韩一区二区三区免费看| 手机毛片在线观看| 国产一区二区免费看| 男人天堂新网址| 亚洲三区欧美一区国产二区| 69国产精品成人在线播放| 三级视频在线| 欧美日韩精品一区二区三区| 免费在线观看h片| 成人夜色视频网站在线观看| 97国产精东麻豆人妻电影| 国产日产一区| 国产欧美一区二区三区四区| 中中文字幕av在线| 日韩av影视综合网| 在线观看国产区| 亚洲精品乱码久久久久久| 中文字幕免费高清视频| 日韩精品一级中文字幕精品视频免费观看| 亚洲欧美综合一区| 成人涩涩网站| 国产精品国语对白| 先锋成人av| 亚洲人成绝费网站色www| 国产一区二区视频免费观看| 亚洲国产精品嫩草影院| 婷婷色一区二区三区| 狠狠色综合播放一区二区| 2019日韩中文字幕mv| sdde在线播放一区二区| 99re视频在线播放| 日韩精品影院| 久久久久久久久久久成人| 高清av在线| 亚洲成色777777女色窝| 中文字幕1区2区3区| 亚洲成人免费电影| 视频国产一区二区| 久久综合精品国产一区二区三区| 日韩a一级欧美一级| 久久伊人亚洲| 无码粉嫩虎白一线天在线观看| 日韩欧美精品一区| 精品一区2区三区| 天堂综合在线播放| 国产成人精品av在线| 色综合999| 日韩中文字幕在线免费观看| 亚洲人视频在线观看| 日韩一级视频免费观看在线| 免费黄色片视频| 亚洲成人午夜影院| 在线免费日韩av| 国产精品久久久久久久浪潮网站| 粉嫩av懂色av蜜臀av分享| 国产精品综合一区二区三区| 国产区二区三区| 久久av在线| 欧美日韩不卡在线视频| 国产精品v日韩精品v欧美精品网站 | 国产成人激情小视频| www.综合| 久久久最新网址| 在线观看a级片| 久久影院资源网| av在线二区| 亚洲最新av在线| 蜜芽tv福利在线视频| 日韩电影中文字幕在线观看| 亚洲AV无码一区二区三区性| 8v天堂国产在线一区二区| 中日精品一色哟哟| 色菇凉天天综合网| www.欧美色| 色94色欧美sute亚洲线路一ni| 久久久久久久黄色片| 亚洲国产成人av好男人在线观看| 国产盗摄x88av| 亚洲尤物在线视频观看| 久久激情免费视频| 一区二区三区资源| 国产一级视频在线播放| 一区二区日韩电影| 久久久久久久久久综合| 亚洲国产成人tv| 女人十八岁毛片| 色婷婷av一区| 97人妻精品视频一区| 欧美日韩中字一区| 国产精品高潮呻吟AV无码| 51精品国自产在线| 后入内射欧美99二区视频| 亚洲成人久久电影| 天天干视频在线观看| 精品视频—区二区三区免费| 青青久在线视频| 一区二区三区视频免费| 黄色成人在线| 欧美极品在线播放| 国内激情视频在线观看| 日本午夜精品理论片a级appf发布| 黄色综合网址| 91精品久久久久久久久久入口| 亚洲资源在线| 国产精品av一区| 九九精品在线| 综合操久久久| 亚洲小说欧美另类社区| 日韩欧美亚洲天堂| 日本不卡免费在线视频| 久久精品一二三四| av成人免费在线| 国产精成人品免费观看| 亚洲欧美一区二区三区国产精品| 久久免费播放视频| 色婷婷av一区| 国产suv一区二区| 国产视频一区在线| 日本蜜桃在线观看| 亚州国产精品久久久| 99精品国自产在线| 国产91色在线|亚洲| 怕怕欧美视频免费大全| 91成人在线视频观看| 亚洲免费影院| 国产不卡的av| 国产欧美综合色| 国产小视频在线看| 欧美性受xxxx黑人xyx性爽| 精品人妻一区二区三区三区四区| 精品在线小视频| 婷婷色在线播放| 国产精品视频久| 欧美黑白配在线| 婷婷视频在线播放| 久久久久久亚洲精品杨幂换脸| 蜜桃福利午夜精品一区| 久久免费视频色| 精品无码久久久久久久久| 欧美天堂一区二区三区| 亚洲精品字幕在线| 色哟哟网站入口亚洲精品| a天堂资源在线| 亚洲自拍偷拍第一页| 狠狠操综合网| 成人毛片视频网站| 精品写真视频在线观看| 西西444www无码大胆| 亚洲福利视频导航| 国产精品一区二区免费视频| 亚洲欧美福利视频| 成人免费网站观看| av一区二区三区四区电影| 欧美一二区在线观看| 每日在线更新av| 成人久久久精品乱码一区二区三区| 久久久免费看片| 色综合久久久久综合体桃花网| 性中国xxx极品hd| 美女av一区二区三区| 欧美三级电影网址| 日韩av电影免费观看| 亚洲综合丁香| avtt香蕉久久| 亚洲va欧美va国产va天堂影院| 不卡视频免费在线观看| 久久精品国产69国产精品亚洲| 日本.亚洲电影| 日韩av电影免费观看| 久久精品亚洲| 亚洲乱码国产乱码精品精大量| 亚洲一级二级在线| www.日韩在线观看| 免费av一区二区| 国产精品一级在线观看| 一区二区三区四区五区视频| 视频一区二区三区中文字幕| 亚洲AV无码国产精品| 欧美日韩国产一区在线| 日韩av视屏| 国产激情久久久久| 日韩久久精品网| 天天干天天玩天天操| 亚洲视频资源在线| 国产特级黄色片| 久久99久国产精品黄毛片入口| 精品视频在线观看网站| 蜜桃网站在线观看| 国产aⅴ综合色| 日韩精品久久久久久久酒店| 亚洲国产精品yw在线观看| 亚洲淫成人影院| 亚洲精品不卡| 国产精品123区| 国产在线视频你懂的| 亚洲精品福利免费在线观看| 新版的欧美在线视频| 日韩国产欧美精品| 久久国产精品露脸对白| 全网免费在线播放视频入口 | 在线一区电影| 国产精品91av| 欧美日韩在线视频一区| 九色网友自拍视频手机在线| 国产精品成久久久久三级| 日韩中文首页| 污污免费在线观看| 色综合天天性综合| 免费观看久久久久| 国产经典一区二区三区| 久久婷婷久久| 伊人在线视频观看| 亚洲精品在线一区二区| 欧美理论影院| 国产精品一二三在线观看| 成人激情免费电影网址| 成人免费视频国产免费| 超碰日本道色综合久久综合| 精品国产午夜肉伦伦影院| 91色国产在线| 亚洲一区免费观看| 国产在线一二三区| 91久色国产| 久久精品一区二区国产| 天海翼在线视频| 日韩高清有码在线| 亚州精品国产| 国产精品无码专区av在线播放| 亚洲色图一区二区| 欧美日韩影视 | 日本天堂一区| 香蕉视频999| 欧美日韩激情视频8区| 免费在线观看av| 国外成人免费视频| 狠狠色丁香久久婷婷综| 国产黄色免费观看| 欧美福利视频在线| 久久激情电影|