當前位置:首頁 » 操作系統 » jvm復制演算法

jvm復制演算法

發布時間: 2022-08-30 23:43:49

⑴ 哪些jvm的垃圾回收方式採用復制演算法回收

java垃圾回收是由虛擬機控制的,不是由你的代碼控制的,你可以System.gc()來提醒系統進行垃圾回收,但至於會不會回收取決於JVM,而不是你的這行代碼

⑵ JVM有哪些垃圾回收演算法

標記-清除,標記-復制,標記-整理

⑶ jvm垃圾收集器為什麼

JVM中垃圾的回收由垃圾收集器進行,隨著JDK的不斷升級,垃圾收集器也開發出了各種版本,垃圾收集器不斷優化的動力,就是為了實現更短的停頓。

下面是7種不同的分代收集器,如果兩個收集器之間有連線,則表示它們之間可以搭配使用;所處的區域表示屬於新生代還是老年代收集器。

1.Serial 收集器 (新生代)

最基本、歷史最悠久(JDK1.3.1之前),這是一個單線程的收集器,當該收集器運行時必須暫停其他所有的工作線程,直到它收集結束。

收集過程:暫停所有線程

演算法:復制演算法

優點:簡單高效,擁有很高的單線程收集效率

應用:Client模式下的默認新生代收集器

2.ParNew 收集器(新生代)

Serial 的多線程版本,使用多線程進行垃圾收集

收集過程:與用戶線程並發

演算法:復制演算法

優點:在CPU多的情況下,擁有比Serial更好的效果。單CPU環境下Serial效果更好

應用:許多運行在Server模式下的虛擬機中首選的新生代收集器

3.Parallel Scavenge 收集器(新生代)

Parallel Scavenge收集器的目標是達到一個可控制的吞吐量

吞吐量 = 運行用戶代碼時間 / (運行用戶代碼時間 + 垃圾收集時間)

控制吞吐量的參數:最大垃圾收集停頓時間 -XX:MaxGCPauseMillis ; 直接設置吞吐量大小:-XX:GCTimeRatio。

MaxGCPauseMillis 的值為一個大於0的毫秒數, 最大停頓時間的縮短是以犧牲吞吐量和新生代空間來換取的。

GCTimeRatio 的值為一個大於0且小於100的整數。例如:-XX:GCTimeRatio=9 我們要求應用程序線程在整個執行時間中至少9/10是活動的(因此,GC線程佔用其餘1/10)

-XX:+UseAdaptiveSizePolicy:開啟GC自適應調節策略,自動設置新生代大小、Eden與Survior區的比例、晉升老年代對象年齡等細節參數

應用:適合在後台運算而不需要太多交互的任務

4.Serial Old 收集器 (老年代)

Serial收集器的老年代版本,也是一個單線程的收集器,使用標記-整理演算法

收集過程:暫停所有線程

演算法:標記-整理演算法

應用:主要意義是Client模式下的收集器,如果在Server模式下還有:a. JDK1.5之前的版本中與Parallel Scavenge搭配使用,b. 作為CMS收集器的後背預案在並發收集時使用

5. Parallel Old 收集器 (老年代)

Parallel Scavenge收集器的老年代版本,使用多線程和「標記-整理」演算法。

收集過程:多線程

演算法:標記-整理演算法

應用:在注重吞吐量及CPU資源敏感的場合,可以優先考慮Parallel Scavenge加Parallel Old收集器

6. CMS 收集器(老年代)

以獲取最短回收停頓時間為目標,基於「標記-清除」演算法

收集過程:初始標記-->並發標記-->重新標記-->並發清除

初始標記、重新標記兩個步驟仍需要「Stop The World」 : 初始標記僅僅只是標記一下GC
Roots能直接關聯到的對象,速度很快;並發標記就是進行GC Roots
Tracing的過程;重新標記是為了修正並發標記期間因用戶程序繼續運作,而導致標記產生變動的那一部分對象的標記記錄。

整個過程中耗時最長的是並發標記和並發清除,這兩個過程都可以與用戶線程一起工作。所以總體上說CMS收集器內存回收過程與用戶線程一起並發執行。

演算法:標記-清除 演算法

缺點:1,對cpu資源敏感,默認啟動的回收線程數是(cpu數量+3)/4,當cpu數較少的時候,會分掉大部分的cpu去執行收集器線程,影響用戶,降低吞吐量。

2,無法處理浮動垃圾,浮動垃圾即在並發清除階段因為是並發執行,還會產生垃圾,這一部分垃圾即為浮動垃圾,要等下次收集。

3,因為使用的是「標記-清除」演算法,會產生碎片。

