前言
在說JVM垃圾回收之前,你必須要瞭解一些知識,棧區和堆區的區別
棧區——由編譯器自動分配和釋放,一般存放函數的參數值、局部變量(值變量和引用變量)等。
這裏需要注意 引用變量就是 用 new關鍵字 創建的對象,數組等,在棧區裏只會存對象的引用(也叫地址,或指針),實際對象會在堆區中創建一個相對大小的存儲空間;堆區——由程序員分配及釋放,若程序員不釋放,程序結束後可能由OS回收
看到這裏你應該知道JVM垃圾回收的是什麼東西了吧? 對 ,那就是堆區裏需要回收的對象
哪些對象需要被回收
答: 在程序裏已經沒有引用的 引用對象(對象,或數組)
這些對象怎麼產生的?
例如:
String str = new String("JAVA探究");
str = new String("JAVE學習");
//最後 str 指向 JAVE學習
//那麼之前的 new String("JAVA探究") 就會在堆內存中變成垃圾。
看下圖
怎樣讓JVM進行垃圾回收
1、 什麼情況下JVM纔會進行垃圾回收?
答:JVM並不會主動 進行垃圾回收,只有在內存不夠的時候纔會進行。
2、回收時調用哪個方法?
object 的 finalize 方法
3、怎麼才能讓JVM主動 進行垃圾回收?
只需兩步,在程序需要的地方寫上兩句話。
//1、通知jvm 準備進行垃圾回收
System.gc();
//Runtime.getRuntime().gc();這個和System.gc()作用完全一樣
//2、立刻執行垃圾回收
Runtime.getRuntime().runFinalization();
//作用一樣System.runFinalization();