system.gc会立即执行垃圾回收吗_JVM基础到实战03-垃圾回收概念
1.為什么要進行垃圾回收?
不回收會造成內存泄漏
2.什么時候執行回收?
達到一定的比例,或者申請的內存超出了空閑內存,觸發回收
3.如果是你,如何設計垃圾回收算法?就是回收哪些類型的對象
回收棧中沒有指針指向對象,斷開連接的對象
4.如何判定對象存活呢?
--引用計數法:
堆中的每個對象實例都有一個引用計數器,每當一個對象被創建時,且將該對象分配給一個變量,該變量數設置為1,當任何變量被賦值為這個對象的引用時,計數+1(此處也可以看出,對象的賦值是引用的傳遞),但當一個對象實例的引用超過了生命周期(比如程序執行完,出棧),或者被設為一個新值時,該實例的引用計數-1,引用為0時,成為等待回收狀態,并不會立即被回收,而是觸發回收條件后執行回收。
優點:引用計數通過引用加減1,為0時,等待回收,簡單!
缺點:無法檢測循環引用,A對象的屬性引用B對象,B對象的屬性引用了A對象,他們的引用計數器永遠不可能為0
?
引用計數算法示意圖
構造一個循環引用場景,測試使用何種對象存活分析算法(如果被GC,說明使用的非引用計數算法):
配置啟動參數,-verbose:gc -XX:+PrintGCDetails
運行程序,查看GC結果
?
運行結果
占用和回收的內存都變大
?
運行結果
說明:循環引用的場景,依然發生了GC,而我們使用的是JDK1.8
說明1.8版本已經不再使用引用計數器方式
可達性分析
概念:又稱為根搜索算法
根搜索算法是從離散數學中的圖論引入的,從根節點(GCROOT)開始搜索,尋找引用的節點,找到引用節點后,繼續尋找這個引用節點的引用節點,當所有的引用節點尋找完成后,剩余的節點則被認為是沒有被引用的節點,即是無用的節點。
Java中可以作為GCROOT的對象有:
虛擬機棧中引用的對象,本地變量表
本地方法棧中引用的對象
方法區中靜態屬性引用的對象
方法區中常量引用的對象
??
??
??
總結
以上是生活随笔為你收集整理的system.gc会立即执行垃圾回收吗_JVM基础到实战03-垃圾回收概念的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET 2.0服务器控件与组件开
- 下一篇: 偶作无题词一首