精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

成人精品三级| 奇米影视888狠狠狠777不卡| 国产精品97| 日韩视频免费观看高清在线视频| 日本免费a视频| 同心难改在线观看| 免费观看一级特黄欧美大片| 久久99亚洲热视| 中文字幕日韩三级片| 欧美影视资讯| 亚洲一级片在线观看| 欧美日韩亚洲综合一区二区三区激情在线 | 24小时免费看片在线观看| 2023国产精品| 亚洲一区免费网站| 日韩精品在线观看免费| 国产精品99久久| 日韩精品免费综合视频在线播放| 激情五月婷婷基地| 亚洲同志男男gay1069网站| 最新久久zyz资源站| 久久国产精品高清| 99热这里只有精品在线观看| 日韩精品一卡二卡三卡四卡无卡| 欧美国产乱视频| 东京热无码av男人的天堂| 91成人在线精品视频| 欧美日韩免费观看一区二区三区| 精品国产一区三区| 成人免费网址| 国产精品色眯眯| 久久综合九色综合久99| www天堂在线| 久久99国产精品久久99| 日韩av手机在线看| 91在线看视频| 欧美日本二区| 久久国产精品久久国产精品| 成人在线观看免费高清| 一区二区三区四区在线看| 精品国产伦一区二区三区观看体验 | 色天天综合色天天久久| 成人网站免费观看入口| 麻豆免费在线视频| 国产精品热久久久久夜色精品三区| 美国av一区二区三区| 欧美一级做性受免费大片免费| 激情av综合网| 成人精品一区二区三区| 伊人网av在线| 麻豆成人久久精品二区三区红| 欧美在线视频导航| 亚洲男人第一av| 中文欧美日韩| 91国内精品久久| 自拍偷拍欧美亚洲| 黄色av日韩| 欧美激情videos| 久久久精品视频免费观看| 亚洲国产精品91| 久久网福利资源网站| 成人18视频免费69| 视频在线不卡免费观看| 色婷婷久久av| www欧美com| 午夜精品久久| 欧美激情第一页xxx| 国产在线欧美在线| 99综合在线| 日本免费在线精品| 亚洲 日本 欧美 中文幕| 老司机亚洲精品| 国产精品美女在线| 一级日韩一级欧美| 国产美女精品在线| 国产亚洲精品久久飘花| 亚洲 精品 综合 精品 自拍| 久久免费的精品国产v∧| 日本一区高清不卡| 欧美日韩在线资源| 一区二区三区四区精品在线视频 | 99国产精品视频免费观看一公开| 午夜欧美不卡精品aaaaa| 天天综合天天干| 日韩在线一二三区| 91色精品视频在线| 人妻一区二区三区| 久久久久久久精| 亚洲精品永久www嫩草| h片在线观看网站| 亚州成人在线电影| 香蕉视频网站入口| 欧美另类中文字幕| 日韩久久精品电影| 蜜桃视频最新网址| 亚洲福利精品| 国产噜噜噜噜久久久久久久久| 国产美女明星三级做爰| 91免费视频网址| 在线精品亚洲一区二区| 丁香影院在线| 欧美色倩网站大全免费| 日本黄色大片在线观看| 精品视频免费在线观看| 色综合视频网站| 亚洲图片欧美日韩| 国产高清久久久| 视频在线99re| 1区2区3区在线| 欧美日韩亚洲国产综合| 在线视频 日韩| 99精品网站| 1769国产精品| 精品人妻一区二区三区日产乱码| 久久精品人人做人人爽97| 国产人妻人伦精品| 国产三级一区| 日韩精品在线观看一区| 亚洲mv在线观看| 国产传媒一区| 自拍视频在线网| 婷婷久久综合九色国产成人| 国产成人美女视频| 欧洲杯半决赛直播| 97视频在线观看成人| 99精品视频在线播放免费| 欧美国产精品中文字幕| 欧美精品久久久久久久免费| 精品国产伦一区二区三区观看说明 | 成人aa视频在线观看| 一区二区av| 免费污视频在线一区| 亚洲成色999久久网站| 侵犯稚嫩小箩莉h文系列小说| 久久一二三区| 久久久久久国产精品免费免费| 中文字幕资源网在线观看| 欧美日韩精品一区二区三区蜜桃 | 最新热久久免费视频| 日韩中文字幕组| 日韩av影院| 国色天香2019中文字幕在线观看| 国产情侣av在线| 国产精品电影一区二区| 狠狠热免费视频| 国产videos久久| 国产91在线播放九色快色| 神马精品久久| 黑人狂躁日本妞一区二区三区| 黄色国产在线视频| 最新成人av网站| 超碰97人人在线| 羞羞电影在线观看www| 91精品福利在线一区二区三区| 精品在线观看一区| 久久66热re国产| 特级黄色录像片| 亚洲资源在线| 欧美另类99xxxxx| 亚洲av无码乱码国产麻豆| 一区二区三区91| 亚洲欧美高清在线| 国产精品久久久久久模特| 久草热久草热线频97精品| 女厕盗摄一区二区三区| 亚洲精品有码在线| 波多野结衣视频免费观看| 日本一区二区视频在线| 亚洲娇小娇小娇小| 亚洲国产精品久久久天堂 | 欧美老女人xx| 欧美 日韩 国产 成人 在线| 亚洲成人精品一区| 人妻丰满熟妇aⅴ无码| 丝袜亚洲另类欧美| 正在播放精油久久| 伊人精品久久| 97超级碰碰碰久久久| 国际av在线| 欧美高清dvd| 精品肉丝脚一区二区三区| 99国产精品国产精品毛片| 成熟老妇女视频| 日韩欧美网址| 高清国产一区| av有声小说一区二区三区| 日韩一级黄色av| 国产91久久久| 91黄色在线观看| 好吊日在线视频| 91在线一区二区三区| 亚洲一级免费观看| 欧美日韩蜜桃| 国产一区二区三区av在线| 色综合天天色| 国内偷自视频区视频综合| 国产高清视频在线| 日韩欧美中文字幕一区| 欧美黄色一级大片| 亚洲精品视频在线观看网站| 日本黄色特级片| 国产一区二区视频在线| 可以免费观看av毛片| 午夜精品av| 午夜老司机精品| 久久这里只有精品一区二区| 国产日韩在线播放| 深夜福利视频一区二区| 久久人人爽人人爽人人片亚洲| 成人av一区二区三区在线观看 | 亚洲视频在线观看一区二区| 欧美日韩国产精品一区二区三区四区 | 国产精品久久国产| 精品香蕉视频| 久久亚洲综合网| 精品麻豆剧传媒av国产九九九| 91chinesevideo永久地址| 成人欧美在线| 少妇av一区二区三区| 免费在线一级视频| 精品国免费一区二区三区| 国产精品视频在线观看免费| 日韩欧美国产高清91| 青青操国产视频| 中文字幕一区二区三区在线不卡| 国产精品无码午夜福利| 成人成人成人在线视频| ass极品水嫩小美女ass| 蜜桃一区二区三区在线观看| 97在线免费公开视频| 亚洲精品视频啊美女在线直播| 中文字幕欧美人与畜| 欧美色女视频| 日本一区二区三区精品视频| 婷婷五月色综合香五月| 精品国产一区二区三区免费| 亚洲天堂av资源在线观看| 成人有码在线播放| 四虎国产精品免费久久| 国产日韩欧美在线播放| 国产欧美在线观看免费| 国产精品劲爆视频| 高清不卡av| 国产91色在线|免| 免费电影日韩网站| 庆余年2免费日韩剧观看大牛| segui88久久综合9999| 久久久久久久久久av| 欧美极品少妇videossex| 欧美成人精品在线观看| 超碰免费在线播放| 久久成年人视频| 青春草视频在线观看| 久久99国产综合精品女同 | 全球成人中文在线| 亚洲第一二三四区| 国产精品久久久久久久午夜| 深夜视频一区二区| 国产日韩精品在线播放| aa亚洲一区一区三区| 亚洲最大福利视频| 欧美黄页免费| 97在线电影| 动漫视频在线一区| 久久婷婷国产综合尤物精品| 久久99高清| 在线观看福利一区| 欧美日韩调教| 欧美日韩二三区| 丝瓜av网站精品一区二区| 久久久久久久久久久久91| 精品系列免费在线观看| 亚洲最大视频网| www国产成人免费观看视频 深夜成人网 | 亚洲国产成人精品激情在线| 色婷婷久久综合| 91av久久久| 精品国产一区二区三区忘忧草| 国产精品国产高清国产| 中文字幕亚洲欧美在线| 手机在线免费看av| 国产91av在线| 日韩毛片免费视频一级特黄| 成人av网站观看| 久久av中文| 女女百合国产免费网站| 国产色综合网| gai在线观看免费高清| 成熟亚洲日本毛茸茸凸凹| 永久免费看mv网站入口78| 国产精品高潮久久久久无| 国产一级久久久| 欧美在线视频不卡| 亚洲国产精品久久久久久久| 亚洲男人第一av网站| 国产在线1区| 国产91精品黑色丝袜高跟鞋| 91精品国产一区二区在线观看 | 午夜一级免费视频| 菠萝蜜视频在线观看一区| 亚洲最大成人综合网| 亚洲一二三四在线观看| 老熟妇一区二区三区啪啪| 日韩精品一区二区在线观看| 国产大学生校花援交在线播放| 欧美成在线视频| jizz欧美| 久久精品一区二区三区不卡免费视频| 日韩精品水蜜桃| 无罩大乳的熟妇正在播放| 国产精品自拍av| 加勒比综合在线| 亚洲青青青在线视频| 日韩av大片在线观看| 欧美一区二区三区不卡| 国产小视频免费在线观看| 午夜精品久久久久久久白皮肤| 亚洲伊人伊成久久人综合网| 色吧亚洲视频| 免费日韩av片| 性久久久久久久久久久| 亚洲人成亚洲人成在线观看图片 | 精品欧美一区二区三区久久久 | 国产午夜精品久久| 日韩污视频在线观看| 日韩手机在线导航| 欧美三级黄网| 国产精品一区二区三区成人| 综合亚洲自拍| 欧美三级在线观看视频| 国产不卡在线视频| 顶臀精品视频www| 欧美日韩mp4| av男人的天堂在线| 国产国语videosex另类| 欧美黑人巨大videos精品| 真人抽搐一进一出视频| 国产成人午夜99999| 91视频综合网| 欧美高清你懂得| 国产在线一区二区视频| 91欧美精品午夜性色福利在线| 久久精品久久久| 中文字幕精品一区二区三区在线| 中文字幕乱码亚洲精品一区| 中文无码av一区二区三区| 亚洲最新av在线网站| 亚洲不卡系列| 亚洲欧洲日韩综合二区| 美国欧美日韩国产在线播放 | 亚洲影院久久精品| 国产黄a三级三级三级| 欧美黄色片视频| 卡通动漫精品一区二区三区| 久久久性生活视频| 99久久国产综合精品女不卡| www..com国产| 亚洲日韩欧美视频一区| 一二区成人影院电影网| 天堂资源在线亚洲视频| 久久精品国产亚洲高清剧情介绍 | 视频在线不卡免费观看| 亚洲欧美天堂在线| 亚洲激情中文1区| 六月丁香色婷婷| 欧美一区在线直播| 国产一区二区三区日韩精品 | 在线能看的av| 亚洲人免费视频| 国产精品66| 黄色特一级视频| 99免费精品在线| 日韩黄色片网站| 久久这里只有精品99| 亚洲一区二区三区在线免费| 怡红院av亚洲一区二区三区h| 久久久国产精华| 国产视频www| 91成人在线观看国产| 欧美午夜精品一区二区三区电影| 亚洲久久中文字幕| 亚洲国产欧美一区二区三区丁香婷| 五十路在线观看| 国产精品免费视频xxxx| 中文精品久久| 久久久久久久久免费看无码| 欧美视频自拍偷拍| 久久99亚洲网美利坚合众国| 蜜桃视频在线观看成人| 国内精品写真在线观看| 日韩av在线播| 在线看国产精品| 99国产精品久久一区二区三区| 日韩a在线播放| 亚洲人吸女人奶水| 黄色电影免费在线看| 91福利视频导航| 日本在线不卡视频| 久久高清免费视频| 久久精品国产v日韩v亚洲|