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

JVM源碼分析之FinalReference完全解讀

開發 開發工具
JAVA對象引用體系除了強引用之外,出于對性能、可擴展性等方面考慮還特地實現了四種其他引用:SoftReference、WeakReference、PhantomReference、FinalReference,本文主要想講的是FinalReference,因為我們在使用內存分析工具比如zprofiler、mat等在分析一些oom的heap的時候,經常能看到 java.lang.ref.Finalizer占用的內存大小遠遠排在前面,而這個類占用的內存大小又和我們這次的主角FinalReference有著密不可分的關系。

[[181424]]

概述

JAVA對象引用體系除了強引用之外,出于對性能、可擴展性等方面考慮還特地實現了四種其他引用:SoftReference、WeakReference、PhantomReference、FinalReference,本文主要想講的是FinalReference,因為我們在使用內存分析工具比如zprofiler、mat等在分析一些oom的heap的時候,經常能看到 java.lang.ref.Finalizer占用的內存大小遠遠排在前面,而這個類占用的內存大小又和我們這次的主角FinalReference有著密不可分的關系。

對于FinalReference及關聯的內容,我們可能有如下印象:

  • 自己代碼里從沒有使用過
  • 線程dump之后,我們能看到一個叫做Finalizer的java線程
  • 偶爾能注意到java.lang.ref.Finalizer的存在
  • 我們在類里可能會寫finalize方法

那FinalReference到底存在的意義是什么,以怎樣的形式和我們的代碼相關聯呢,這是本文要理清的問題。

JDK中的FinalReference

首先我們看看FinalReference在JDK里的實現:

大家應該注意到了類訪問權限是package的,這也就意味著我們不能直接去對其進行擴展,但是JDK里對此類進行了擴展實現java.lang.ref.Finalizer,這個類也是我們在概述里提到的,而此類的訪問權限也是package的,并且是final的,意味著真的不能被擴展了,接下來的重點我們圍繞java.lang.ref.Finalizer展開(PS:后續講Finalizer相關的其實也就是在說FinalReference)

Finalizer的構造函數

從構造函數上我們獲得下面的幾個關鍵信息 * private:意味著我們在外面無法自己構建這類對象 * finalizee參數:FinalReference指向的對象引用 * 調用add方法:將當前對象插入到Finalizer對象鏈里,鏈里的對象和Finalizer類靜態相關聯,言外之意是在這個鏈里的對象都無法被gc掉,除非將這種引用關系剝離掉(因為Finalizer類無法被unload)。

雖然外面無法創建Finalizer對象,但是注意到有一個register的靜態方法,在方法里會創建這種對象,同時將這個對象加入到Finalizer對象鏈里,這個方法是被vm調用的,那么問題來了,vm在什么情況下會調用這個方法呢?

Finalizer對象何時被注冊到Finalizer對象鏈里

類其實有挺多的修飾,比如final,abstract,public等等,如果一個類有final修飾,我們就說這個類是一個final類,上面列的都是語法層面我們可以顯示標記的,在jvm里其實還給類標記其他一些符號,比如finalizer,表示這個類是一個finalizer類(為了和java.lang.ref.Fianlizer類進行區分,下文要提到的finalizer類的地方都說成f類),gc在處理這種類的對象的時候要做一些特殊的處理,如在這個對象被回收之前會調用一下它的finalize方法。

如何判斷一個類是不是一個f類

在講這個問題之前,我們先來看下java.lang.Object里的一個方法

在Object類里定義了一個名為finalize的空方法,這意味著Java世界里的所有類都會繼承這個方法,甚至可以覆寫該方法,并且根據方法覆寫原則,如果子類覆蓋此方法,方法訪問權限都是至少是protected級別的,這樣其子類就算沒有覆寫此方法也會繼承此方法。

而判斷當前類是否是一個f類的標準并不僅僅是當前類是否含有一個參數為空,返回值為void的名為finalize的方法,而另外一個要求是finalize方法必須非空,因此我們的Object類雖然含有一個finalize方法,但是并不是一個f類,Object的對象在被gc回收的時候其實并不會去調用它的finalize方法。

