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