Java(十九)——对象与垃圾回收

Java的垃圾回收是Java语言的重要功能之一。当程序创建对象、数组等引用类型的实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存区中,当这块内存区不再被任何引用变量引用时,这块内存就编程垃圾,等待垃圾回收机制进行回收。垃圾回收机制有如下特征。

  • 垃圾回收机制只负责回收堆内存的对象,不会回收任何物理资源(例如数据库连接、网络IO等资源)。
  • 程序无法精确控制垃圾回收的运行,垃圾回收会在合适的时候进行。当对象永久性地失去引用后,系统就会在合适的时候回收它所占的内存。
  • 在垃圾回收机制回收任何对象之前,总会先调用它的finalize()方法,该方法可能使该对象重新复活(让一个引用变量重新引用该对象),从而导致垃圾回收机制取消回收。
    ##对象在内存中的状态
    当一个对象在堆内存中运行时,根据它被引用变量所引用的状态,可以把它所处的状态分为如下三种:
  • 可达状态:当一个对象被创建后,若有一个以上的引用变量引用它,则这个对象在程序中处于可达状态,程序可通过引用变量来调用该对象的实例变量和方法。
  • 可恢复状态:如果程序中某个对象不再有任何引用变量引用它,它就进入了可恢复状态。在这种状态下,系统的垃圾回收机制准备回收该对象所占用的内存,在回收该对象之前,系统会调用所有可恢复状态对象的finalize()方法进行资源清理。如果系统在调用finalize()方法时重新让一个引用变量引用该对象,则这个对象会再次变为可达状态;否则该对象进入不可达状态。
  • 不可达状态:当对象与所有引用变量的关联都被切断,且系统已经调用所有对象的finalize()方法后依然没有使该对象变成可达状态,那么这个对象将永久性地失去引用,最后变成不可达状态。只有当一个对象处于不可达状态时,系统才会真正回收该对象所占有的资源。
    ##强制垃圾回收
    当一个对象失去引用后,系统何时调用它的finalize()方法对它进行资源清理,何时它会变成不可达状态,系统何时回收它所占有的内存,对于程序完全透明。程序只能控制一个对象何时不再被任何引用变量引用,绝不能控制它何时被回收。

程序无法精确控制Java垃圾回收的时机,但依然可以强制系统进行垃圾回收——这种强制只是通知系统进行垃圾回收,但系统是否进行垃圾回收依然不确定。大部分时候,程序强制系统垃圾回收后总会有一些效果。强制系统垃圾回收有如下两种方式。

  • 调用System类的gc()静态方法:System.gc();
  • 调用Runtime对象的gc()实例方法:Runtime.getRuntime.gc();

finalize方法

在垃圾回收机制回收某个对象所占用的内存之前,通常要求程序调用适当的方法来清理资源,在没有明确指定清理资源的情况下,Java提供了默认机制来清理该对象的资源,这个机制就是finalize()方法。该方法是定义在Object类里的实例方法,方法原型为:
protected void finalize() throws Throwable
当finalize()方法返回后,对象消失,垃圾回收机制开始执行。方法原型中的throws Throwable表示它可以抛出任何类型的异常。
任何Java类都可以重写Object类的finalize()方法,在该方法中清理对象占用的资源。如果程序终止之前始终没有进行垃圾回收,则不会调用失去引用对象的finalize()方法来清理资源。垃圾回收机制何时调用对象的finalize()方法时完全透明的,只有当程序认为需要更多的额外内存时,垃圾回收机制才会进行垃圾回收。因此,完全有可能出现这样一种情形:某个失去引用的对象只占用了少量内存,而且系统没有产生严重的内存需求,因此垃圾回收机制并没有试图回收该对象所占用的资源,所以该对象的finalize()方法也不会得到调用。
finalize()方法具有如下4个特点。‘

  • 永远不要主动调用某个对象的finalize()方法,该方法应交给垃圾回收机制调用。
  • finalize()方法何时被调用,是否被调用具有不确定性,不要把finalize()方法当成一定会被执行的方法。
  • 当JVM执行可恢复对象的finalize()方法时,可能使该对象或系统中其他对象重新变成可达状态。
  • 当JVM执行finalize()方法时出现异常时,垃圾回收机制不会报告异常,程序继续执行。
    ##对象的软、弱和虚引用
    对大部分对象而言,程序里会有一个引用变量引用该对象,这是最常见的引用方式。除此之外,java.lang.ref包下提供了3个类:SoftReference、PhantomReference和WeakReference,它们分别代表了系统对对象的3中引用方式:软引用、虚引用和弱引用。因此,Java语言对对象的引用有如下4种方式。
    1. 强引用(StrongReference)
    这是Java程序中最常见的引用方式。程序创建一个对象,并把这个对象赋给一个引用变量,程序通过该引用变量来操作实际的对象,前面介绍的对象和数组都采用了这种强引用的方式。当一个对象被一个或一个以上的引用变量所引用时,它处于可达状态,不可能被系统垃圾回收机制回收。
    2.软引用(SoftReference)
    软引用需要通过SoftReference类来实现,当一个对象只有软引用时,它有可能被垃圾回收机制回收。对于只有软引用的对象而言,当系统内存空间足够时,它不会被系统回收,程序也可使用该对象;当系统内存空间不足时,系统可能会回收它。软引用通常用于对内存敏感的程序中。
    3.弱引用(WeakReference)
    弱引用通过WeakReference类实现,弱引用和软引用很像,但弱引用的引用级别更低。对于只有弱引用的对象而言,当系统垃圾回收机制运行时,不管系统内存是否足够,总会回收该对象所占用的内存。当然,并不是说当一个对象只有弱引用时,它就会立即被回收——正如那些失去引用的对象一样,必须等到系统垃圾回收机制运行时才会被回收。
    4.虚引用(PhantomReference)
    虚引用通过PhantomReference类实现,虚引用完全类似于没有引用。虚引用对对象本身没有太大影响,对象甚至感觉不到虚引用的存在。如果一个对象只有一个虚引用时,那么它和没有引用的效果大致相同。虚引用主要用于跟踪对象被垃圾回收的状态,虚引用不能单独使用,虚引用必须和引用队列(ReferenceQueue)联合使用。
    上面三个引用类都包含了一个get()方法,用于获取他们所引用的对象。
