首页 > 编程知识 正文

垃圾回收机制面试题,java垃圾收集器有哪些

时间:2023-05-04 18:49:34 阅读:163803 作者:4066

什么是垃圾回收:

java垃圾回收是java语言的重要功能之一,当程序创建引用类型实体(如对象或数组)时,系统会为堆内存分配内存空间,并将对象保存在此内存区域中。 如果未被任何引用变量引用此内存,则此内存将等待垃圾回收机制回收。 垃圾回收机制具有以下特点。

1垃圾回收机制只负责回收堆内存中的对象,不回收数据库连接、网络I/o等物理资源。

2程序无法准确控制垃圾回收的执行,垃圾回收将在适当的时候进行。 对象永久丢失引用后,系统何时回收其占用的内存?

3在垃圾回收机制重用对象之前,总是调用该对象的finalize ()方法。 此方法可能会通过重新启动对象(使引用变量重新引用对象)来导致垃圾回收机制取消重用。

内存中对象的状态:

如果对象正在堆内存中运行,则根据被引用变量引用的状态,可以将其状态分为以下三种:

1可访问状态:创建对象后,如果多个引用变量使用该变量,则该对象在程序中处于可访问状态,程序可以通过引用变量来调用该对象的字段和方法。

2可恢复状态:如果程序中的某个对象不再具有引用它的变量,它将变为可恢复状态。 在这种情况下,系统垃圾回收机制正在准备回收对象使用的内存。 在回收对象之前,请调用所有可恢复对象的finalize ()方法进行资源清理。 当系统调用finalize ) )方法时,如果将引用变量更改为引用对象,则对象将再次处于可访问状态。 否则,该对象将处于不可访问状态。

3如果对象与所有引用变量之间的关联已断开,并且系统调用了所有对象的finalize ()方法,但对象仍无法访问,则对象将永久丢失引用,最终处于不可访问状态。 只有当一个对象处于不可访问状态时,该对象占用的资源才会实际被重用。

强制回收垃圾:

对象失去引用后,系统什么时候调用其finalize )方法进行资源清理,什么时候成为不能到达的状态,系统什么时候调用回收内存,对程序完全透明,程序对对象完全透明虽然程序不能准确控制java垃圾回收的时机,但我们仍然可以控制系统进行垃圾回收-----这种强制只是通知系统垃圾回收,但系统是否进行垃圾回收仍然不确定

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

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

finalize ()方法:

垃圾回收机制通常需要程序通过调用相应的方法进行清理,然后才能回收对象占用的内存。 如果未明确指定清理资源,java将提供用于清理对象资源的默认机制。 这个机制是finalize ) )方法,这个方法是在Object类中定义的实例方法。 当finalize ()方法返回时,对象将消失,并执行垃圾回收机制。

任何java类都可以重写Object类的finalize )方法,该类用于清理对象占用的资源。 如果在程序结束之前没有进行垃圾回收,则不会调用丢失引用的finalize ()方法,而是清理资源。 垃圾回收机制何时调用对象的finalize )方法是完全透明的,只有在程序确定需要更多额外内存时才执行垃圾回收。 因此,如果丢失引用的对象只占用少量内存且系统不需要重要内存,则垃圾回收机制将不会尝试回收该对象正在消耗的资源,因此将使用该对象的finalize ()

finalize (方法具有以下四个特征:

1对象的finalize (不能主动调用方法。 交给垃圾回收机制吧。

2 finalize ) )方法何时调用和被调用是不确定的,finalize ) )方法不应被认为是必须执行的方法

JVM可恢复对象的finalize ) )方法可能会将该对象或系统中的其他对象恢复为可访问状态

如果JVM在执行finalize ()方法时出现异常,垃圾回收机制不会报告异常,而是继续执行程序。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。