最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

你真的知道Java中對象的銷毀嗎

 更新時間:2021年10月21日 11:44:22   作者:java李楊勇  
java自帶垃圾回收機制,會自動識別內(nèi)存中不再會被使用的對象并將其銷毀,釋放內(nèi)存,下面這篇文章主要介紹了Java中對象銷毀的相關(guān)資料,需要的朋友可以參考下

在日常的開發(fā)中、我們都知道,Java的內(nèi)存清理是通過垃圾回收器進(jìn)行的,那么其是如何將沒用的對象被被清理掉的呢?

Java 語言的內(nèi)存自動回收稱為垃圾回收(Garbage Collection)機制,簡稱 GC。垃圾回收機制是指 JVM 用于釋放那些不再使用的對象所占用的內(nèi)存。

Java對象在使用后需要清理。 對象清理是釋放該對象所占用的內(nèi)存。 在創(chuàng)建對象時,用戶必須使用new操作符為對象分配內(nèi)存。 清除對象后,系統(tǒng)會自動回收內(nèi)存,不需要用戶進(jìn)行額外的處理。 這也是Java語言的一個特性,它使程序員更容易管理內(nèi)存。

一般一個對象被當(dāng)作垃圾回收的情況主要如下兩種。

1)對象的引用超過其作用范圍。

{
    Object o = new Object();    // 對象o的作用范圍,超過這個范圍對象將被視為垃圾
}

2)對象被賦值為 null

{
    Object o = new Object();
    o = null;    // 對象被賦值為null將被視為垃圾
}

在 Java 的 Object 類中還提供了一個 protected 類型的 finalize() 方法,因此任何 Java 類都可以覆蓋這個方法,在這個方法中進(jìn)行釋放對象所占有的相關(guān)資源的操作。

那么問題又來了,finalize()是個什么鬼呀,既然會調(diào)用對象的這個方法就說明所有的類都會有這個方法(畢竟所有的類都會被回收嘛),自然而然我們就想到了java的根類 Object.進(jìn)去看看?

protected void finalize() throws Throwable { }

最后一行還真找到了,是一個實現(xiàn)為空的方法,既然是protected就說明具體的方法可以留給子類去實現(xiàn)之前我們說過只有當(dāng)對象不再被任何引用指向時候,該對象才會被回收。那么真的是這樣嗎?我們舉個栗子看看

public class User {
private int money;

public int getMoney() {
return money;

}

public void setMoney(int money) {
this.money = money;

}
public void cool(){
String str=new String();
}

@Override
protected void finalize() throws Throwable {
// TODO Auto-generated method stub

if(money>0){
System.out.println("error");

}else{
System.out.println("suceess");
}
super.finalize();

}

}

這里我們重寫finalize()方法,在銷毀前如果一個人的前還沒花光,打印這個人是失敗的,否則這個人是成功的。下面是我們在main()中的代碼

public class Test {
public static void main(String args[]){
User u1=new User(200);
new Object();
new User(100);

}

}

運行結(jié)果居然什么都沒有!運行結(jié)束之后不光有引用指向的u1,就連沒有任何引用指向的new User(100);居然都沒有被回收。這是怎么回事呢?

我們來看看Thinking In Java中是怎樣解釋的

java中的并非總是被垃圾回收,也就是說對象可能不被回收。一般程序只要不到瀕臨存儲空間用光,垃圾回收器一般都不會主動回收內(nèi)存,如果程序結(jié)束,并且垃圾回收器一直沒有釋放你創(chuàng)建的空間,則隨著程序的退出,資源則會被歸還給操作系統(tǒng)。所以上面的我們finalize()才一直沒有被調(diào)用

如果我們想看到效果,可以通過如下方法:

public class Test {
public static void main(String args[]){
User u1=new User(200);

new Object();

new User(100);

System.gc();

}

}

System.gc();會強制系統(tǒng)垃圾回收器工作,運行效果會出現(xiàn)error
說明new User(100);創(chuàng)建的對象被回收了。

注意:調(diào)用 System.gc() 或者 Runtime.gc() 方法也不能保證回收操作一定執(zhí)行,它只是提高了 Java 垃圾回收器盡快回收垃圾的可能性。 

知識補充:

在 Java 虛擬機的堆區(qū),每個對象都可能處于以下三種狀態(tài)之一。

1)可觸及狀態(tài):當(dāng)一個對象被創(chuàng)建后,只要程序中還有引用變量引用它,那么它就始終處于可觸及狀態(tài)。

2)可復(fù)活狀態(tài):當(dāng)程序不再有任何引用變量引用該對象時,該對象就進(jìn)入可復(fù)活狀態(tài)。在這個狀態(tài)下,垃圾回收器會準(zhǔn)備釋放它所占用的內(nèi)存,在釋放之前,會調(diào)用它及其他處于可復(fù)活狀態(tài)的對象的 finalize() 方法,這些 finalize() 方法有可能使該對象重新轉(zhuǎn)到可觸及狀態(tài)。