7. G1收集器 (整個Java堆:包括新生代和老年代)

特點:並行與並發、分代收集、空間整合、可預測的停頓

G1將整個java堆(包括新生代和老生代)劃分為多個大小固定的獨立區域,並跟蹤這些區域的垃圾堆積程度,在後台維護一個優先列表,每次根據允許的收集時間,優先回收垃圾最多的區域。

但這樣回收有一個問題:對象分配在某個區域中,但並非只被本區域的其他對象引用,而是可以與整個Java堆任意的對象發生引用關系。在做可達性分析的時候,如何避免掃描整個堆呢?

解決:區域之間的對象引用,以及其他收集器中新生代與老年代之間的對象引用,虛擬機都是使用Remembered Set來避免全堆掃描,在Remembered Set中記錄對象的引用。

收集過程:初始標記-->並發標記-->最終標記-->篩選回收。與CMS不同的是,在最終標記階段,需要停頓線程,但是可並發執行;篩選回收階段,對各個區域的回收價值和成本進行排序,按照用戶所期望的回收時間進行垃圾回收,這個階段也可以並發執行。

⑷ 哪些jvm垃圾回收方式採用復制演算法回收

Java的堆是一個運行時數據區,類的實例(對象)從中分配空間。Java虛擬機(JVM)的堆中儲存著正在運行的應用程序所建立的所有對象,這些對象通過new、newarray、anewarray和multianewarray等指令建立,但是它們不需要程序代碼來顯式地釋放。一般來說

⑸ 以下哪些jvm的垃圾回收方式採用的是復制演算法回收

Java的堆是一個運行時數據區,類的實例(對象)從中分配空間。Java虛擬機(JVM)的堆中儲存著正在運行的應用程序所建立的所有對象,這些對象通過new、newarray、anewarray和multianewarray等指令建立,但是它們不需要程序代碼來顯式地釋放。

⑹ 哪些jvm的垃圾回收方式採用復制演算法

1.JVM的gc概述 gc即垃圾收集機制是指jvm用於釋放那些不再使用的對象所佔用的內存。java語言並不要求jvm有gc,也沒有規定gc如何工作。不過常用的jvm都有gc,而且大多數gc都使用類似的演算法管理內存和執行收集操作。 在充分理解了垃圾收集演算法和執

⑺ 我的jvm 新生代中 Survivor 0 為啥沒有空間,只顯示Survivor 0 (8,8):0

這顯示的是已用空間吧?
一次Minor GC過後,通過復制演算法,存活的對象年齡+1然後被丟到Survivor 1之中,佔1.150M,Survivor 0中的對象被全部回收。下一次Minor GC的時候又反過來,會將Eden和Survivor 1存活的對象通過復制演算法丟到Survivor 0之中,此時Survivor 1將被清空。
也就是說,新生代中,Survivor 0和Survivor 1其中一個必會為空。

⑻ java有哪些垃圾回收演算法

