java基础:简述垃圾回收机制

article/2025/10/8 2:13:21

1.什么是“垃圾回收”机制?

当程序创建对象,数组等引用类型实体时,系统会在堆内存中为之分配一块内存区,对象就保存在内存区中,当内存不再被任何引用变量引用时,这块内存就变成了垃圾,等待垃圾回收机制去进行回收。

2.垃圾回收机制的特点:

*垃圾回收机制只负责回收堆内存中的对象,不会回收任何物理资源(网络io等)

*程序无法精准控制垃圾回收的运行,垃圾回收在合适的时候进行,当对象永久性失去了引用后。系统会在合适的时候回收它所占的内存

*在垃圾回收机制回收任何对象之前,总会调用它的finalize()方法,该方法可能使该对象重新复活(使用一个引用变量重新去引用该对象),从而导致垃圾回收机制取消回收

3.对象在内存中的状态?

*可达状态:当一个对象创建后,如果有一个以上的引用变量去引用它,则处于可达状态

*可恢复状态:如果程序中的某个对象不再有任何引用变量去引用它,它就进入了可恢复状态,在这种状态下,系统的垃圾回收机制准备回收该对象所占用的内存,在回收该对象前,系统会调用它的finalize()方法实现资源清理,如果这时有引用变量进行引用时该对象,则该对象会再次变为可达状态,否则会变为不可达状态

*不可达状态:当对象和所有引用变量的关联都被切断,且系统已经调用所有对象的finalize()后,对象依然没有达到可达状态,则该对象永久性失去引用,最后达到不可达状态,系统回收该对象所占有的所有资源

 

4.强制垃圾回收

当对象失去引用后,程序不知晓什么时候进行资源清理,垃圾回收,程序只能控制对象何时不再被任何引用变量引用,绝不能控制对象何时被回收

程序无法控制java垃圾回收的时机,但是可以通知系统进行垃圾回收(强制垃圾回收),但是只是通知,系统是否垃圾回收还是不确定。大部分时候,程序强制系统回收后总会有一些效果

强制回收方法

*System.gc()

*Runtime.getRuntime().gc()

 

什么是finalize方法?

1.在垃圾回收机制回收某个对象占用的资源之前,通常要求程序调用适当的方法来进行资源的清理,在java中提供了默认的机制来进行资源的清理(finalize()方法)

原型:protected void finalize() throws Throwable

特点:

*不要主动去调用finalize()方法,由垃圾回收机制调用

*该方法的调用具有随机性

*在调用该方法的时候,可能使该对象或者系统中的对象重新变成可达状态(有其他对象引用)

*当JVM执行finalize方法出现异常时,垃圾回收机制不会报告异常,程序会进行执行

*如果想人为去清理某个类的资源时,由于finalize方法具有随机性,因此不要采用该方法

 

举个栗子:

