应用程序结束时的垃圾收集
Garbage collection when application ends
据我所知,在为变量分配空值时对象可被垃圾收集:
Object a = new Object;
a = null; //it is now available for garbage collection
或者当对象由于方法执行完成而超出范围时:
public void gc(){
Object a = new Object;
} //once gc method is done the object where a is referring to will be available for garbage collection
在应用程序刚刚结束时给定的超出范围也不一样吗?
class Ink{}
public class Main {
Ink k = new Ink();
public void getSomething(){
//method codes here
}
public static void main(String[] args) {
Main n = new Main();
}
}
我希望应用程序结束时应该对 2 个对象(Ink 对象和 Main 对象)进行垃圾回收。
当 Java 应用程序终止时,JVM 通常也会在 OS 的范围内终止,因此此时的 GC 没有实际意义。在按照应用程序定义的方式有序关闭 JVM 后,所有资源都已返回到 OS。
您将对象变得符合 垃圾收集条件的事件与收集垃圾或更准确地说回收内存的实际过程混淆了。
垃圾收集器不会 运行 只是因为引用变为 null
或对象超出范围,那会浪费资源。通常 运行 秒,因为内存不足或 CPU 资源未使用。
此外,“垃圾收集”一词具有误导性。 JVM 的实际任务是将所有对象标记为仍然存在(也称为 reachable 对象)。其他一切都被认为是可回收的,也就是垃圾。由于在 JVM 终止时,整个内存本身都会被回收,因此无需搜索可达引用。
也就是说,这有助于理解,大多数关于内存管理的思考都是无用的。例如。在您的代码中:
public void gc(){
Object a = new Object;
// even here the object might get garbage collected as it is unused in subsequent code
}
优化器可能会删除对象的整个创建过程,因为它没有明显的效果。然后,将不会进行垃圾回收,因为首先还没有创建对象。
另见 here。
JVM 监视 GC 根 - 如果一个对象在 GC 根中不可用,那么它就是垃圾收集的候选对象。 GC根可以是
- 局部变量
- 活跃java个线程
- 静态变量
- jni 引用
据我所知,在为变量分配空值时对象可被垃圾收集:
Object a = new Object;
a = null; //it is now available for garbage collection
或者当对象由于方法执行完成而超出范围时:
public void gc(){
Object a = new Object;
} //once gc method is done the object where a is referring to will be available for garbage collection
在应用程序刚刚结束时给定的超出范围也不一样吗?
class Ink{}
public class Main {
Ink k = new Ink();
public void getSomething(){
//method codes here
}
public static void main(String[] args) {
Main n = new Main();
}
}
我希望应用程序结束时应该对 2 个对象(Ink 对象和 Main 对象)进行垃圾回收。
当 Java 应用程序终止时,JVM 通常也会在 OS 的范围内终止,因此此时的 GC 没有实际意义。在按照应用程序定义的方式有序关闭 JVM 后,所有资源都已返回到 OS。
您将对象变得符合 垃圾收集条件的事件与收集垃圾或更准确地说回收内存的实际过程混淆了。
垃圾收集器不会 运行 只是因为引用变为 null
或对象超出范围,那会浪费资源。通常 运行 秒,因为内存不足或 CPU 资源未使用。
此外,“垃圾收集”一词具有误导性。 JVM 的实际任务是将所有对象标记为仍然存在(也称为 reachable 对象)。其他一切都被认为是可回收的,也就是垃圾。由于在 JVM 终止时,整个内存本身都会被回收,因此无需搜索可达引用。
也就是说,这有助于理解,大多数关于内存管理的思考都是无用的。例如。在您的代码中:
public void gc(){
Object a = new Object;
// even here the object might get garbage collected as it is unused in subsequent code
}
优化器可能会删除对象的整个创建过程,因为它没有明显的效果。然后,将不会进行垃圾回收,因为首先还没有创建对象。
另见 here。
JVM 监视 GC 根 - 如果一个对象在 GC 根中不可用,那么它就是垃圾收集的候选对象。 GC根可以是
- 局部变量
- 活跃java个线程
- 静态变量
- jni 引用