需要注意的是我們的類在被加載過程中其實就已經被標記為是否為f類了(遍歷所有方法,包括父類的方法,只要有一個非空的參數為空返回void的finalize方法就認為是一個f類)。

f類的對象何時傳到Finalizer.register方法

對象的創建其實是被拆分成多個步驟的,比如A a=new A(2)這樣一條語句對應的字節碼如下:

先執行new分配好對象空間,然后再執行invokespecial調用構造函數,jvm里其實可以讓用戶選擇在這兩個時機中的任意一個將當前對象傳遞給Finalizer.register方法來注冊到Finalizer對象鏈里,這個選擇依賴于RegisterFinalizersAtInit這個vm參數是否被設置,默認值為true,也就是在調用構造函數返回之前調用Finalizer.register方法,如果通過-XX:-RegisterFinalizersAtInit關閉了該參數,那將在對象空間分配好之后就將這個對象注冊進去。

另外需要提一點的是當我們通過clone的方式復制一個對象的時候,如果當前類是一個f類,那么在clone完成的時候將調用Finalizer.register方法進行注冊。

hotspot如何實現f類對象在構造函數執行完畢后調用Finalizer.register

這個實現比較有意思,在這里簡單提一下,我們知道一個構造函數執行的時候,會去調用父類的構造函數,主要是為了能對繼承自父類的屬性也能做初始化,那么任何一個對象的初始化最終都會調用到Object的空構造函數里(任何空的構造函數其實并不空,會含有三條字節碼指令,如下代碼所示),為了不對所有的類的構造函數都做埋點調用Finalizer.register方法,hotspot的實現是在Object這個類在做初始化的時候將構造函數里的return指令替換為_return_register_finalizer指令,該指令并不是標準的字節碼指令,是hotspot擴展的指令,這樣在處理該指令的時候調用Finalizer.register方法,這樣就在侵入性很小的情況下***地解決了這個問題。

f類對象的GC回收

FinalizerThread線程

在Finalizer類的clinit方法(靜態塊)里我們看到它會創建了一個FinalizerThread的守護線程,這個線程的優先級并不是***的,意味著在cpu很緊張的情況下其被調度的優先級可能會受到影響

這個線程主要就是從queue里取Finalizer對象,然后執行該對象的runFinalizer方法,這個方法主要是將Finalizer對象從Finalizer對象鏈里剝離出來,這樣意味著下次gc發生的時候就可能將其關聯的f對象gc掉了,***將這個Finalizer對象關聯的f對象傳給了一個native方法invokeFinalizeMethod

其實invokeFinalizeMethod方法就是調了這個f對象的finalize方法,看到這里大家應該恍然大悟了,整個過程都串起來了

f對象的finalize方法拋出異常會導致FinalizeThread退出嗎

不知道大家有沒有想過如果f對象的finalize方法拋了一個沒捕獲的異常,這個FinalizerThread會不會退出呢,細心的讀者看上面的代碼其實就可以找到答案,在runFinalizer方法里對Throwable的異常都進行了捕獲,因此不可能出現FinalizerThread因異常未捕獲而退出的情況。

f對象的finalize方法會執行多次嗎

如果我們在f對象的finalize方法里重新將當前對象賦值出去,變成可達對象,當這個f對象再次變成不可達的時候還會被執行finalize方法嗎?答案是否定的,因為在執行完***次finalize方法之后,這個f對象已經和之前的Finalizer對象關系剝離了,也就是下次gc的時候不會再發現Finalizer對象指向該f對象了,自然也就不會調用這個f對象的finalize方法了。

Finalizer對象何時被放到ReferenceQueue里

除了這里要說的環節之外,整個過程大家應該都比較清楚了。

當gc發生的時候,gc算法會判斷f類對象是不是只被Finalizer類引用(f類對象被Finalizer對象引用,然后放到Finalizer對象鏈里),如果這個類僅僅被Finalizer對象引用的時候,說明這個對象在不久的將來會被回收了現在可以執行它的finalize方法了,于是會將這個Finalizer對象放到Finalizer類的ReferenceQueue里,但是這個f類對象其實并沒有被回收,因為Finalizer這個類還對他們持有引用,在gc完成之前,jvm會調用ReferenceQueue里的lock對象的notify方法(當ReferenceQueue為空的時候,FinalizerThread線程會調用ReferenceQueue的lock對象的wait方法直到被jvm喚醒),此時就會執行上面FinalizeThread線程里看到的其他邏輯了。

