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

精品va天堂亚洲国产| 亚洲精品免费在线| 国产精品免费久久久| 国产又粗又硬又长又爽| 国产精品sss在线观看av| 欧美日韩一区二区三区| 一级一片免费播放| 亚洲欧美一区二区三| 蜜桃视频在线一区| 久久男人av资源网站| 中文字幕一区二区人妻在线不卡 | 97色在线视频观看| 亚洲一级片在线播放| 国产日韩三级| 91麻豆精品国产91久久久使用方法| 精品久久久久久无码中文野结衣| 国内av一区二区三区| 国产电影一区在线| 国产欧美精品一区二区三区介绍| 日产精品久久久久| 亚洲精品极品少妇16p| 亚洲精品视频在线播放| 国产探花一区二区三区| yiren22亚洲综合| 午夜伦理一区二区| 日韩一二区视频| 日本高清在线观看wwwww色| 成人黄页在线观看| 7777精品伊久久久大香线蕉语言| 香蕉污视频在线观看| 亚洲毛片播放| 久久久久久久久久久av| 中文字幕av久久爽av| 欧美国产一级| 国产亚洲精品综合一区91| 黑丝av在线播放| 荡女精品导航| 欧美v国产在线一区二区三区| www.国产视频.com| 老司机精品视频网| 一本色道久久综合精品竹菊| 又粗又黑又大的吊av| av成人影院在线| 亚洲大片在线观看| 缅甸午夜性猛交xxxx| 国产91足控脚交在线观看| 一区二区三区在线免费| 日韩一级片一区二区| 亚洲淫性视频| 一区二区三区四区五区视频在线观看| 中文字幕日韩一区二区三区| 日本在线免费播放| 亚洲人被黑人高潮完整版| 综合视频免费看| 超碰porn在线| 亚洲在线视频一区| 日韩一级性生活片| 小草在线视频免费播放| 91久久久免费一区二区| 九一精品在线观看| 日韩伦理一区二区| 日韩欧美综合一区| 老熟女高潮一区二区三区| 亚洲乱码一区| 亚洲精品二三区| 少妇久久久久久久久久| 青青草国产成人a∨下载安卓| 中文字幕欧美国内| 全网免费在线播放视频入口 | 美女精品久久久| 久久精品99久久久久久| 国产欧美三级| 国产美女主播一区| 亚洲精品97久久中文字幕无码| 99久久精品国产精品久久| 欧美下载看逼逼| 国产精品实拍| 精品欧美一区二区三区| 欧美一级特黄a| 亚洲3区在线| 精品中文视频在线| www深夜成人a√在线| 在线观看不卡| 国产精品91免费在线| 国产精品一区二区免费视频| 不卡的av网站| 亚洲欧洲另类精品久久综合| 亚洲区欧洲区| 色天天综合色天天久久| 国产不卡的av| 免费成人av| 欧美激情久久久久| 亚洲午夜无码久久久久| 大白屁股一区二区视频| 色视频一区二区三区| 毛片大全在线观看| 欧美性大战xxxxx久久久| 韩国黄色一级片| 欧美精品羞羞答答| 午夜精品一区二区三区在线视频 | 欧美伦理91| 91精品国产高清一区二区三区| 女同性恋一区二区三区| 99久精品视频在线观看视频| 91精品国产成人| a天堂在线观看视频| 国产日韩亚洲欧美综合| 国产自产在线视频| 成人豆花视频| 在线视频免费一区二区| 免费看日韩毛片| 国产丶欧美丶日本不卡视频| 亚洲一区二区在线看| 亚洲精品日产| 精品国产乱码久久久久久久| 熟女av一区二区| 日本欧美一区二区| 欧美大陆一区二区| 成人影音在线| 欧美一区二区三级| 中文国语毛片高清视频| 日韩精品电影在线| 看高清中日韩色视频| 福利成人导航| 日韩精品一区二区三区在线观看 | 成人两性免费视频| 九色在线观看| 色综合视频一区二区三区高清| 五月天丁香社区| 欧美日韩a区| 亚洲xxxx18| 最新国产在线拍揄自揄视频| 欧美精品在线一区二区三区| youjizz亚洲女人| 日本伊人色综合网| 少妇免费毛片久久久久久久久| 久久久男人天堂| 日韩精品极品视频| 日韩毛片在线视频| 91色在线porny| 91九色在线观看视频| 欧美日韩导航| 91精品国产沙发| 午夜av免费观看| 精品国产鲁一鲁一区二区张丽| 大尺度在线观看| 一区二区三区成人精品| 久久久久资源| 丝袜美腿一区| 中国人与牲禽动交精品| 在线播放亚洲精品| 一区免费观看视频| 91香蕉视频免费看| 欧美日韩 国产精品| 国产日韩欧美一区二区三区四区| 96av在线| 亚洲欧美中文另类| 中文字幕在线播放av| **网站欧美大片在线观看| 免费黄频在线观看| 欧美日韩福利| 精品无人区一区二区三区| 黑人精品一区| 日韩中文在线中文网在线观看| 一区二区三区午夜| 亚洲自拍偷拍网站| 熟女丰满老熟女熟妇| 日韩电影免费在线看| 一级二级三级欧美| heyzo欧美激情| 欧美亚洲国产另类| 午夜伦理在线| 欧美疯狂性受xxxxx喷水图片| 日韩在线观看视频一区二区| 99久久久免费精品国产一区二区 | 69精品久久久| 国产喂奶挤奶一区二区三区| 91看片破解版| 亚洲东热激情| 亚洲欧美日本国产有色| 亚洲午夜精品| 国产精品成av人在线视午夜片| 日本在线视频网| 亚洲精品久久7777777| 国产无遮挡又黄又爽又色视频| 一色桃子久久精品亚洲| 99久久人妻无码中文字幕系列| 日韩av电影天堂| 国产内射老熟女aaaa| 欧美一二区在线观看| 99久热re在线精品视频| 丁香久久综合| 午夜精品久久久久久久99黑人| 日本免费在线视频| 亚洲免费电影在线观看| 亚洲AV无码成人片在线观看 | 97国产成人精品视频| 777电影在线观看| 亚洲精品999| 91久久精品无码一区二区| 精品久久久中文| 99久久99久久精品国产| 久久久久久免费毛片精品| 成人高清在线观看视频| 日韩精品亚洲一区二区三区免费| 日韩黄色片在线| 日韩精品不卡一区二区| 久久久久无码国产精品一区| 2023国产精华国产精品| 国产日韩在线视频| 欧美福利在线播放| 97视频在线观看播放| www视频在线看| 神马久久久久久| 二区三区在线| 亚洲老头老太hd| 少妇人妻精品一区二区三区| 日韩欧美一区二区免费| 国产精品爽爽久久| 欧美中文字幕一区| 天天干天天色综合| 欧美视频国产精品| 欧美一级视频免费观看| 亚洲国产精品一区二区尤物区| 91免费公开视频| 中文字幕一区二区三区不卡| 九九九视频在线观看| 久久蜜桃av一区二区天堂| 97精品人妻一区二区三区蜜桃| 国产高清不卡一区| 国产又粗又猛大又黄又爽| 激情图区综合网| aaa一级黄色片| 黄页视频在线91| 亚洲黄色片免费看| 狠狠久久亚洲欧美| 欧美又黄又嫩大片a级| 久久精品国产亚洲高清剧情介绍| 国产精品草莓在线免费观看| 色戒汤唯在线| 国产91精品久久久久久久| h片在线观看下载| 国模gogo一区二区大胆私拍 | 亚洲成人久久影院| 国产精品第一页在线观看| 亚洲国产精品欧美一二99| 国产小视频在线看| 五月婷婷色综合| 黑人精品无码一区二区三区AV| 欧美性69xxxx肥| 久久久久久不卡| 精品视频在线看| 国产免费黄色片| 日韩精品一区二区三区视频在线观看| 国产草草影院ccyycom| 欧美videossexotv100| 囯产精品一品二区三区| 精品亚洲国产成av人片传媒| 国产乱视频在线观看| 日韩在线观看你懂的| 伊人影院在线视频| 97在线观看视频| 午夜精品成人av| 成人激情综合网| 风间由美中文字幕在线看视频国产欧美 | 天天干在线播放| 欧美三级在线视频| av中文字幕观看| 亚洲国产天堂久久国产91| 青青草观看免费视频在线| 国产一区二区av| 成人免费看片| 91高清免费在线观看| 成人毛片免费| 国产福利久久精品| 国内黄色精品| 国产尤物av一区二区三区| 亚洲一区二区三区四区五区午夜 | 欧美视频免费看| 国产精品美女久久久久av福利| 妖精一区二区三区精品视频| 正义之心1992免费观看全集完整版| 国产字幕视频一区二区| www.国产区| 国产精品小仙女| 法国空姐电影在线观看| 一个色在线综合| 国产美女www| 欧美精品一区二区在线观看| 国产69久久| 久久久久久久激情视频| 国产福利亚洲| 国产精品乱码一区二区三区| 欧美日韩第一| 无码人妻精品一区二区三区在线| 美女精品自拍一二三四| 在线天堂www在线国语对白| 中文字幕视频一区二区三区久| 久久人人爽人人爽人人| 欧美日本一区二区| 你懂的视频在线免费| 欧美成人一二三| 国产第一亚洲| 日本欧美色综合网站免费| 亚洲天堂黄色| 久久精品国产露脸对白| 久久久久久黄色| 日本少妇激情舌吻| 日韩欧美一区二区免费| 乱人伦中文视频在线| 国产精品第100页| 天堂av一区二区三区在线播放| 路边理发店露脸熟妇泻火| 日韩av在线免费观看不卡| 熟女丰满老熟女熟妇| 一区二区激情视频| 国产又大又粗又硬| 正在播放国产一区| 日韩不卡在线| 茄子视频成人在线观看| 亚洲一区二区免费看| 国产精品无码专区| 亚洲大片精品永久免费| 精品国产av一区二区| 日韩一区在线视频| 四虎影视成人精品国库在线观看 | 日韩在线观看www| 国产精品久久久久99| 国产乱码精品一区二区亚洲| 欧美三级一级片| 99精品欧美一区二区蜜桃免费| 久久久99精品| 精品久久久久久亚洲综合网| 影音先锋在线播放| 99视频免费观看蜜桃视频| 午夜亚洲福利| 久久久久亚洲av无码专区首jn| 亚洲手机成人高清视频| 99久久免费国产精精品| 九九久久精品一区| 999久久精品| 国产精品一线二线三线| 91在线码无精品| 亚洲欧美另类在线视频| 亚洲视频精品在线| 免费在线成人激情电影| 一本久久a久久精品vr综合| 久久99国产精品久久99 | 欧美1区免费| 一级黄色大片免费看| 亚洲一二三区在线观看| 人妻无码中文字幕| 91成人免费观看网站| 精品国产乱码久久久| 国产又大又黄又粗的视频| 国产精品久久免费看| av官网在线观看| 久久久久久久一区二区| 亚洲小说图片视频| 亚洲国产日韩欧美在线观看| 中文字幕一区三区| 亚洲欧美激情另类| 欧洲中文字幕国产精品| 日韩亚洲一区在线| 黑人巨大猛交丰满少妇| 精品国产91久久久久久| 成人18在线| 91视频网页| 国产精品日韩| 三级黄色片在线观看| 欧美成人精品1314www| 中国色在线日|韩| 宅男av一区二区三区| www.色精品| 伊人精品一区二区三区| 欧美激情aaaa| 国产探花在线精品一区二区| 最新av免费在线观看| 精品成人久久av| 午夜伦理在线| 蜜桃在线一区二区三区精品| 久久国产尿小便嘘嘘| 男人的天堂一区| 日韩专区中文字幕| 99这里只有精品视频| 中文字幕第36页| 亚洲成在线观看| 五月婷婷在线视频| 国产亚洲欧美一区二区 | 色综合av在线| 污污视频在线看| 日韩精品久久一区| 成人av综合一区| 国产毛片久久久久| 国产成人精品av| 在线日韩视频| 欧美特级一级片| 尤物yw午夜国产精品视频明星| 免费不卡av| 亚洲欧美日韩国产yyy|