Android AVB 分析(十二)嵌入式设备安全中的 dm-verity 简介 上一篇 《Android AVB 分析(十一)bootloader 是如何进行 verify boot 检查的?》 分析了 bootloader 中是如何调用 libavb 函数库验证 vbmeta 和 boot 等分区的。接下来就打算写一篇介绍 dm-verity 原理的文章,然后再写一篇徒手 dm-verity 实践的文章,结果偶然发现了本篇的英文原版。写得太好,我觉得自己完全没有必要再写原理了。由于原文是英文,有些英语不太好的朋友不一定能完全理解。我花了点时间,结合 AI 将英语原文翻译成中文。 阅读详情

相关推荐

FPGA新手必看:Create HDL Wrapper和Generating Output Products到底该先用哪个?

本文深入解析了FPGA设计中Create HDL Wrapper与Generating Output Products的正确使用顺序,帮助新手避免常见错误。详细介绍了两者的功能差异、执行顺序的底层逻辑以及工程管理的最佳实践,特别适合使用Vivado进行FPGA开发的初学者。

xk7n92h3p5m的博客 1065

JPA实体的四种状态

文章目录JPA中的实体对象拥有四种状态:一、瞬时状态二、托管状态三、游离状态四、删除状态 JPA中的实体对象拥有四种状态: 瞬时状态(transient) 托管状态(persistent) 游离状态(detached) 删除状态 (deleted) 一、瞬时状态 瞬时状态的实体就是一个普通的java对象,和持久化上下文无关联,数据库中也没有数据与之对应。 二、托管状态 使用EntityManager进行find或者persist操作返回的对象即处于托管状态,此时该对象已经处于持久化上下文中,因此任

Mr_Wanter 3740

国内合规开通ChatGPT Plus实操指南:银行卡绑卡与支付全解析

ChatGPT Plus 是 OpenAI 官方推出的高级订阅服务,基于 GPT-4o 多模态大模型提供语音交互、图像理解与长上下文处理能力。其核心使用前提在于完成合规的国际支付绑定,而非网络接入方式。技术原理上,OpenAI 采用 Stripe 支付网关进行风控校验,重点匹配银行跨境权限、卡片类型(仅支持 Visa/Mastercard/Amex 信用卡)、BIN 号段及地理位置一致性。该机制决定了95%的绑卡失败源于银行端配置缺失或卡片不兼容,而非网络问题。实际应用中,PayPal 作为中间支付层可显著

chuannaoxuan4674的博客 1964

JPA 实体生命周期理解和总结

先来一个图jpa 实体生命周期有四种状态 New:瞬时对象,尚未有id,还未和Persistence Context建立关联的对象。 Managed:持久化受管对象,有id值,已经和Persistence Context建立了关联的对象。 Datached:游离态离线对象,有id值,但没有和Persistence Context建立关联的对象。 Removed:删除的对象,有id值,尚且和Persi

打不死的小强 7572

snipersim安装

snipersim安装记录,便于后续使用tip:snipersim需要在python2的环境下编译。

weixin_53507617的博客 917

pytorch中的wheel文件