Finalizer導致的內存泄露

這里舉一個簡單的例子,我們使用挺廣的socket通信,SocksSocketImpl的父類其實就實現了finalize方法:

其實這么做的主要目的是萬一用戶忘記關閉socket了,那么在這個對象被回收的時候能主動關閉socket來釋放一些系統資源,但是如果真的是用戶忘記關閉了,那這些socket對象可能因為FinalizeThread遲遲沒有執行到這些socket對象的finalize方法,而導致內存泄露,這種問題我們碰到過多次,需要特別注意的是對于已經沒有地方引用的這些f對象,并不會在最近的那一次gc里馬上回收掉,而是會延遲到下一個或者下幾個gc時才被回收,因為執行finalize方法的動作無法在gc過程中執行,萬一finalize方法執行很長呢,所以只能在這個gc周期里將這個垃圾對象重新標活,直到執行完finalize方法從queue里刪除,這樣下次gc的時候就真的是漂浮垃圾了會被回收,因此給大家的一個建議是千萬不要在運行期不斷創建f對象,不然會很悲劇。

Finalizer的客觀評價

上面的過程基本對Finalizer的實現細節進行完整剖析了,java里我們看到有構造函數,但是并沒有看到析構函數一說,Finalizer其實是實現了析構函數的概念,我們在對象被回收前可以執行一些『收拾性』的邏輯,應該說是一個特殊場景的補充,但是這種概念的實現給我們的f對象生命周期以及gc等帶來了一些影響:

  • f對象因為Finalizer的引用而變成了一個臨時的強引用,即使沒有其他的強引用了,還是無法立即被回收
  • f對象至少經歷兩次GC才能被回收,因為只有在FinalizerThread執行完了f對象的finalize方法的情況下才有可能被下次gc回收,而有可能期間已經經歷過多次gc了,但是一直還沒執行f對象的finalize方法
  • cpu資源比較稀缺的情況下FinalizerThread線程有可能因為優先級比較低而延遲執行f對象的finalize方法
  • 因為f對象的finalize方法遲遲沒有執行,有可能會導致大部分f對象進入到old分代,此時容易引發old分代的gc,甚至fullgc,gc暫停時間明顯變長
  • f對象的finalize方法被調用了,但是這個對象其實還并沒有被回收,雖然可能在不久的將來會被回收

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

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

責任編輯:武曉燕 來源: 你假笨
相關推薦

2017-01-11 14:02:32

JVM源碼內存

2020-05-26 18:50:46

JVMAttachJava

2017-01-11 14:19:26

JVM源碼All

2017-02-27 11:48:58

JVM源碼分析Java

2020-07-21 14:19:18

JVM編程語言

2024-10-31 09:24:42

2021-03-11 08:10:48

JVM對象的創建School

2011-05-26 10:05:48

MongoDB

2010-09-27 10:30:42

JVM對象生命周期

2021-07-06 09:29:38

Cobar源碼AST

2024-06-13 07:55:19

2021-03-23 09:17:58

SpringMVCHttpServletJavaEE

2023-02-26 08:42:10

源碼demouseEffect

2012-09-20 10:07:29

Nginx源碼分析Web服務器

2011-05-26 16:18:51

Mongodb

2021-07-14 09:18:19

Python插值算法

2022-09-30 15:35:47

json 文件前端開源

2020-10-30 08:35:23

Java Virtua

2021-09-01 07:21:40

ArrayPool源碼Bucket

2020-07-09 07:00:00

HashMap
點贊
收藏

51CTO技術棧公眾號

