浅谈垃圾回收(System.gc()和Runtime.getRuntime.gc())

讲垃圾回收,那先说一下Java中如何判定垃圾

状态判定

在Java中,当一个对象在堆内存中运行时,根据它被引用的状态,可以分为可用状态,可恢复状态和不可用状态。简单的概述为:

可用状态:对象创建后,有一个以上的引用变量引用它,该对象将处于可用状态。

可恢复状态:如果对象没有任何引用变量引用它,则进入可恢复状态

不可用状态:对象失去了所有引用变量的关联,且系统已经调用了所有的finalize()方法后依旧没有使其变为可用状态,将变为不可用状态。

只有当一个对象处于不可用状态,这是系统才会判定该对象为垃圾对象,系统才会回收该对象所占用的内存。

回收机制

一个对象变成垃圾后,会暂时储存到内存中,当垃圾积攒到一定程度时,Java虚拟机会启动垃圾回收器,进行垃圾对象的内存释放,这时,它的finalize()方法会被自动调用,而finalize()方法是定义在Object类中的实例方法,原型可以了解一下:

protected void finalize() throws Throwable{}

缺点

虽然程序会自己进行清理,但是,无法进行精准的控制垃圾回收。需要注意的是,只有当程序认为需要更多的内存时,垃圾回收器才会自动进行垃圾清理。

如果我们要的进行垃圾回收,我们可以通过两种方式,强制系统进行垃圾回收:

调用System类的gc()静态方法:System.gc()

调用Runtime对象的gc()实例方法:Runtime.getRuntime.gc().

实际上,调用Systemgc()方法时,执行的是Runtime.getRuntime.gc()方法。调用这两种方法,只是强制启动垃圾回收器,但是系统是否立即进行,是不确定的。

System.gc()方法

场景:在Java中,当一个对象成为垃圾时仍会占用内存空间,时间一长,就会导致内存空间不足。

目的回收垃圾对象, 释放内存

System.gc()方法的运行机制:调用该方法,提醒Java虚拟机进行垃圾回收。当一个对象被回收时,会调用它的finalize()方法,因此,我们可以定义finalize()方法进行查看,是不是进行了垃圾对象回收。

finalize()方法:finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法。

实现如下:

package day5;
import java.util.*;
class person{
//	重写finalize()方法
	public void finalize() {
		System.out.println("正在调用finalize()方法");
	}
}
public class test1 {
	public static void main(String[] args) {
		person pe1=new person();
		person pe2=new person();
		pe1=null;
		pe2=null;
//		调用System.gc()提醒垃圾回收
		System.gc();
		System.out.println("程序结束!");
		System.out.println("程序结束!");
	}
}

因为是该方法是提醒Java虚拟机进行垃圾回收,无法保证对垃圾收集器的调用,不能确保立即生效。多运行几遍,几种不同结果如下:

 

区分C++和Java中的finalize():

有些程序员(特别是 C++程序员)刚开始可能会误把finalize( )当作C++中的“析构函数”(C++中销毁对象必须用到这个函数),所以有必要明确区分一下:在 C++中,对象一定会被“销毁”(如果程序中没有错误的话);而 Java 里的对象却并非总是被“垃圾回收”的。

知识扩展:

runFinalization()方法:强制调用已经失去引用的对象的finalize方法,因为当垃圾收集器认为没有指向对象实例的引用时,会在销毁该对象之前调用finalize()方法。该方法最常见的作用是确保释放实例占用的全部资源。java并不保证定时为对象实例调用该方法,甚至不保证方法会被调用,所以该方法不应该用于正常内存处理。

2022.1.21

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值