whl 文件是 Python 的一个软件包分发格式,用于在 Python 中安装软件包。它是 Python Wheel 的缩写,也被称为 wheel 文件。这种文件格式旨在简化 Python 软件包的安装和分发。对于 PyTorch 而言,它提供了预编译的 .whl 文件,您可以通过 pip 安装这些文件来快速方便地安装 PyTorch。这些 .whl 文件是已经编译好的二进制分发文件,可以直接安装在您的 Python 环境中,而无需再进行编译。

bj_zhb的博客 3127

java对象不被gc回收的情况,单例对象无法被回收的原因 - gc回收机制

单例对象无法被回收的真正原因要从java垃圾回收器开始说起JAVA垃圾对象判断准则Java中判断一个对象是否可以被回收是根据“可达性”来判定的。可达性:以一系列的称为 “GC Roots”的对象作为起始点,然后向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,即可视为垃圾。GC Roots点包含:虚拟机...

weixin_33021323的博客 8324

QCC5125/QCC5144----LDAC 44.1K 48K 96K 192K 输出

QCC5125/QCC5144----LDAC 44.1K 48K 96K 192K 输出。而且还不需要license限制。

Alex_886的博客 1975

.net中对象占用资源的回收

一,使用Finalizer析构器 1,使用了Finalizer析构器的对象如何被回收? 在类中定义了析构器的对象将会被移动到一个专门的队列中,这个队列将作为它的应用程序根,而使队列中的对象存活的更久一点,在对象上面调用完析构函数后,对象才会从队列中清理掉...

weixin_33969116的博客 183

AD20.多对多工程中将某个原理图导入PCB工程

AD20将多个原理图中的一个或多个导入到PCB文件中

鬼爷杂货铺 1万+

SXU-软件项目管理-朱少民-第九章 项目监控与控制 第十章 项目收尾 附相关习题

软件项目管理-朱少民-第九章 项目监控与控制 附相关习题

weixin_63597914的博客 1488

Java - 对象与垃圾回收

垃圾回收 Java的垃圾回收是Java语言的重要功能之一。当程序创建对象、数组等引用类型实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存中,当这块内存不在被任何引用变量引用时,这块内存就变成垃圾,等待垃圾回收机制进行回收。垃圾回收机制具有如下特征: (1)垃圾回收机制只负责回收对内存中的对象,不会回收任何物理资源(例如数据库连接、网络IO等资源)。 (2)程序无法精确

ly199108171231的博客 381

【GlobalMapper精品教程】001:GlobalMapper23+24+25 Pro-x64中文汉化版安装教程(附软件包下载)

Global Mapper 23+V24+V25中文汉化版安装教程及免费下载地址,是一款非常专业的地图绘制软件,功能非常的丰富,内置距离和面积计算,包括光栅混合、对比度调节、海拔高度查询、视线计算以及一些高级功能,通过地表数据观察分水岭、对3Dpoint数据转换为三角多边形和网格化等设置。本文讲解GlobalMapper23.1 Pro-x64安装过程。

智慧空间实验室 3万+

JVM工作原理与实战(三十九):G1垃圾回收器原理

JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了G1垃圾回收器执行流程、年轻代回收原理、卡表(Card Table)、记忆集的生成流程、年轻代回收的详细步骤、混合回收的步骤、初始标记、并发标记、SATB、转移等内容。

Rye的博客 4688

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

线程和垃圾回收机制

二十九.线程 1.线程的创建方法 1.进程:一个正在运行的程序,如qq音乐,浏览器等 2.线程: 线程是进程中的一个执行单元。如qq音乐中的播放和下载,可以同时进行 3.关系:在一个进程中可以包含多个线程 ,当需要在同一时间做多件事情,就需要开启多个线程 关键字: Thread (需要被继承) Runnable(接口,需要被实现) 开线程必须要用thread类当中的strat()方法 5.如何创建线程 方式一: 1.在java中main函数被称为主线程 多个线程之间的执行是互不影响的 ​ 2.

weixin_51721670的博客 1546

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

JVM(十九)—— 垃圾回收(五)

当线程运行到安全区域的代码时,首先标识已经进入了安全区域,如果这段时间发生GC,JVM会忽略标识为安全区域状态的线程。当线程即将离开安全区域时,会检查JVM是否已经完成GC,如果完成了,则继续运行,否则线程必须等待直到收到可以安全离开安全区域的信号为止。**安全区域是指在一段代码片段中,对象的引用关系不会发生变化,在这个区域中的任何位置开始GC 都是安全的,**我们也可以将安全区域看做是被扩展了的安全点。并发(Concurrent):指用户线程与垃圾回收线程同时执行,但不一定是并行的,可能会交替执行。

壹升茉莉清的博客 619

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

JVM笔记十九:垃圾回收概述

垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。 ——垃圾收集机制是Java的招牌能力,极大地提高了开发效率。如今,垃圾收集几乎成为现代语言的标配,即使经过如此长时间的发展,Java的垃圾收集机制仍然在不断的演进中,不同大小的设备、不同特征的应用场景,对垃圾收集提出了新的挑战。 什么是垃圾 垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。 如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直保留到

