對象的finalization機制Test

Java語言提供了對象終止(finalization)機制來允許開發人員自定義對象被銷毀之前的處理邏輯。當垃圾回收器發現沒有引用指向一個對象時,通常接下來要做的就是垃圾回收,即清除該對象,而finalization機制使得在清除此對象之前,總會先調用這個對象的finalize()方法。finalize()方法允許在子類中被重寫,用于在對象被回收時進行資源釋放或清理相關內存,例如關閉文件、套接字和數據庫連接等。但是,不要過分依賴對象的finalize()方法來釋放資源,最好有其他的方法來釋放資源,例如手動調用close()方法,理由如下。(1)在調用finalize()方法時可能會導致對象復活,即在finalize()方法中當前對象this又被賦值給了一個有效的變量引用。(2)一個糟糕的finalize()會嚴重影響GC的性能,而長時間的GC是會影響程序運行性能和體驗的。(3)finalize()方法的執行時間是沒有保障的,它完全由GC線程決定,極端情況下,若不發生GC,則finalize()方法將沒有執行機會。另外,finalize()方法工作效率很低。如果一個對象在回收前需要調用finalize()方法的話,要先將其加入一個隊列,之后由Finalizer線程處理這些對象,而這個線程的優先級非常低,所以很難被CPU執行到,進而導致對象的finalize()方法遲遲不能被執行,資源遲遲不能被釋放,對象遲遲不能被垃圾回收。從功能上來說,finalize()方法與C++中的析構函數比較相似,都是用來做清理善后的工作。只不過C++中需要手動調用析構函數清理內存,而Java采用的是基于垃圾回收器的自動內存管理機制。finalize()方法在本質上不同于C++中的析構函數。由于finalize()方法的存在,JVM中的對象一般處于三種可能的狀態。如果從所有的根節點都無法訪問到某個對象,說明該對象已經不再使用了。一般來說,此對象需要被回收。但事實上,也并非是“非死不可”的,這時候它們暫時處于“緩刑”階段。一個無法觸及的對象有可能在某一個條件下“復活”自己,如果這樣,那么對它的回收就是不合理的,為此,定義JVM中的對象可能的三種狀態。

(1)可觸及的:從根節點開始,可以到達這個對象
(2)可復活的:對象的所有引用都被釋放,但是對象有可能在finalize()中復活。(3)不可觸及的:對象的finalize()被調用,并且沒有復活,那么就會進入不可觸及狀態。不可觸及的對象不可能被復活,因為每一個對象的finalize()只會被調用一次。以上三種狀態中只有在對象不可觸及時才可以被回收。判定一個對象objA是否可回收,至少要經歷以下兩次標記過程。(1)如果GC Roots到對象objA沒有引用鏈,則進行第一次標記。(2)判斷此對象是否有必要執行finalize()方法。如果對象objA沒有重寫finalize()方法,或者finalize()方法已經被JVM調用過,則JVM視為“沒有必要執行”?,objA被判定為不可觸及。如果對象objA重寫了finalize()方法,且還未執行過,那么objA會被插入到F-Queue隊列中,由一個JVM自動創建的、低優先級的Finalizer線程觸發其finalize()方法執行。finalize()方法是對象逃脫死亡的最后機會,稍后GC會對F-Queue隊列中的對象進行第二次標記。如果objA在finalize()方法中與引用鏈上的任何一個對象建立了聯系,那么在第二次標記時,objA會被移出“即將回收”集合。之后,對象如果再次出現沒有引用存在的情況,finaliz()方法就不會被再次調用,對象會直接變成不可觸及的狀態,也就是說,一個對象的finalize()方法只會被調用一次。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/86863.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/86863.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/86863.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI初學者如何對大模型進行微調?——零基礎保姆級實戰指南

僅需8GB顯存,三步完成個人專屬大模型訓練 四步實戰:從環境配置到模型發布 步驟1:云端環境搭建(10分鐘) 推薦使用阿里魔塔ModelScope免費GPU資源: # 注冊后執行環境初始化 pip3 install --upgrade pip pi…