常用的垃圾回收演算法有:
(1).引用計數演算法:
給對象中添加一個引用計數器,每當有一個地方引用它時,計數器值就加1;當引用失效時,計數器值就減1;任何時刻計數器都為0的對象就是不再被使用的,垃圾收集器將回收該對象使用的內存。
引用計數演算法實現簡單,效率很高,微軟的COM技術、ActionScript、Python等都使用了引用計數演算法進行內存管理,但是引用計數演算法對於對象之間相互循環引用問題難以解決,因此java並沒有使用引用計數演算法。
(2).根搜索演算法:
通過一系列的名為「GC Root」的對象作為起點,從這些節點向下搜索,搜索所走過的路徑稱為引用鏈(Reference Chain),當一個對象到GC Root沒有任何引用鏈相連時,則該對象不可達,該對象是不可使用的,垃圾收集器將回收其所佔的內存。
主流的商用程序語言C#、java和Lisp都使用根搜素演算法進行內存管理。
在java語言中,可作為GC Root的對象包括以下幾種對象:
a. java虛擬機棧(棧幀中的本地變數表)中的引用的對象。
b.方法區中的類靜態屬性引用的對象。
c.方法區中的常量引用的對象。
d.本地方法棧中JNI本地方法的引用對象。
java方法區在Sun HotSpot虛擬機中被稱為永久代,很多人認為該部分的內存是不用回收的,java虛擬機規范也沒有對該部分內存的垃圾收集做規定,但是方法區中的廢棄常量和無用的類還是需要回收以保證永久代不會發生內存溢出。
判斷廢棄常量的方法:如果常量池中的某個常量沒有被任何引用所引用,則該常量是廢棄常量。
判斷無用的類:
(1).該類的所有實例都已經被回收,即java堆中不存在該類的實例對象。
(2).載入該類的類載入器已經被回收。
(3).該類所對應的java.lang.Class對象沒有任何地方被引用,無法在任何地方通過反射機制訪問該類的方法。
Java中常用的垃圾收集演算法:
(1).標記-清除演算法:
最基礎的垃圾收集演算法,演算法分為「標記」和「清除」兩個階段:首先標記出所有需要回收的對象,在標記完成之後統一回收掉所有被標記的對象。
標記-清除演算法的缺點有兩個:首先,效率問題,標記和清除效率都不高。其次,標記清除之後會產生大量的不連續的內存碎片,空間碎片太多會導致當程序需要為較大對象分配內存時無法找到足夠的連續內存而不得不提前觸發另一次垃圾收集動作。
(2).復制演算法:
將可用內存按容量分成大小相等的兩塊,每次只使用其中一塊,當這塊內存使用完了,就將還存活的對象復制到另一塊內存上去,然後把使用過的內存空間一次清理掉。這樣使得每次都是對其中一塊內存進行回收,內存分配時不用考慮內存碎片等復雜情況,只需要移動堆頂指針,按順序分配內存即可,實現簡單,運行高效。
復制演算法的缺點顯而易見,可使用的內存降為原來一半。
(3).標記-整理演算法:
標記-整理演算法在標記-清除演算法基礎上做了改進,標記階段是相同的標記出所有需要回收的對象,在標記完成之後不是直接對可回收對象進行清理,而是讓所有存活的對象都向一端移動,在移動過程中清理掉可回收的對象,這個過程叫做整理。
標記-整理演算法相比標記-清除演算法的優點是內存被整理以後不會產生大量不連續內存碎片問題。
復制演算法在對象存活率高的情況下就要執行較多的復制操作,效率將會變低,而在對象存活率高的情況下使用標記-整理演算法效率會大大提高。
(4).分代收集演算法:
根據內存中對象的存活周期不同,將內存劃分為幾塊,java的虛擬機中一般把內存劃分為新生代和年老代,當新創建對象時一般在新生代中分配內存空間,當新生代垃圾收集器回收幾次之後仍然存活的對象會被移動到年老代內存中,當大對象在新生代中無法找到足夠的連續內存時也直接在年老代中創建。

⑼ 以下哪些jvm的垃圾回收方式採用的是復制演算法

System.gc是專門回收不用的對象的語法,當然你也可以自己寫函數來finalization()你的程序。一般JVM會根據虛擬內存佔用率來自動調用gc(garbage collector),有時候即便你調用gc如果內存佔用不多回收處理工作也不會調用的,畢竟調用一次也要佔用資

⑽ JVM的垃圾演算法有哪幾種

一、垃圾收集器概述

如上圖所示,垃圾回收演算法一共有7個,3個屬於年輕代、三個屬於年老代,G1屬於橫跨年輕代和年老代的演算法。

JVM會從年輕代和年老代各選出一個演算法進行組合,連線表示哪些演算法可以組合使用

二、各個垃圾收集器說明

1、Serial(年輕代)

  • 年輕代收集器,可以和Serial Old、CMS組合使用

  • 採用復制演算法

  • 使用單線程進行垃圾回收,回收時會導致Stop The World,用戶進程停止

  • client模式年輕代默認演算法

  • GC日誌關鍵字:DefNew(Default New Generation)

  • 圖示(Serial+Serial Old)

    7、G1

  • G1收集器由於沒有使用過,所以從網上找了一些教程供大家了解

  • 並行與並發

  • 分代收集

  • 空間整合

  • 可預測的停頓

熱點內容
探岳什麼配置才有駕駛模式選擇 發布:2025-05-14 23:53:17 瀏覽:143
如何在手機上看無限流量密碼 發布:2025-05-14 23:43:31 瀏覽:114
19投籃腳本 發布:2025-05-14 23:36:57 瀏覽:513
編譯器怎麼處理c變長數組 發布:2025-05-14 23:31:46 瀏覽:663
存摺每天可以輸錯多少次密碼 發布:2025-05-14 23:22:06 瀏覽:909
安卓手機怎麼找微信隱藏對話 發布:2025-05-14 23:07:47 瀏覽:338
怎麼查看泰拉伺服器ip 發布:2025-05-14 23:03:29 瀏覽:74
c語言學生成績查詢系統 發布:2025-05-14 22:58:30 瀏覽:6
怎麼進別人的伺服器 發布:2025-05-14 22:45:55 瀏覽:774
用編程寫音樂 發布:2025-05-14 22:45:08 瀏覽:783