munangs的博客 222

回收对象资源

public class Shouhui {private String name;public Shouhui(String names){ this.name=names; System.out.println(name+"被建立");}protected void finalize(){ System.out.println(name+"被消灭"); this

皮皮的专栏 679

day11作业-韩明琰

抽象类+接口+内部类作业题 ⦁选择题 1.Person类和Test类的代码如下所示,则代码中的错误语句是(C )。(选择一项)public class Person {public String name;public Person(String name) {this.name = name;}}public class Test { public static ...

weixin_30951389的博客 463

计算机网络学习笔记(二)——物理层

一、基本概念 物理层解决如何在连接各种计算机的传输媒体上传输数据比特流,而不是指具体的传输媒体 物理层主要任务:确定与传输媒体接口有关的一些特性——定义标准 机械特性 定义物理连接的特性,规定物理连接时所采用的的规格、接口形状、引线数目、引脚数量和排列情况 电气特性 规定传输二进制位时,线路上信号的电压范围、阻抗匹配、传输速率和距离限制等。 功能特性 指明某条线上出现的某一电平表示何种意义,接口部件的信号线的用途。 规程特性 (过程特性) 定义各条物理线路的工作规程和时序关系。 二、数据通信基础知识 1

Undergoer的博客 5158

Java对象垃圾回收调用_java的对象与垃圾回收机制

java 的垃圾回收是 java 语言的重要功能之一。当程序创建对象、数组等引用类型实体时,系统会在堆内存中位置分配一块内存区,对象就保存在这块内存区中,当这块内存不在被任何变量引用时,这块内存就变成垃圾,等待垃圾回收机制进行回收。垃圾回收机制具有如下特征。垃圾回收机制只负责回收堆内存中的对象,不会回收任何物理资源(例如数据库连接,网络等资源)程序无法控制垃圾回收的运行,垃圾回收会在合适的时候进行...

weixin_34493096的博客 1010

抽象类+接口+内部类作业题及答案

抽象类+接口+内部类作业题 一、选择题 Person类和Test类的代码如下所示,则代码中的错误语句是( )。(选择一项) public class Person { public String name; public Person(String name) { this.name = name; } } public class Test { public static void m...

qq_42591018的博客 7450

关于java垃圾回收机制

c语言的垃圾回收是人工回收,他们可控性强,java语言垃圾回收是自动的,可控性差,有时候会出现内存溢出的情况(内存溢出: 也就是jvm分配的内存对象过多,超过了最大可分配内存的大小) 提到垃圾回收机制,就要提到Gc方法,System.gc()这个方法就是来调用垃圾收集器的,在调用时,垃圾收集器将运行已回收但未使用的内存空间,它将尝试释放被丢弃对象占用的存,System.gc()方法有一个免责声明,它和finalize()方法一样不能保证马上能执行,有时候程序执行的比较快,到结束进程了都没有...

weixin_48803785的博客 950

《疯狂java讲义》学习(20):对象与垃圾回收

对象与垃圾回收 Java的垃圾回收是Java语言的重要功能之一。当程序创建对象、数组等引用类型实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存区中,当这块内存不再被任何引用变量引用时,这块内存就变成垃圾,等待垃圾回收机制进行回收。垃圾回收机制具有如下特征: 垃圾回收机制只负责回收堆内存中的对象,不会回收任何物理资源(例如数据库连接、网络IO等资源)。 程序无法精确控制垃圾回收的...

泛泛之素 982

java中的垃圾回收机制

何为垃圾回收:       java的垃圾回收是java语言的重要功能之一,当程序创建对象、数组等引用类型实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存区中,当这块内存不在被任何引用变量引用时,这块内存就变成垃圾,等待垃圾回收机制进行回收。垃圾回收机制有如下特征:         1> 垃圾回收机制只负责回收堆内存中的对象,不会回收任何物理资源(例如 数据库连接、网络IO等

Vegetable的博客 726

垃圾回收机制

什么是垃圾回收本文摘自我们几周后即将出版的Garbage Collection Handbook一书的样章。同时也让你能熟悉下垃圾回收的基础知识——这选自该书的第一章。乍一看,垃圾回收所做的事情应当恰如其名——查找并清除垃圾。事实上却恰恰相反。垃圾回收会跟踪所有仍在使用的对象,然后将剩余的对象标记为垃圾。牢记了这点之后,我们再来深入地了解下这个被称为“垃圾回收”的自动化内存回收在JVM中到底是如何实

renwotao2009的专栏 1032
上一篇: Java(十八)——final修饰符
下一篇: Java(二十)——Java基础类库之main()、Scanner类、System类
Undergoer_TW
博客等级 码龄11年 185粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值