“單一職責”模式之裝飾器模式

目錄 “單一職責”模式裝飾器模式 Decorator引例動機 Motivation模式定義結構 Structure要點總結 “單一職責”模式 在軟件組件的設計中,如果責任劃分的不清晰,使用繼承得到的結果往往是隨著需求的變化,子類急劇膨脹,同時充斥著重…

idea, CreateProcess error=206, 文件名或擴展名太長

idea, CreateProcess error206, 文件名或擴展名太長 解決 “CreateProcess error206, 文件名或擴展名太長” 錯誤 CreateProcess error206 是 Windows 系統特有的錯誤,表示命令行參數超出了 Windows 的 32767 字符限制。這個問題在 Java 開發中尤其常見&#xff0c…

一鍵高效率圖片MD5修改工具PHP版

文章目錄 圖片MD5修改工具項目簡介功能特點技術原理系統需求安裝方法使用方法Web界面模式命令行模式文件結構常見問題注意事項開發者信息效果演示更多干貨??1.如果我的博客對你有幫助、如果你喜歡我的博客內容,請 “??點贊” “??評論” “??收藏” 一鍵三連哦!2.??…

跨主機用 Docker Compose 部署 PostgreSQL + PostGIS 主從

q下面是跨主機用 Docker Compose 部署 PostgreSQL PostGIS 主從復制的完整詳細步驟(主庫 從庫),主從都用官方 PostGIS 鏡像 postgis/postgis:15-3.3,并注意網絡與持久化。復制即可。 🚩 跨主機 PostgreSQL PostGIS …

會議動態|千眼狼高速攝像機、DIC測量系統等科學儀器亮相第十五屆全國爆炸力學學術會議

第十五屆全國爆炸力學學術會議于6月28日在紹興盛大召開,會議匯聚來自全國爆炸力學與沖擊領域專家學者2000余人,聚焦“爆炸與沖擊動力學工程應用”、“材料動態力學行為與損傷斷裂“、“工程爆破與毀傷評估”、“含能材料與水中爆炸”、“結構動態響應與安…

vscode一個文件夾有殘余的git倉庫文件,已經失效了,怎樣進行清空倉庫殘余文件并重新初始化git--ubuntu

vscode一個文件夾有殘余的git倉庫文件,已經失效了,怎樣進行清空倉庫殘余文件并重新初始化git–ubuntu 首先要把工作區里重要的文件備份好,防止操作時數據丟失。刪除.git文件夾 rm -rf .git初始化 (base) zd4090zd4090-System-Product-Name:…

6月30日作業

思維導圖 一、讀取文件&#xff0c;效果類似 cat 的功能 代碼 #include <25041head.h>int main(int argc, const char *argv[]) {//打開文件printf("請輸入你要讀取的文件路徑&#xff1a;");char str[128]"";scanf("%s",str);FILE *fpf…

ubuntu源碼安裝python3.13遇到Could not build the ssl module!解決方法

我在Ubuntu 24.04.2 LTS下載源碼安裝Python 3.13.5時&#xff1a; #./configure --enable-loadable-sqlite-extensions --enable-optimizations #make 顯示錯誤信息&#xff1a; Could not build the ssl module! Python requires a OpenSSL 1.1.1 or newer 查詢我的openssl版…

Ai工具分享(2):Vscode+Cline無限免費的使用教程

大家好,我是程序員寒山。 今天給大家分享一個最新的免費使用的Ai插件Cline的方法,之前也給大家分享過一些免費的方案,但是這些都是隨時在變化,之前推薦的很多都不能使用了。 Ai工具分享(2):Vscode+Cline無限免費的使用教 今天再給大家推薦一個,可以免費使用,且沒有token…

Docker 目錄遷移腳本【Windows Junction 類型鏈接】

