什麼時候一個物件可以被垃圾回收?
Java 垃圾回收器跟蹤活動物件,並且不再需要的物件會被標記為垃圾回收。它使開發人員不必考慮記憶體分配/釋放問題。
當在 Java 程式中建立的物件不再可達或使用時,它就可以被垃圾回收。
以下是一些 Java 物件可能無法訪問/未使用的情況。
方法內部的物件 − 在 Java 中,方法儲存在棧記憶體中。當您呼叫一個方法時,JVM 將其提取到棧中並執行它。執行完成後,它將從棧中彈出,然後其所有變數都將被丟棄。
因此,當您在方法中建立物件時,在方法執行完成後,此物件將變得不可訪問。
示例
public class Sample {
String name;
Sample(String name){
this.name = name;
}
public static void sampleMethod(){
Sample obj1 = new Sample("myObject2");
Sample obj = new Sample("myObject1");
}
protected void finalize() throws Throwable {
System.out.println(this.name + " successfully garbage collected");
}
public static void main(String args[]){
sampleMethod();
System.gc();
}
}輸出
myObject1 successfully garbage collected myObject2 successfully garbage collected
重新賦值 − 當您將一個值(另一個物件)重新賦值給現有的引用變數時,原始物件最終將變得不可訪問。
示例
public class Sample {
String name;
Sample(String name){
this.name = name;
}
protected void finalize() throws Throwable {
System.out.println(this.name + " successfully garbage collected");
}
public static void main(String args[]){
Sample obj = new Sample("myObject1");
obj = new Sample("myObject2");
System.gc();
}
}輸出
myObject1 successfully garbage collected
賦值為 null − 當您將 null 值賦值給物件的引用時,它將不再可訪問。
示例
public class Sample {
String name;
Sample(String name){
this.name = name;
}
protected void finalize() throws Throwable {
System.out.println(this.name + " successfully garbage collected");
}
public static void main(String args[]){
Sample obj = new Sample("myObject1");
obj = null;
System.gc();
}
}輸出
myObject1 successfully garbage collected
匿名物件 − 實際上,匿名物件的引用不會儲存在任何地方,因此在第一次執行後您無法再次呼叫它,因此它不可訪問。
示例
public class Sample {
String name;
Sample(String name){
this.name = name;
}
public void sampleMethod(){
System.out.println("This is a sample method");
}
protected void finalize() throws Throwable {
System.out.println(this.name + " successfully garbage collected");
}
public static void main(String args[]){
new Sample("object1").sampleMethod();
System.gc();
}
}輸出
This is a sample method object1 successfully garbage collected
廣告
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP