一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 你真的知道Java中對象的銷毀嗎

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

2022-02-24 01:00java李楊勇 Java教程

java自帶垃圾回收機制,會自動識別內存中不再會被使用的對象并將其銷毀,釋放內存,下面這篇文章主要介紹了Java中對象銷毀的相關資料,需要的朋友可以參考下

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

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

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

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

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

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

2)對象被賦值為 null

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

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

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

?
1
protected void finalize() throws Throwable { }

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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()中的代碼

?
1
2
3
4
5
6
7
8
9
public class Test {
public static void main(String args[]){
User u1=new User(200);
new Object();
new User(100);
 
}
 
}

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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Test {
public static void main(String args[]){
User u1=new User(200);
 
new Object();
 
new User(100);
 
System.gc();
 
}
 
}

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

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

知識補充:

在 Java 虛擬機的堆區,每個對象都可能處于以下三種狀態之一。

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

2)可復活狀態:當程序不再有任何引用變量引用該對象時,該對象就進入可復活狀態。在這個狀態下,垃圾回收器會準備釋放它所占用的內存,在釋放之前,會調用它及其他處于可復活狀態的對象的 finalize() 方法,這些 finalize() 方法有可能使該對象重新轉到可觸及狀態。

3)不可觸及狀態:當 Java 虛擬機執行完所有可復活對象的 finalize() 方法后,如果這些方法都沒有使該對象轉到可觸及狀態,垃圾回收器才會真正回收它占用的內存。

總結

到此這篇關于Java中對象銷毀的文章就介紹到這了,更多相關Java中對象的銷毀內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://juejin.cn/post/7019111956422328351

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产在线精品观看 | 美女狂揉尿口揉到失禁 | 校园刺激全黄H全肉细节文 校草让我脱了内裤给全班看 | 日本免费v片一二三区 | 十大看黄网站 | 欧美视频网址 | 日韩性事| 好女孩韩剧免费观看 | 东北老女人91p0rny | 青柠影视在线播放观看高清 | 亚洲人成在线播放 | 涩涩屋在线观看 | futa百合高肉全h | 欧美四级无删版影片 | 91麻豆精品国产自产在线观看 | 美国女网址www呦女 美国复古性经典xxxxx | 互换娇妻爽文100系列小说 | 国产裸舞在线一区二区 | 高h短篇校园1v1 | 羞羞麻豆国产精品1区2区3区 | 色导行 | 精品国产综合 | 国产男技师 | 国产精品区一区二区免费 | 肥胖老寡妇做性 | 国产成人精品系列在线观看 | 公交车上插入 | 天天色踪合合 | 91看片淫黄大片.在线天堂 | 午夜一级免费视频 | 欧美在线一二三区 | 天堂素人在线 | 狠狠色狠狠色综合日日小蛇 | 亚洲精品视频久久 | 亚洲高清在线视频 | 亚洲精品乱码久久久久久蜜桃 | 国产haodiaose最新 | 国产成人手机在线好好热 | 色天天久久 | 1024毛片 | 日本老妇成熟 |