Docker 目錄遷移腳本完整教程&#xff1a;從誕生到自動化使用 一、腳本誕生背景與開發歷程 1. 為什么需要遷移 Docker 目錄&#xff1f; 系統盤空間壓力&#xff1a;Docker 鏡像和容器數據通常存儲在C:\Users\用戶名目錄下&#xff0c;隨著使用時間增長會占用大量系統盤空間…

spring-ai 工作流

目錄 工作流概念工作流程圖spring-boot 編碼定義節點 (Node)定義節點圖StateGraphcontroller測試瀏覽器測試用戶輸入 工作流概念 工作流是以相對固化的模式來人為地拆解任務&#xff0c;將一個大任務拆解為包含多個分支的固化流程。工作流的優勢是確定性強&#xff0c;模型作為…

重頭開始學ROS(6)---Eigen庫安裝與使用

Eigen庫 矩陣運算是一種非常重要的運算方式&#xff0c;在Matlab中&#xff0c;矩陣運算可以輕松的實現&#xff0c;但在C這種偏底層的語言中&#xff0c;若不借助第三方庫&#xff0c;矩陣運算需要我們進行較為復雜的代碼設計。Eigen庫是一個用于線性運算的C模板庫&#xff0…

【STM32】外部中斷

STM32 外部中斷&#xff08;EXTI&#xff09;概述 這篇文章結合示例代碼&#xff0c;系統性地講述 STM32 外部中斷&#xff08;EXTI&#xff09;實驗的原理、以及配置流程。目的在于輔助讀者掌握STM32F1 外部中斷機制。 STM32F1xx官方資料&#xff1a;《STM32中文參考手冊V10》…

LeetCode Hot100 算法題 (矩陣篇)

1、73. 矩陣置零 給定一個 m x n 的矩陣&#xff0c;如果一個元素為 0 &#xff0c;則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。 示例 1&#xff1a; 輸入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 輸出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]// 將第一行…

Flutter基礎(項目創建)

一、使用命令行創建項目 1. 確認 Flutter 環境正常 要保證 Flutter SDK 已經正確安裝&#xff0c;并且環境變量配置無誤。可以通過執行以下命令來驗證&#xff1a; flutter doctor 要保證所有檢查項都顯示綠色對勾&#xff0c;要是有問題&#xff0c;可按照提示進行修復。 …

【Actix Web】Rust Web開發實戰:Actix Web框架全面指南(2025企業級應用版)

? 在2025年高并發、低延遲成為Web服務核心指標的背景下&#xff0c;??Actix Web憑借異步Actor模型與零成本抽象??&#xff0c;成為Rust生態中生產環境部署率最高的Web框架。本指南深入解析Actix Web 4.0核心技術&#xff0c;覆蓋??百萬級并發架構設計??、??內存安全…

HTML之常用基礎標簽

HTML之常用基礎標簽 一、HTML文檔基本結構標簽1. <html>標簽2. <head>標簽3. <body>標簽 二、文本相關基礎標簽1. 標題標簽&#xff08;<h1> - <h6>&#xff09;2. 段落標簽&#xff08;<p>&#xff09;3. 換行標簽&#xff08;<br>…

外鍵列索引優化:加速JOIN查詢的關鍵

在使用數據庫時&#xff0c;特別是在執行涉及JOIN操作的查詢時&#xff0c;優化外鍵列的索引是非常重要的。外鍵通常用于建立表之間的關聯&#xff0c;而JOIN操作則是基于這些外鍵列來實現的。下面是一些關鍵步驟和技巧&#xff0c;可以幫助你優化外鍵列的索引&#xff0c;從而…

2025年 UI 自動化框架使用排行

??親愛的技術愛好者們,熱烈歡迎來到 Kant2048 的博客!我是 Thomas Kant,很開心能在CSDN上與你們相遇~?? 本博客的精華專欄: 【自動化測試】 【測試經驗】 【人工智能】 【Python】 </