finalize方法作用
生活随笔
收集整理的這篇文章主要介紹了
finalize方法作用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
垃圾回收機制的一個算法,算法分析理解起來比較抽象,再講一下新生代和老年代,垃圾回收機制的一個策略,垃圾回收機制是干嘛用的,1. 什么是垃圾回收機制?相當于JVM不定時的去回收不可達的對象,他這個完全是自動的,有沒有人學過C語言的,C語言需自己去釋放內存的,JAVA就不一樣,你不用去管理內存,我后臺會幫你自動去回收,垃圾回收機制是JAVA非常核心的一個知識,因為他不需要自己去回收,是自動化的,回收的是不可達對象,gc方法主要是提示給GC進行回收,但是不會立即回收2. 什么是不可達對象?對象沒有被引用,或者對象沒有存活,不可達對象并不是馬上就回收掉的
package com.learn.test;/*** 演示一下垃圾回收機制* @author Leon.Sun**/
public class Test001 {/*** 什么是不可達對象* 沒有繼續被引用到了* 或者你自己直接置為空* 提示垃圾回收器回收* JVM不會立馬回收掉的* 有的地方吧可達叫做沒有存活* 這其實是一個意思* 表示沒有被繼續的使用* * @param args*/public static void main(String[] args) {/*** 我定義一個對象* new一下Object這個類* 是任何類的祖宗* new這個Object類的時候* 你看這個對象可不可達* 這個情況還是可達的* 除非GC他去回收的時候* 如果沒有被繼續引用的情況下* 可能就不可達了* * obj1是可達的* 因為他已經被別人給使用到了* 這就叫可達對象* 如果你把一個對象定義出來* 為什么是可達的呢* 雖然他沒有被使用掉* 因為JVM會做一些垃圾回收分析* 我判斷一下他到底可不可達* 可達的* 歸根結底判斷原則是什么呢* 具體要根據算法進行分析的* 這個剛開始可能是可達的* * 如果沒有置為null* 它是不會立馬進行回收的* 因為JVM底層需要算法進行分析* 分析的時候是需要過程的* 沒有立馬知道他是不可達對象* 通過層層算法得知之后* 我才知道obj1沒有繼續使用的情況下* 那么他才是不可達對象* 一定要在強制標示為null的情況下* obj1是不可達對象* */// Object obj1 = new Object();/*** 這里要new Test001* new完之后再運行一遍就可以了* finalize方法正好被Test001給重寫了* 垃圾回收機制在回收之前* 它會調用finalize方法的* 垃圾回收機制要開始執行我的方法啦................* 是不是開始進行回收了* 但是這個不代表一定會進行回收的* GC線程你們明白是什么意思沒有* GC線程是守護線程還是非守護線程* 它是和主線程綁在一起的* 如果他不是守護線程* 我主線程掛了你還在就沒什么用* GC線程是跟著主線程結束* 所以他是一個守護線程* 這個是最基本的* 在學JAVASE之前的時候* */Object obj1 = new Test001();/*** 一般我們可以把它置為空* 置為空可不可達* 如果你把object置為空的情況下* 那這個時候會怎么樣呢* 相當于這個對象不可達了* 記住這個就表示不可達了* 不可達對象* 提示JVM去回收的* 加這段代碼和不加這段代碼有什么區別* 比如我的GC進行回收的時候* 最開始通過計數法* 計數法什么意思呢* 會給這個對象做一個計數* 如果垃圾回收器每次回收的時候* 發現你這個對象即使被使用的情況下* 我就會給這個對象引用數加1* 如果加到15次之后* 他就會進入到老年代里面去的* 這個時候這個對象就很少被回收的* * * 我們把obj1置為空* 表示這個對象已經告訴給JVM了,* 是不可達對象了* */obj1 = null;/*** 把obj1引用給obj2* 那這個時候對象可不可達* * 你不能說他完全是不可達對象* */
// Object obj2 = obj1;/*** 我們把obj2置為null* 這就完全告訴我了*/
// obj2 = null;/*** 這個表示什么意思,* 提示給GC進行回收垃圾* 很多人把gc理解為立即回收* 不能夠立即的* 提示給JVM垃圾回收機制回收,但是不代表立即進行回收* 因為它不一定的* 他有空才會收* 因為它底層也是需要線程進行調度的* 只能說你調用這個代碼提示GC進行回收* * 通知GC去回收* 但是不代表立即去回收*/System.gc();}/*** 比如你們知道這個方法* finalize方法是object類里面的* */@Overrideprotected void finalize() throws Throwable {/*** 垃圾回收機制之前會進行執行的方法* 在學JAVASE的時候* finalize和finally的區別* 相當于垃圾回收機制之前* 在這邊有個誤區* 我們打印一段日志*/System.out.println("垃圾回收機制要開始執行我的方法啦................");}
}
?
總結
以上是生活随笔為你收集整理的finalize方法作用的全部內容,希望文章能夠幫你解決所遇到的問題。