当一个Java对象不再被程序使用时,它会被JVM自动回收,这个过程称为垃圾回收(Garbage Collection)。垃圾回收器会扫描堆中的所有对象,将未被引用的对象回收,腾出空间供其他对象使用。
Java 中对象的销毁与使用无关,取决于对象是否被垃圾回收器扫描到并回收,因此需要了解垃圾回收机制。
具体来说,Java 的垃圾回收器主要通过以下两个机制进行对象回收:
-
引用计数法。当一个对象被引用时,计数器加 1;当引用失效时,计数器减 1。当计数器为 0 时,对象会被垃圾回收器回收。但 Java 中循环引用会导致计数器算法失效,不再使用。
-
标记-清除法。垃圾回收器通过根搜索算法,标记所有可达对象(即被引用的对象),然后清除堆中未被标记的对象。这个过程会挂起当前线程,产生较大的性能开销。
示例1:
public class Example1 {
public static void main(String[] args) {
String str1 = "hello world";
String str2 = "hello world";
String str3 = str1;
str1 = null;
str2 = null;
// 此时字符串对象“hello world”仍然被str3引用,不会被垃圾回收器清理
}
}
示例2:
public class Example2 {
public static void main(String[] args) {
List<Object> objList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
objList.add(new Object());
}
// objList对象的引用被设为null,内部的Object对象仍可能被其他对象引用,不会被回收
objList = null;
// 此时内存中的10个匿名对象没有任何引用,会被JVM自动回收
// 即使手动调用System.gc()方法,也不能保证会立即执行垃圾回收过程
}
}
总之,如果程序员在代码编写过程中出现内存泄漏或者无谓的创建大量无用对象等情况,就会造成内存浪费,影响程序执行效率和稳定性。因此,在编写Java程序时,需要注意对象的创建和销毁,尽量避免出现频繁创建、使用、丢弃对象等不合理的行为,这样才能更好的利用Java的内存回收机制。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:你真的知道Java中对象的销毁吗 - Python技术站