public class FinalizeDemo {private static FinalizeDemo fd=null;public void info(){System.out.println("测试资源调度的Finalize方法");}public static void main(String[]args) throws Exception{new FinalizeDemo();//创建新的对象//通知系统进行资源清理System.gc();//让系统执行finalize方法 强制回收Runtime.getRuntime().runFinalization();System.runFinalization();fd.info();}//重写该方法@Overridepublic void finalize(){//使对象重新变成可达状态fd=this;}
}

 


*使用system.gc()可以提醒系统去清空资源 如果调用取消强制垃圾回收,会出现空指针异常(因为程序没有通知系统进行垃圾回收,内存也不紧张,所以不会调用finalize方法,fd变量依旧为null。出现空指针异常)

 

 

 


http://chatgpt.dhexx.cn/article/5cNX06Tx.shtml

相关文章

Java的垃圾回收机制介绍

1、java的语言框架 (1)CPU->操作系统内核->应用层框架->JVM(java虚拟机)->Java字节码->Java源代码 (2)java是解释型语言,嵌入式常用的C/C是编译型语言,简单来说:编译型语言只需要编译一次就可以执行&am…

JVM-垃圾回收机制

JVM-垃圾回收机制 引言1、什么是垃圾2、为什么需要GC3、Java中的垃圾回收 垃圾回收相关算法垃圾判断算法标记阶段:引用计数算法标记阶段:可达性分析算法 垃圾清除算法清除阶段:标记-清除算法清除阶段:标记-整理算法清除阶段&#…

Java的垃圾回收机制是什么?

说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来。在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理。 顾名思义,垃圾回收就是…

GC垃圾回收机制

GC概述 垃圾回收是一种自动的存储管理机制。当一些被占用的内存不再需要时,将其释放,以让出空间,这种存储管理机制,就叫做垃圾回收机制。可以很大程度减轻程序员的负担和错误。 通常在堆(heap) 和 元空间(metaspace)需要GC机制。…

python垃圾回收机制

python垃圾回收机制 现在的高级语言如java,c#等,都采用了垃圾收集机制,而不再是c,c里用户自己管理维护内存的方式。自己管理内存极其自由,可以任意申请内存,但如同一把双刃剑,为大量内存泄露&a…

Java 垃圾回收机制原理

最近做一个ETL的项目模块,经常由于查询数据量比较大用消息中间件MQ时引起了内存溢出的报错。做完后没事研究了一下JVM和垃圾回收的相关知识点。 一:垃圾回收机制的意义 java 语言中一个显著的特点就是引入了java回收机制,是c程序员最头疼的…

五、垃圾回收机制

一 引入 解释器在执行到定义变量的语法时,会申请内存空间来存放变量的值,而内存的容量是有限的,这就涉及到变量值所占用内存空间的回收问题,当一个变量值没有用了(简称垃圾)就应该将其占用的内存给回收掉&…

一、垃圾回收机制

. 一、Java内存结构1、Java堆(Java Heap)2、Java虚拟机栈(Java Virtual Machine Stacks)3、本地方法栈(Native Method Stack)4、方法区(Method Area)5、执行引擎 二、垃圾回收机制1、…

垃圾回收机制浅聊

对于任何一门语言而言,在运行过程中都会创建许多对象,继而需要为这些对象分配内存地址,当这些对象不需要使用的时候,需要释放其占用的内存地址,以供新的对象使用。关于对象内存释放的这一机制就叫做垃圾回收机制&#…

图解Java 垃圾回收机制

摘要: Java技术体系中所提倡的 自动内存管理 最终可以归结为自动化地解决了两个问题:给对象分配内存 以及 回收分配给对象的内存,而且这两个问题针对的内存区域就是Java内存模型中的 堆区。关于对象分配内存问题,笔者的博文《JVM …

深入理解 Java 垃圾回收机制

一:垃圾回收机制的意义 java 语言中一个显著的特点就是引入了java回收机制,是c程序员最头疼的内存管理的问题迎刃而解,它使得java程序员在编写程序的时候不在考虑内存管理。由于有个垃圾回收机制,java中的额对象不在有“作用域”…

JVM垃圾回收机制

文章目录 JVM垃圾回收机制一、垃圾回收原理二、对象被标记为垃圾方法1. 引用计数器2. 可达性分析 三、垃圾回收算法1. 标记-清除算法2. 复制算法3. 标记-整理算法4. 分代回收算法 JVM垃圾回收机制 一、垃圾回收原理 GC (Garbage Collection:即垃圾回收)的基本原理&#xff1a…

Java垃圾回收(GC)机制

一、为什么要垃圾回收 如果不进行垃圾回收,内存迟早都会被消耗空,因为我们在不断的分配内存空间而不进行回收。除非内存无限大,我们可以任性的分配而不回收,但是事实并非如此。所以,垃圾回收是必须的。 哪些内存需要…

JVM:常用的四种垃圾回收机制

1.CMS (Concurrent Mark Sweep):并行 标记清除 老年代垃圾回收机制 cms是一个基于标记-清除 算法的综合多种算法的老年代垃圾回收器 适用场景:重视服务器响应速度,要求系统停顿时间最短。 这里要说明下,这是一个老年代算法&…

什么是垃圾回收机制(超详细)

垃圾回收机制 1.垃圾回收机制(Garbage Collction)简称GC,是JavaScript中使用的内存管理系统的基本组部分,是为了防止内存泄漏 2.JavaScript是在创建变量(对象、字符串等)时自动进行了分配内存,并…

深入理解JVM—垃圾回收机制

一、前言 明确垃圾收集器关注的部分:堆和方法区。着重学习如何确定哪些垃圾需要回收、垃圾回收算法以及GC触发条件。 二、如何确定哪些垃圾需要回收 1、引用计数算法 在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一&…

JavaScript垃圾回收机制

JavaScript垃圾回收机制 1 垃圾为何要产生并回收2 垃圾回收机制2.1 标记清除法2.2 引用计数法 3 V8对垃圾回收机制的优化——分代式垃圾回收机制3.1 新生代与老生代3.2 新生代的垃圾回收3.3 老生代的垃圾回收 1 垃圾为何要产生并回收 当我们写代码时创建一个基本类型、对象、函…

mysql初学——“[ERROR] [MY-012271] [InnoDB] The innodb_system data file 'ibdata1' must be writable”

这个问题一般会在安装后,想要启动mysql的时候出现。之前在网上查到过处理这类问题的解决方案,是删除一些文件,后面发现没有用,并且导致其他一些问题的出现。在stackoverflowed网站中发现一种解释是mysql已经运行了,发现…

MySQL的ibdata1文件无了该怎么恢复

前段时间电脑突然坏了,系统盘全部格式化了,只剩data源文件,装上MySQL把源文件放进去后发现所有库的表打不了开了, 我的mysql是5.7的版本,看网上说是ibdata1文件的问题,以前的ibdata1文件已经没了&#xff…

windows mysql 启动失败 :The innodb_system data file ‘ibdata1‘ must be writable

net start mysql 启动失败 在安装目录如:D:\mysql8\bin 下按住shift点击右键,启动cmd或者PowerShell 执行命令:mysqld --console 查看日志 注意error级别的记录:The innodb_system data file ‘ibdata1’ must be writable 进入…