0

如果可變指向存儲器中的空引用,那麼Java垃圾收集將解除分配的存儲器,當它運行(其幾乎從未公知的。)將對象指向空引用並更新內存,或僅分配一次內存效率更高?

因此,是它更有效地指向一個目的是在方法中使用它時是否爲空引用,還是將一個分配作爲類變量更好?

例如,是它更好地做到這一點:

private TestFile TestFile = new TestFile(); 
public class Configuration{ 

//Methods accesing 'TestFile' 
    } 
} 

public class Configuration{ 

public void getFileName(){ 
TestFile TestFile = new TestFile(); 
TestFile.getName(); 
TestFile = null; 
} 

public void setFileName(String name){ 
TestFile TestFile = new TestFile(); 
TestFile.setName(name); 
TestFile = null; 
} 
    } 
} 

我不知道,對於第二個例子,你必須重申構造函數中的每個方法,但我的推理是,如果構造函數變量指向null並且被移除,則幾乎總是拋出NullPointerException的變化很大(再次,GC非常複雜,並且幾乎不可能預測)。

最後,從我的理解來看,我絕不會想要運行GC方法,因爲它可能會混淆GC已經設置的時間表,以及運行該方法需要更多的性能,而不是過早收集的資源。

感謝您的幫助!

回答

1

首先,您不應將變量設置爲null以「幫助垃圾回收器」。現代編譯器和JVM足夠智能,可以在沒有明確設置的情況下檢測到局部變量未被使用,因此分配所做的唯一工作就是使程序不易讀。

就內存分配而言,如果您可以避免不必要的分配而不會使代碼更復雜,那就去做吧。否則,請不要過早地優化您的分配 - 有可能,它們不會成爲關鍵路徑,在這種情況下,您根本無需優化它們。

0

"If an object points to a null reference in memory" - 這是沒有意義的。一個物體指向沒有什麼。 A 變量做了指點,如果它指的是null,那麼GC就沒有什麼了。你似乎將變量與對象混淆,而你的第二個例子沒什麼意義。

要遵循的一般規則包括 - 在最有限的必要範圍內創建對象。這樣,當變量超出範圍時,如果該對象沒有被任何其他變量引用,則必要時應該GC'd。

0

這兩個類不會做同樣的事情。

第一個是你所期望的。

第二個,在每次調用setFileNamegetFileName時間,創建一個新的TESTFILE,用空白/空/默認的文件名。它確實而不是記住設置的最後一個文件名。

new TestFile()TestFile.createNewTestFile()類似(如果該方法存在) - 每次運行時,都會創建一個新的TestFile。 意思是在調用它一次和使用相同的TestFile之間存在巨大差異,每當你想用TestFile做某件事時調用它。