3)不可觸及狀態(tài):當(dāng) Java 虛擬機執(zhí)行完所有可復(fù)活對象的 finalize() 方法后,如果這些方法都沒有使該對象轉(zhuǎn)到可觸及狀態(tài),垃圾回收器才會真正回收它占用的內(nèi)存。

總結(jié)

到此這篇關(guān)于Java中對象銷毀的文章就介紹到這了,更多相關(guān)Java中對象的銷毀內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java Chaos Game噪聲游戲?qū)嵗a

    Java Chaos Game噪聲游戲?qū)嵗a

    這篇文章主要介紹了Java Chaos Game噪聲游戲?qū)嵗a,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • Spring AOP結(jié)合注解實現(xiàn)接口層操作日志記錄

    Spring AOP結(jié)合注解實現(xiàn)接口層操作日志記錄

    在項目開發(fā)中我們需要記錄接口的操作日志:包含請求參數(shù)、響應(yīng)參數(shù)、接口所屬模塊、接口功能描述、請求地址、ip地址等信息;實現(xiàn)思路很簡單就是基于注解和aop的方式去記錄日志,主要的難點在于日志表結(jié)構(gòu)、注解的設(shè)計已經(jīng)aop實現(xiàn)的一些比較好的實現(xiàn)方式的借鑒
    2022-08-08
  • Java取整與四舍五入

    Java取整與四舍五入

    本文詳細(xì)講解了Java取整與四舍五入,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • 一文帶你搞懂Java單例模式

    一文帶你搞懂Java單例模式

    單例就是單實例的意思,即在系統(tǒng)全局,一個類只創(chuàng)建一個對象,并且在系統(tǒng)全局都可以訪問這個對象而不用重新創(chuàng)建。本文將通過示例為大家詳細(xì)講解Java單例模式的使用,需要的可以參考一下
    2022-11-11
  • Spring boot 數(shù)據(jù)庫連接斷線重連問題

    Spring boot 數(shù)據(jù)庫連接斷線重連問題

    這篇文章主要介紹了Spring boot 數(shù)據(jù)庫連接斷線重連問題,需要的朋友可以參考下
    2017-06-06
  • Java編程Socket實現(xiàn)多個客戶端連接同一個服務(wù)端代碼

    Java編程Socket實現(xiàn)多個客戶端連接同一個服務(wù)端代碼

    這篇文章主要介紹了Java編程Socket實現(xiàn)多個客戶端連接同一個服務(wù)端代碼,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Java設(shè)計模式之工廠模式分析【簡單工廠、工廠方法、抽象工廠】

    Java設(shè)計模式之工廠模式分析【簡單工廠、工廠方法、抽象工廠】

    這篇文章主要介紹了Java設(shè)計模式之工廠模式,結(jié)合實例形式分析了簡單工廠、工廠方法、抽象工廠等相關(guān)功能、實現(xiàn)與使用方法,需要的朋友可以參考下
    2018-04-04
  • Spring中的BeanFactory對象實例化工廠詳解

    Spring中的BeanFactory對象實例化工廠詳解

    這篇文章主要介紹了Spring中的BeanFactory對象實例化工廠詳解,BeanFactory及其子類是Spring IOC容器中最重要的一個類,BeanFactory由類名可以看出其是一個Bean工廠類,其實它確實是一個Bean工廠類,完成Bean的初始化操作,需要的朋友可以參考下
    2023-12-12
  • swing中Tree與滾動條用法實例分析

    swing中Tree與滾動條用法實例分析

    這篇文章主要介紹了swing中Tree與滾動條用法,以實例形式分析了java基于swing實現(xiàn)圖形界面的使用技巧,需要的朋友可以參考下
    2015-09-09
  • Java中利用Alibaba開源技術(shù)EasyExcel來操作Excel表的示例代碼

    Java中利用Alibaba開源技術(shù)EasyExcel來操作Excel表的示例代碼

    這篇文章主要介紹了Java中利用Alibaba開源技術(shù)EasyExcel來操作Excel表的示例代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03

最新評論

曲麻莱县| 佛冈县| 栾城县| 弋阳县| 内黄县| 和硕县| 达州市| 彭州市| 大港区| 惠来县| 盐津县| 武城县| 永嘉县| 泗水县| 莒南县| 汝州市| 逊克县| 江达县| 额济纳旗| 延寿县| 西畴县| 永济市| 永宁县| 金堂县| 黄浦区| 清徐县| 特克斯县| 寿光市| 来宾市| 阳朔县| 龙陵县| 永德县| 松阳县| 新乡市| 比如县| 什邡市| 临洮县| 甘孜| 来凤县| 古交市| 揭西县|