對象的finalization機制Test1

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/news/913560.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/913560.shtml
英文地址,請注明出處:http://en.pswp.cn/news/913560.shtml

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

相關文章

RJ45 連接器(水晶頭)的引腳定義

RJ45連接器核心定義 【】物理結構 8個金屬觸點(Pin 1至Pin 8)的透明塑料插頭,帶塑料卡榫。 引腳編號規則 卡榫朝下,金屬觸點面向自己時: 最左側為 Pin 1 最右側為 Pin 8 順序:Pin 1 → Pin 2 → Pin 3 → P…

小架構step系列08:logback.xml的配置

1 概述 logback.xml配置文件的詳細配置,很多地方都說得比較細,本文主要從幾個重點來看一下原理,了解原理能夠幫助確定哪些應該配置,以及如何配置。 logback.xml是為打印日志服務的,打印的內容一般打印到控制臺(Conso…

STM32中SPI協議詳解

前言 在嵌入式系統中,設備間的數據傳輸協議多種多樣,SPI(Serial Peripheral Interface,串行外設接口)憑借其高速、全雙工、易用性等特點,成為連接STM32與高速外設(如OLED屏、Flash芯片、AD轉換器…

TypeScript 接口全解析:從基礎到高級應用

TypeScript 接口全解析:從基礎到高級應用在 TypeScript 中,接口是定義數據結構和行為規范的強大工具,它能夠顯著提升代碼的可讀性、可維護性和類型安全性。本文將全面講解 TypeScript 接口的相關知識點,從基礎語法到高級特性&…

主存(DRAM)是什么?

主存(DRAM)是什么? 主存(DRAM)詳解 主存(Main Memory) 通常由 DRAM(Dynamic Random Access Memory,動態隨機存取存儲器) 構成,是計算機系統中用于…

Python 機器學習核心入門與實戰進階 Day 6 - 模型保存與加載(joblib / pickle)

? 今日目標 掌握如何將訓練好的模型持久化保存到文件熟悉兩種主流保存方式:joblib 和 pickle加載模型并應用于新數據預測實現完整的“訓練 → 保存 → 加載 → 預測”流程為后續部署做準備(如 Flask、FastAPI)🧰 一、模型保存工具…

【SigNoz部署安裝】Ubuntu環境部署SigNoz:Docker容器化監控的全流程指南

文章目錄前言1.關于SigNoz2.本地部署SigNoz3.SigNoz簡單使用4. 安裝內網穿透5.配置SigNoz公網地址6. 配置固定公網地址前言 在分布式架構主導的現代運維體系中,系統性能監控正面臨范式變革的關鍵轉折。當微服務架構遭遇服務雪崩、無服務器架構出現冷啟動延遲等復雜…

NV298NV312美光固態閃存NW639NW640

美光固態閃存技術全景解析:從NV298到NW640的深度探索近年來,美光科技憑借其在3D NAND閃存技術上的持續突破,推出了多款備受市場關注的固態硬盤產品。本文將從技術評測、產品對比、市場趨勢、用戶反饋及應用場景等多個維度,深入剖析…

2025.07.04【服務器】|使用萬兆網卡提升服務器間互聯速度,實現快速數據傳輸

文章目錄1. **萬兆網卡概述**2. **為什么選擇萬兆網卡**3. **萬兆網卡配置與安裝**3.1 **安裝網卡**3.2 **安裝驅動程序**3.3 **檢查網卡狀態**4. **配置網絡接口**4.1 **Linux 系統配置**4.2 **Windows 系統配置**5. **優化性能**5.1 **使用多線程傳輸**5.2 **開啟 TCP/UDP 窗…

光伏發電量精準估算,提升投資效益

在光伏產業規模化發展進程中,準確估算光伏發電量是提升項目投資效益的關鍵環節。科學的發電量預測不僅能為項目可行性研究提供依據,更能在電站全生命周期內優化運營策略,實現投資回報最大化。基于多維度數據整合與智能算法構建的精準預測體系…

Linux的互斥鎖、Linux的POSIX信號量(二值、計數)、RTOS的二值信號量

鎖和信號量最大的區別就是:鎖嚴格要求 “誰占用誰釋放”,而信號量允許 “一個任務 / 線程釋放,另一個任務 / 線程獲取”。 特性互斥鎖(Mutex)POSIX 信號量(Semaphore)初始狀態初始為 “鎖定”(PTHREAD_MUTEX_INITIALIZER),需顯式獲取(pthread_mutex_lock)。初始值可…

基于Java+SpringBoot 協同過濾算法私人診所管理系統

源碼編號:S607源碼名稱:基于SpringBoot5的協同過濾算法的私人診所管理系統用戶類型:雙角色,患者、醫生、管理員數據庫表數量:15 張表主要技術:Java、Vue、ElementUl 、SpringBoot、Maven運行環境&#xff1…

什么是DINO?

DINO 是一個由 Meta AI (當時的 Facebook AI) 在 2021 年提出的自監督學習框架,其全稱是 “self-DIstillation with NO labels”,直譯為“無標簽的自我蒸餾”。這個名字精準地概括了它的核心思想。 DINO 的出現是一個里程碑,因為它首次有力地…

如何在 Android Framework層面控制高通(Qualcomm)芯片的 CPU 和 GPU。

如何在 Android Framework層面控制高通(Qualcomm)芯片的 CPU 和 GPU。 參考:https://blog.csdn.net/YoungHong1992/article/details/117047839?utm_source%20%20uc_fansmsg 作為一名 Framework 開發者,您擁有系統級的權限&#…

程序員在線接單

十年Java全棧工程師在線接單Java程序代做,兼職接單,系統代做,二次開發,網站開發部署,項目合作,商業項目承包 全棧開發,支持定制各種管理系統、小程序 商用或個人使用等項目都接 服務二: Java調試…

Python 異步爬蟲(aiohttp)高效抓取新聞數據

一、異步爬蟲的優勢 在傳統的同步爬蟲中,爬蟲在發送請求后會阻塞等待服務器響應,直到收到響應后才會繼續執行后續操作。這種模式在面對大量請求時,會導致大量的時間浪費在等待響應上,爬取效率較低。而異步爬蟲則等待可以在服務器…

Jenkins Pipeline(二)

1.Pipeline 變量 在 Jenkins 管道(Pipeline)中,變量是一種非常有用的功能,它們可以幫助你在構建過程中存儲和傳遞數據。Jenkins 管道支持多種方式來定義和使用變量,包括環境變量、腳本變量以及全局變量。 1.2 腳本變…

springsecurity02

提前打開Redis1)通過內置的用戶名和密碼登錄spring-boot-starter-security.jar2)使用自定義用戶名和密碼登錄UserDetailService自定義類實現UserDetailService接口,重寫loadUserByUsername方法class UserDetailServiceImpl implements UserDe…

Apache組件遭大規模攻擊:Tomcat與Camel高危RCE漏洞引發數千次利用嘗試

漏洞態勢分析帕洛阿爾托網絡公司Unit 42團隊最新研究報告顯示,針對Apache Tomcat和Apache Camel關鍵漏洞的網絡攻擊正在全球激增。2025年3月披露的這三個遠程代碼執行(RCE, Remote Code Execution)漏洞——CVE-2025-24813(Tomcat&…

Odoo 中國特色高級工作流審批模塊研發

本文旨在為基于Odoo 18平臺開發一款符合中國用戶習慣的、功能強大的通用工作流審批模塊提供一份全面的技術實現與產品設計方案。該模塊的核心特性包括:為最終用戶設計的圖形化流程設計器、對任意Odoo模型的普適性、復雜的審批節點邏輯(如會簽、條件分支、…