国产精品麻豆免费版| 欧美变态tickle挠乳网站| 欧洲精品在线一区| 97超碰资源站| 雨宫琴音一区二区在线| 亚洲男人天堂手机在线| 9l视频白拍9色9l视频| 直接在线观看的三级网址| eeuss影院一区二区三区| 国产精品成人av性教育| 黄色一级免费视频| 国产aⅴ精品一区二区三区久久| 欧美日韩国产精品成人| 玩弄中年熟妇正在播放| 天堂资源在线中文| 99麻豆久久久国产精品免费优播| 国产精品爽爽ⅴa在线观看| 免费在线观看a级片| 久久不见久久见国语| 日韩一级高清毛片| 网站一区二区三区| 麻豆视频在线看| 一区二区三区影院| 欧美韩国日本精品一区二区三区| 国内精品久久久久久久久久| 久久只有精品| 久久人人爽人人| 污软件在线观看| 操欧美老女人| 国产香蕉精品视频一区二区三区| 成人午夜精品无码区| 亚洲高清影院| 欧美日韩国产中文| 毛葺葺老太做受视频| 日韩伦理在线一区| 亚洲一区二区在线免费看| 日韩精品一区二区三区电影| av网站在线播放| 久久久久久久久久电影| 精品亚洲欧美日韩| 六月婷婷综合网| 国产suv精品一区二区883| 亚洲精品免费在线视频| 亚洲午夜激情视频| 日韩一区精品视频| 国产精品久久久久999| 亚洲GV成人无码久久精品| 日韩视频一区| 国产91精品久| 久久人妻免费视频| 欧美亚洲一区二区三区| 2018日韩中文字幕| 日韩乱码人妻无码中文字幕| 伊人久久久大香线蕉综合直播| 欧美成人中文字幕| 青青草激情视频| 黄色精品免费| 久久久亚洲国产天美传媒修理工| 国产五月天婷婷| 亚洲高清电影| 91成人在线视频| 中文字幕在线天堂| 日韩av成人高清| 国产欧美精品一区二区三区-老狼 国产欧美精品一区二区三区介绍 国产欧美精品一区二区 | 91日韩久久| 精品人妻一区二区三区四区不卡| 国产精品亚洲午夜一区二区三区| 99国产高清| 亚洲欧美强伦一区二区| 99久久精品国产一区| 久久综合福利| 98在线视频| 亚洲日本成人在线观看| 波多野结衣 作品| 国产va在线视频| 在线中文字幕一区二区| 亚洲18在线看污www麻豆| 视频一区中文字幕精品| 亚洲国产精品va在线| 大又大又粗又硬又爽少妇毛片 | 国产欧美日韩网站| 免费电影日韩网站| 欧美日韩午夜精品| 91人妻一区二区| 神马电影久久| 美女性感视频久久久| 日韩欧美三级在线观看| 日韩高清欧美激情| 97人人干人人| 韩日在线视频| 一区二区三区欧美亚洲| 漂亮人妻被中出中文字幕| 国产成人精选| 亚洲国产女人aaa毛片在线| 久久婷婷五月综合| 韩日在线一区| 国产福利视频一区| 亚洲精品国产一区二| 久久久不卡网国产精品二区| 黄色一级片av| www.一区| 亚洲精品国产美女| 中文字幕在线有码| 天堂一区二区在线免费观看| 超碰97人人人人人蜜桃| 黄色的视频在线免费观看| 一区二区三区欧美日| 亚洲激情在线观看视频| 欧美一级色片| 欧美人在线视频| 一区二区三区在线免费观看视频| 成人av中文字幕| 偷拍盗摄高潮叫床对白清晰| 性欧美18xxxhd| 精品国产123| av黄色免费在线观看| 久久福利毛片| 国产精品一区二区三区观看 | 欧美激情a在线| 最近中文字幕免费在线观看| 99r国产精品| 国产午夜精品视频一区二区三区| 欧美一区二区三区婷婷| 亚洲人免费视频| 久久精品视频8| 国产精品亚洲综合一区在线观看| 亚洲国产日韩综合一区| a欧美人片人妖| 日韩av在线一区二区| 久久精品性爱视频| 国产成人在线看| 大桥未久一区二区三区| 日本黄色一区| 色综合伊人色综合网站| 黄色污污网站在线观看| 91一区二区三区在线观看| 亚洲一区二区三区av无码| 日本一区二区三区视频在线看| 久久天天躁狠狠躁夜夜爽蜜月| 中文字幕777| 国产网红主播福利一区二区| 黄色片久久久久| 在线观看欧美理论a影院| 欧美专区在线观看| 理论在线观看| 欧美在线观看一二区| 国产人妻大战黑人20p| 丝袜亚洲另类欧美综合| 秋霞毛片久久久久久久久| 男人最爱成人网| 一本色道久久综合狠狠躁篇怎么玩| 日韩不卡在线播放| 久久综合色婷婷| 日日碰狠狠躁久久躁婷婷| 猛男gaygay欧美视频| 日本亚洲精品在线观看| 国产精品一区二区三区四区色| 91精品福利视频| 成人18视频免费69| 国内精品第一页| www.日本三级| 欧洲vs亚洲vs国产| 国产成人欧美在线观看| 欧美三级电影一区二区三区| 91精品国产一区二区三区| 国产大片免费看| 成人avav在线| 免费激情视频在线观看| 欧美r级电影| 99影视tv| 欧美黄色网页| 久久久国产精品免费| 亚洲美女性生活| 日韩欧美一区二区在线| 在线观看免费小视频| 国产一区二区免费视频| 国内少妇毛片视频| 国产免费av一区二区三区| 成人免费网站在线| h片视频在线观看| 中文精品99久久国产香蕉| 99久久久久成人国产免费| 婷婷久久综合九色综合绿巨人| 国产1区2区在线观看| 国产一区二区三区不卡在线观看| 可以在线看的av网站| 第一sis亚洲原创| 国产成人女人毛片视频在线| 另类激情视频| 九九热精品视频国产| 国产福利小视频在线| 日韩一二三区视频| 欧美黄色一级大片| 亚洲精品国产a| 精品无人区无码乱码毛片国产| 国产美女一区二区三区| 黑鬼大战白妞高潮喷白浆| 亚洲综合色站| 欧美少妇一区| 久久中文资源| 91精品黄色| av成人免费| 91精品国产高清久久久久久91| 免费在线午夜视频| 日韩精品中文字幕久久臀| 国产乱码精品一区二区| 色婷婷国产精品综合在线观看| avtt天堂在线| 国产精品夫妻自拍| 国产精品无码永久免费不卡| 国产不卡免费视频| 亚洲一区二区三区观看| 视频一区欧美日韩| 精品视频在线观看一区| 一区二区三区毛片免费| 少妇精品久久久久久久久久| 久久电影在线| 97超碰最新| 成人免费观看49www在线观看| 日韩免费观看网站| 国产传媒在线观看| 欧美激情一区二区三级高清视频| 男人影院在线观看| 一色桃子一区二区| 韩日视频在线| 亚洲人精选亚洲人成在线| 午夜影院免费视频| 亚洲成人激情视频| 国产成人自拍一区| 日韩一级片网站| 99在线精品视频免费观看20| 欧美日韩激情在线| 在线观看中文字幕av| 在线观看亚洲精品视频| av一级在线观看| 日韩欧美在线视频观看| 国产a∨精品一区二区三区仙踪林| 亚洲国产视频一区| 久久久久久久久久久97| 亚洲激情男女视频| 九九热精品免费视频| 夜色激情一区二区| 久久伊人成人网| 亚洲一区中文日韩| 国产午夜免费视频| 亚洲va欧美va人人爽午夜| 国产大片中文字幕在线观看| 亚洲电影第三页| 一区二区三区福利视频| 一本大道久久a久久综合| 国产又大又粗又爽| 欧亚洲嫩模精品一区三区| 欧美超碰在线观看| 欧美午夜电影一区| 91精品人妻一区二区三区果冻| 欧美喷潮久久久xxxxx| 国产永久免费视频| 日韩午夜中文字幕| 色呦呦中文字幕| 亚洲欧美日韩综合| 午夜精品一区| 久久精品欧美视频| 91jq激情在线观看| 人人做人人澡人人爽欧美| 电影亚洲精品噜噜在线观看| 国产美女被下药99| 精品三级国产| 国产日产精品一区二区三区四区| 偷拍自拍亚洲色图| 亚洲精品视频一区二区三区| 99久久99久久精品国产片果冰| 欧美xxxx吸乳| 一区二区三区国产在线| 亚洲综合色在线观看| 国产精品白丝jk黑袜喷水| 欧美激情一区二区三区p站| 久久亚洲精品小早川怜子| 国产午夜精品福利视频| 亚洲久本草在线中文字幕| 日韩美女黄色片| 欧美日韩一区二区欧美激情| av中文字幕免费在线观看| 日韩成人在线网站| 日本福利专区在线观看| 久久久综合免费视频| 超碰这里只有精品| 国产成人精品免费视频大全最热| 精品国产乱码久久久久久果冻传媒| 中国一区二区三区| 亚洲三级毛片| 久久久精品高清| 99久久国产综合精品色伊| 国产精品视频看看| 婷婷中文字幕综合| 国产乱码精品一区二区三区精东| 精品一区精品二区| 50度灰在线| 国产精品视频导航| 久久电影在线| 免费的av在线| 日本亚洲视频在线| 噜噜噜在线视频| 亚洲精品成人精品456| 国产污视频网站| 亚洲国产日韩欧美综合久久| 精品国产丝袜高跟鞋| 欧洲精品在线视频| caoporn成人| 操bbb操bbb| 美女免费视频一区二区| 女尊高h男高潮呻吟| 一区二区三区视频在线观看| 一级黄色免费片| 亚洲天堂色网站| 欧美调教sm| 国产成人精品福利一区二区三区 | 亚洲欧美另类小说视频| 美女又爽又黄免费视频| 欧美va亚洲va国产综合| 免费av在线播放| 国产精品国产福利国产秒拍| 欧美日韩另类图片| 2018中文字幕第一页| 久草精品在线观看| 熟女少妇内射日韩亚洲| 色婷婷综合激情| 四虎精品成人免费网站| 98视频在线噜噜噜国产| 欧美久久亚洲| 五月天在线免费视频| 国精品**一区二区三区在线蜜桃| 欧美波霸videosex极品| 在线观看一区日韩| 久久久久久久久亚洲精品| 2018国产精品视频| 思热99re视热频这里只精品| 国产免费黄视频| 91免费看视频| 一区二区三区福利视频| 亚洲片国产一区一级在线观看| 周于希免费高清在线观看| 精品国产福利| 男女av一区三区二区色多| 泷泽萝拉在线播放| 日韩欧美亚洲范冰冰与中字| 你懂的视频在线观看| 欧美亚洲在线观看| 夜夜春成人影院| 天天碰免费视频| 国产精品久久久久影院亚瑟 | 亚洲精品久久久久久久久久久久久| 牛牛精品在线| 国产66精品久久久久999小说| 欧美日韩亚洲一区二区三区在线| 国产成人精品一区二区三区在线观看 | 91国内外精品自在线播放| 午夜久久资源| 国模无码大尺度一区二区三区| 国产大片免费看| 亚洲激情第一页| 深夜成人影院| 在线观看一区欧美| 国产精品夜夜嗨| 91浏览器在线观看| 一本色道久久综合狠狠躁篇怎么玩| 成人午夜在线| 国产成人生活片| 91免费版在线看| 一区二区三区午夜| 欧美黑人xxxx| 免费看成人哺乳视频网站| 浓精h攵女乱爱av| 亚洲乱码中文字幕| 手机av在线免费观看| 日韩女优在线播放| 亚洲大全视频| 中文字幕在线观看网址| 欧美人狂配大交3d怪物一区| 久久av色综合| 日韩电影免费观看在| 国产精品一区一区三区| 自拍偷拍欧美亚洲| 综合久久五月天| 国产精品极品在线观看| 久久久国产欧美| 亚洲制服丝袜一区| 国产午夜精品一区理论片| 亚洲最大福利视频| 日韩不卡在线观看日韩不卡视频| 欧美第一页在线观看| 亚洲人免费视频| xxxx日韩| 午夜久久福利视频| 午夜精品久久久久| 色多多视频在线观看| 国内视频一区| 国产乱子轮精品视频| 久久久久久久亚洲| 久久久久久久亚洲精品| 日韩久久精品|