java中gc是怎么工作的_java中的GC(gabage collection)如何工作
1.
“引用記數(reference counting)”是一種簡單但速度很慢的垃圾回收技術。每個對象都含有一個引用記數器,當有引用連接至對象時,引用計數加1。當引用離開作用域或被置 為null時,引用計數減1。雖然管理引用記數的開銷不大,但需要在整個程序生命周期中持續地開銷。垃圾回收器會在含有全部對象的列表上遍歷,當發現某個 對象的引用計數為0時,就釋放其占用的空間。這種方法有個缺陷,如果對象之間存在循環引用,可能會出現“對象應該被回收,但引用計數卻不為零”的情況。對 垃圾回收器而言,定位這樣存在交互引用的對象組所需的工作量極大。引用記數常用來說明垃圾收集的工作方式,似乎從未被應用于任何一種Java虛擬機實現 中。
2.
Java虛擬機將采用一種“自適應”的垃圾回收技術。至于如何處理找到的存活對象,取決于不同的Java虛擬機實現。有一種作法名為“停止——復制” (stop-and-copy)。這意味著,先暫停程序的運行,(所以它不屬于后臺回收模式),然后將所有存活的對象從當前堆復制到另一個堆,沒有被復制 的全部都是垃圾。當對象被復制到新堆時,它們是一個挨著一個的,所以新堆保持緊湊排列,然后就可以按前述方法簡單、直接地分配新空間了。
3.
Java虛擬機中有許多附加技術用以提升速度。尤其是與加載器操作有關的,被稱為“即時”(Just-In-Time,JIT)編譯的技術。這種技術可以 把程序全部或部分翻譯成本地機器碼(這本來是Java虛擬機的工作),程序運行速度因此得以提升。當需要裝載某個類(通常是在你為該類創建第一個對象) 時,編譯器會先找到其 .class 文件,然后將該類的字節碼裝入內存。此時,有兩種方案可供選擇。一種是就讓即時編譯器編譯所有代碼。但這種做法有兩個缺陷:這種加載動作散落在整個程序生 命周期內,累加起來要花更多時間;并且會增加可執行代碼的長度(字節碼要比即時編譯器展開后的本地機器碼小很多),這將導致頁面調度,從而降低程序速度。 另一種做法稱為“惰性編譯(lazy uation)”,意思是即時編譯器只在必要的時候才編譯代碼。這樣,從不會被執行的代碼也許就壓根不會被JIT所編譯。新版JDK中的Java HotSpot技術就采用了類似方法,代碼每次被執行的時候都會做一些優化,所以執行的次數越多,它的速度就越快。
注釋:
1.垃圾對象可能不被垃圾回收;
2.垃圾回收并不等于“析構”(區分與c++)
總結
以上是生活随笔為你收集整理的java中gc是怎么工作的_java中的GC(gabage collection)如何工作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百分点科技发布数据科学基础平台 陈松蹊院
- 下一篇: 华为音乐宣布与北京环球音像达成精品音乐合