首頁 Java java教程 JVM内存管理------GC简介

JVM内存管理------GC简介

Dec 28, 2016 pm 03:31 PM
JVM内存管理

為何要了解GC策略與原理?

原因在上一章其實已經有所觸及,就是因為在平時的工作和研究當中,不可避免的會遇到內存溢出與內存洩漏的問題。如果對GC策略與原則不了解的情況下碰到了前面所說的問題,很多時候會讓人不知所措。
當我們了解了相關知識以後,雖然有時候依然不能很快的解決問題,但可以肯定的是,至少不會出現無計可施的情況。

GC策略解決了哪些問題?

既然是要進行自動GC,那必然會有相應的策略,而這些策略解決了哪些問題呢,粗略的來說,主要有以下幾點。
1、哪些物件可以被回收。
2、何時回收這些物件。
3、採用什麼樣的方式回收。

[b]GC策略採用的何種演算法[/b]

有關上面所提到的三個問題,其實最主要的一個問題就是第一個,也就是哪些物件才是可以回收的。
有比較簡單直覺的辦法,它的效率較高,被稱為引用計數演算法。但是這個演算法有一個致命的缺陷,那就是對於循環引用的物件無法進行回收。想像一下,假設JVM採用這種GC策略,那麼程式猿在寫的程式的時候,下面這樣的程式碼就不要指望再出現了。

public class Object {  
    Object field = null;  
      
    public static void main(String[] args) {  
        Thread thread = new Thread(new Runnable() {  
            public void run() {  
                Object objectA = new Object();  
                Object objectB = new Object();//1  
                objectA.field = objectB;  
                objectB.field = objectA;//               //to do something  
                objectA = null;  
                objectB = null;//3  
            }  
        });  
        thread.start();  
        while (true);  
    }  
      
}
登入後複製

這段程式碼看起來有點刻意為之,但其實在實際程式設計過程當中,是經常出現的,例如兩個一對一關係的資料庫對象,各自保持著對方的引用。最後一個無限循環只是為了保持JVM不退出,沒什麼實際意義。
對於我們現在使用的GC來說,當thread執行緒​​執行結束後,會將objectA和objectB全部當作待回收的物件。而如果我們的GC採用上面所說的引用計數演算法,則這兩個物件永遠不會被回收,即便我們在使用後顯示的將物件歸為空值也毫無作用。
這裡LZ大致解釋一下,在程式碼中LZ標註了1、2、3三個數字,當第1個地方的語句執行完以後,兩個物件的引用計數全部為1。當第2個地方的語句執行完以後,兩個物件的參考計數就全部變成了2。當第3個地方的語句執行完以後,也就是將二者全部歸為空值以後,二者的引用數仍然為1。根據引用計數演算法的回收規則,引用計數沒有歸0的時候是不會被回收的。

根搜尋演算法

由於引用計數演算法的缺陷,所以JVM一般會採用一種新的演算法,叫做根搜尋演算法。它的處理方式就是,設立若干種根對象,當任何一個根對像到某一個對象均不可達時,則認為這個對像是可以被回收的。

JVM内存管理------GC简介

就拿上圖來說,ObjectD和ObjectE是互相關聯的,但是由於GC roots到這兩個對像不可達,所以最終D和E還是會被當做GC的對象,上圖若是採用引用數法,則A-E五個物件都不會被回收。
說到GC roots(GC根),在JAVA語言中,可以當做GC roots的物件有以下幾種:
1、虛擬機器堆疊中的引用的物件。
2、方法區中的類別靜態屬性所引用的物件。
3、方法區中的常數所引用的物件。
4、本地方法堆疊中JNI的引用的物件。
第一和第四種都是指的方法的本地變數表,第二種表達的意思比較清晰,第三種主要指的是聲明為final的常數值。

垃圾收集演算法

根搜尋演算法解決的是垃圾蒐集的基本問題,也就是上面提到的第一個問題,也是最關鍵的問題,就是哪些物件可以被回收。
不過垃圾收集顯然還需要解決後兩個問題,什麼時候回收以及如何回收。在根搜尋演算法的基礎上,現代虛擬機器的實作當中,垃圾蒐集的演算法主要有三種,分別是標記-清除演算法、複製演算法、標記-整理演算法。這三種演算法都擴充了根搜尋演算法,不過它們理解起來還是非常好理解的。

結束語

 以上就是JVM記憶體管理------GC簡介的內容,更多相關內容請關注PHP中文網(www.php.cn)!


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
公司安全軟件導致應用無法運行?如何排查和解決? 公司安全軟件導致應用無法運行?如何排查和解決? Apr 19, 2025 pm 04:51 PM

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

如何將姓名轉換為數字以實現排序並保持群組中的一致性? 如何將姓名轉換為數字以實現排序並保持群組中的一致性? Apr 19, 2025 pm 11:30 PM

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

如何使用MapStruct簡化系統對接中的字段映射問題? 如何使用MapStruct簡化系統對接中的字段映射問題? Apr 19, 2025 pm 06:21 PM

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? Apr 19, 2025 pm 11:45 PM

在使用IntelliJIDEAUltimate版本啟動Spring...

如何優雅地獲取實體類變量名構建數據庫查詢條件? 如何優雅地獲取實體類變量名構建數據庫查詢條件? Apr 19, 2025 pm 11:42 PM

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

Java對像如何安全地轉換為數組? Java對像如何安全地轉換為數組? Apr 19, 2025 pm 11:33 PM

Java對象與數組的轉換:深入探討強制類型轉換的風險與正確方法很多Java初學者會遇到將一個對象轉換成數組的�...

電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? 電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? Apr 19, 2025 pm 11:27 PM

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...

如何利用Redis緩存方案高效實現產品排行榜列表的需求? 如何利用Redis緩存方案高效實現產品排行榜列表的需求? Apr 19, 2025 pm 11:36 PM

Redis緩存方案如何實現產品排行榜列表的需求?在開發過程中,我們常常需要處理排行榜的需求,例如展示一個�...

See all articles