日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java教程分享:JVM垃圾回收机制之对象回收算法

發布時間:2024/9/30 java 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java教程分享:JVM垃圾回收机制之对象回收算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

在前面的文章中,介紹了JVM內存模型分為:堆區、虛擬機棧、方法區、本地方法區和程序計數器,其中堆區是JVM中最大的一塊內存區域,在Java中的所有對象實例都保存在此區域,它能被所有線程共享。

在Java中還有一個重要的機制:GC(垃圾收集器),堆是GC管理的主要區域,本文會帶大家了解GC機制。

GC的簡介

GC(Garbage Collection)垃圾收集機制是Java一個重要特性。不同于C/C++語言需要程序員自己管理內存的回收,而且這樣做往往容易出錯,導致內存泄漏等嚴重問題。

Java程序員不用編寫回收內存的代碼,因為Java有GC機制,它是一個特殊的后臺線程,該線程對JVM中的內存進行標記,并確定哪些需要回收,再通過一定的回收策略自動回收內存,它在后臺一直運行,保證JVM不會出現內存溢出的問題。

對象回收的算法

那么GC是如何判斷某個對象的內存需要回收呢?GC需要判斷該對象已死,也就是不再被調用,如何判斷對象不再被調用呢?

這里有兩種算法:

1、引用計數算法

2、可達性分析算法

引用計數算法

該算法給每個對象分配一個計數器,當有引用指向這個對象時,計數器加1,當指向該對象的引用失效時,計數器減一。最后如果該對象的計數器為0時,java垃圾回收器會認為該對象是可回收的。

優點:

1、實時性高,只要對象計數器為0就進行回收,不用等到內存不足的時候。

2、在垃圾回收過程中,應用無需掛起。

3、更新對象的計數器時,只是影響到該對象,不會掃描全部對象。

缺點:

1、每次引用對象時,都會更新計數器,有時間消耗

2、不能解決循環引用問題

那什么是循環引用問題呢?我們看下面這段代碼:

上面的a、b兩個對象雖然都賦值為null,但是都不能回收,因為存在循環引用,它們的計數器不為0.

可達性分析算法

該算法通過一種被稱作“GC Root”的對象作為起始點,從這些節點開始向下搜索,搜索所走過的路徑稱為引用鏈,當一個對象到GC Roots沒有任何引用鏈相連時,則證明此對象時不可用的。

如下圖:

在Java語言中,可作為GC Roots對象包括下面幾種:

1)虛擬機棧中引用的對象

2)方法區中類靜態屬性引用的對象

3)方法區常量池中引用的對象

4)本地方法棧中JNI引用的對象

再回頭看前面這段代碼,雖然a和b對象的引用計數都不為0,但是它們作為GC Root對象,最后都賦值為null,導致引用不可達,這樣兩個對象都是可以被回收的。

總結

本文小千帶我們學習了JVM中的垃圾收集(GC)機制,GC是一個在后臺持續運行的線程,幫助我們回收JVM堆中的對象內存,保證JVM不會內存溢出。

如何判斷對象內存需要回收,有兩個算法:引用計數算法和可達性分析算法。

引用計數算法通過判斷對象的引用計數為0,就標記該對象內存可以回收,但是不能很好的解決循環引用問題;可達性分析算法通過GC Root向下搜索,如果引用鏈相連則對象可達,否則標記對象不可達,可以進行回收,這種算法能很好解決對象循環引用問題。

本文來自千鋒教育,轉載請注明出處。

總結

以上是生活随笔為你收集整理的Java教程分享:JVM垃圾回收机制之对象回收算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。