Java垃圾回收是Java程序自动管理内存的过程。
Java程序会被编译成字节码,可以在Java虚拟机(简称JVM)上执行。在JVM上运行的Java程序中,对象会在堆中创建,堆是专门用于程序对象的内存区域。
到最后,一些对象将不再被需要。垃圾收集器找到这些不再使用的对象然后删除它们,从而释放内存空间。
让对象可以被垃圾回收的方法- 即使程序员不需要负责销毁无用的对象,但强烈建议这样做,在不再需要某个对象时使其不可达(从而可以被垃圾回收)。
- 通常有四种方法可以让对象可以被垃圾回收。
1.将引用变量设置为 null:将引用变量设置为 null
,如果没有其他引用指向该对象,该对象将可以被垃圾回收器回收。
2. 重新分配引用变量的指向:改变现有引用变量所指向的对象,使之在没有其他引用指向它时,成为垃圾回收的候选对象。
3. 在方法内部创建的对象:在方法内部创建的对象,一旦方法结束且不再有引用指向它,就可以被垃圾回收机制回收。
4. 孤立的岛屿:当一个对象无法从任何活的线程或静态引用中触及或到达时,它就变得孤立无援,并就可以被垃圾回收机制回收。
孤岛的例子
触发JVM垃圾收集的方法在 Java 中,让一个对象成为垃圾回收的对象候选并不能保证它会被立即回收。JVM 会根据需要运行垃圾回收器。你可以通过以下方式来请求垃圾回收。
**System.gc()**
:系统类中的一个静态方法,用于垃圾回收。**Runtime.getRuntime().gc()**
:运行时对象中的一个方法,用于垃圾回收。
然而,这两种都无法保证垃圾收集器真的会启动。
最终步骤 : 垃圾收集器在回收对象之前通常会调用 finalize() 方法:在销毁一个对象之前,垃圾回收器会调用该对象的 finalize()
方法来进行清理工作。这个方法在 Object
类中定义,其原型为 protected void finalize() throws Throwable
,可以被重写以管理资源,比如关闭与数据库的连接。
关于 finalize()
的一些要点:
- 它由垃圾回收器负责,垃圾回收器是JVM的一部分。
- 默认实现为空,因此建议重写它以进行清理。
- 对象的
finalize()
方法永远不会被调用超过一次。 - 如果在
finalize()
中发生未捕获的异常,该异常将被忽略,对象的终结过程结束。
顺序垃圾收集器(garbage collector)
- 使用单线程收集;非常适合内存需求低的小型应用。
并行垃圾回收器 :
- 使用多个线程来处理小集合;最适合需要高吞吐量的应用,例如,这类应用可能包括某些数据库操作或并发任务处理。
并发标记-清除(CMS)收集器:
- 减少暂停时间,与应用线程并行运行;非常适合低延迟的应用场景。
G1 (G1垃圾收集器):
- 将内存堆分成多个区域,优先处理垃圾最多的部分;适用于需要预测暂停时间的大应用。
Mark 和 Sweep 是垃圾收集的两个阶段。在 Mark 阶段,JVM 会识别对象是否仍被引用。不再被引用的对象将被标记以进行 GC。
在Sweep(清理)阶段,JVM进行垃圾回收算法。
不同时代线程是什么?垃圾回收器是后台线程吗?在应用程序中运行的后台线程称为守护(daemon)线程。
没错,GC 是由 JVM 启动的一个后台线程。
垃圾收集器对一个对象调用了 finalize() 方法多少次?就一次。
代码里能不能触发垃圾收集?我们可以通过调用 system.gc
,不过不能保证它一定会被调用。
共同学习,写下你的评论
评论加载中...
作者其他优质文章