jvm系列java
有些狀況下,object = null是能夠輔助GC的。好比:
public static void reuseSlot2(){ MemoryLeakDemo.printMemoryInfo("before"); { byte[] data = new byte[6*1024*1024]; //或者經過set null,主動回收 //賦null值在JIT編譯以後會被消除掉,這個時候將變量設置爲null是沒有意義的 //實際上JIT編譯成本地代碼後,gc能夠正常回收掉,無需多餘操做 data = null; } MemoryLeakDemo.printMemoryInfo("after assign 6M,before gc"); System.gc(); MemoryLeakDemo.printMemoryInfo("after gc"); }
賦null值在JIT編譯以後會被消除掉,這個時候將變量設置爲null是沒有意義的,實際上JIT編譯成本地代碼後,gc能夠正常回收掉,無需多餘操做。
另外,當方法結束後,脫離做用域以後,相應的局部變量引用會自動被註銷掉。
小結:當遇到局部代碼段中已經申請許多佔用空間的對象,這些對象在其做用域內的後續代碼中還須要執行相對較長的時間,而且這塊內存的確在後面就不會再使用了的時候,能夠手工將一些大對象的引用設置爲null,這樣一來,GC很快就會認爲它是垃圾。一般,在這種狀況下將對象的引用設置爲null纔會對JVM有好處。若是代碼跑的很快,對象能夠很快脫離做用域,在這樣的場景下將引用設置爲null是沒有必要的,那樣只會讓代碼很難看。