java虛擬機-JVM垃圾回收機制和命令參數(3)

java虛擬機-JVM垃圾回收機制和命令參數(3)

今天說點java裡關注度比較高的垃圾回收機制,這個是java和C語言的圍城,java有自動垃圾回收機制,但是一旦使用不恰當,就會導致內存溢出OOM等垃圾回收問題,但是C語言可以自己處理垃圾回收,卻顯得相對繁瑣麻煩。“城“裡的人想出來,“城”外的人想進去。

知識乾貨來了!趕緊get起來~

垃圾回收算法

複製算法:將內存分為大小相等的兩塊,每次只使用其中的一塊,當這一塊用完後,將存活的對象複製到另一快上,再把已使用過的那塊內存直接清理。沒有碎片,常用於新生代的垃圾收集

java虛擬機-JVM垃圾回收機制和命令參數(3)

標記清除算法:先標記出需要回收的對象,標記完成後統一回收被標記的對象。 效率不高,會產生大量不連續的碎片

java虛擬機-JVM垃圾回收機制和命令參數(3)

標記整理算法:先標記出需要回收的對象,標記完成後讓所有存活的對象都向一端移動,然後清理存活對象邊界以外的內存

java虛擬機-JVM垃圾回收機制和命令參數(3)

分代收集算法:分為新生代(對象存活週期短)、老年代(存活週期長)

java虛擬機-JVM垃圾回收機制和命令參數(3)

1、絕大部分新生成的對象都放在Eden區,當Eden區將滿,JVM會因申請不到內存,而觸發Young GC ,進行Eden區+有對象的Survivor區(設為S0區)垃圾回收,把存活的對象用複製算法拷貝到一個空的Survivor(S1)中,此時Eden區被清空,另外一個Survivor S0也為空。下次觸發Young GC回收Eden+S0,將存活對象拷貝到S1中。新生代垃圾回收簡單、粗暴、高效

2、若發現Survivor區滿了,則將這些對象拷貝到old區或者Survivor沒滿但某些對象足夠Old,也拷貝到Old區(每次Young GC都會使Survivor區存活對象值+1,直到閾值)。

3.Old區也會進行垃圾收集(Young GC),發生一次 Major GC 至少伴隨一次Young GC,一般比Young GC慢十倍以上。JVM在Old區申請不到內存,會進行Full GC。Old區使用一般採用Concurrent-Mark–Sweep(CMS收集器)策略回收內存。

垃圾收集器

java虛擬機-JVM垃圾回收機制和命令參數(3)

Serial New收集器:是針對新生代的收集器,採用的是複製算法

Serial Old(串行)收集器:新生代採用複製,老年代採用標記清理

Parallel New(並行)收集器:新生代採用複製算法,老年代採用標記整理

Parallel Old(並行)收集器:針對老年代,標記整理

Parallel Scavenge(並行)收集器:針對新生代,採用複製收集算法

CMS收集:基於標記清理

G1收集器:整體上是基於標記清理,局部採用複製。G1收集器是一款面向服務端應用的垃圾收集器

特點: 並行與併發、分代收集、空間整合(整體上來看是基於標記整理算法實現,局部上來看是基於複製算法實現,不會產生內存空間碎片)、可預測的停頓

怎樣判斷對象是否存活:

引用計數算法:對象中添加一個引用計數器,每當有一個地方引用計數器就增加1,引用失效就減少1,計數器為0就不可用;缺點就在於無法處理對象直接相互引用的問題,因為相互引用以後無法使計數器為0,所以無法回收。

可達性分析算法:也就是我們常說的GC Root,,當一個對象沒有與任何引用鏈相連的時候,就可以對該對象進行回收。

java虛擬機-JVM垃圾回收機制和命令參數(3)

在Java語言裡,可作為GC Roots對象的包括如下幾種:

a.虛擬機棧(棧楨中的本地變量表)中的引用的對象

b.方法區中的類靜態屬性引用的對象

c.方法區中的常量引用的對象

d.本地方法棧中JNI的引用的對象

上面說到引用,引用的概念是:如果reference 類型的數據中存儲的數據代表另外一塊內存的起始地址,就稱這塊內存代表著一個引用。在java中包括以下幾種引用類型:

a.強引用 Object obj = new Object obj();只要存在強引用:GC永遠不會回收被引用

b.軟引用 這裡面的是一些可能還有用的對象,當系統快要溢出了才回收他們

c.弱引用 只要進行GC,他就會被回收

d.虛引用 一個對象有沒有虛引用對它本身不構成影響

JVM命令參數

(1)-Xms20M

表示設置堆容量的最小值為20M,必須以M為單位

(2)-Xmx20M

表示設置堆容量的最大值為20M,必須以M為單位。

將-Xmx和-Xms設置為一樣可以避免堆自動擴展。大的項目-Xmx和-Xms一般都要設置到10G、20G甚至還要高

(3)-Xmn20M

表示設置年輕代的大小為20M

(4)-XX:PermSize=10M

表示JVM初始分配的永久代的容量,必須以M為單位

(5)-XX:MaxPermSize=10M

表示JVM允許分配的永久代的最大容量,必須以M為單位,大部分情況下這個參數默認為64M


分享到:


相關文章: