1. 程式人生 > >JVM GC機制

JVM GC機制

 記憶體管理和垃圾回收是JVM非常關鍵的點,對Java效能的剖析而言,瞭解記憶體管理和垃圾回收的基本策略非常重要。本篇對Sun JVM 6.0的記憶體管理和垃圾回收做大概的描述。

      1.記憶體管理
      在程式執行過程當中,會建立大量的物件,這些物件,大部分是短週期的物件,小部分是長週期的物件,對於短週期的物件,需要頻繁地進行垃圾回收以保證無用物件儘早被釋放掉,對於長週期物件,則不需要頻率垃圾回收以確保無謂地垃圾掃描檢測。為解決這種矛盾,Sun JVM的記憶體管理採用分代的策略。
      1)年輕代(Young Gen):年輕代主要存放新建立的物件,記憶體大小相對會比較小,垃圾回收會比較頻繁。年輕代分成1個Eden Space和2個Suvivor Space(命名為A和B)
當物件在堆建立時,將進入年輕代的Eden Space。
垃圾回收器進行垃圾回收時,掃描Eden Space和A Suvivor Space,如果物件仍然存活,則複製到B Suvivor Space,如果B Suvivor Space已經滿,則複製 Old Gen
掃描A Suvivor Space時,如果物件已經經過了幾次的掃描仍然存活,JVM認為其為一個Old物件,則將其移到Old Gen。
掃描完畢後,JVM將Eden Space和A Suvivor Space清空,然後交換A和B的角色(即下次垃圾回收時會掃描Eden Space和BSuvivor Space。

      我們可以看到:Young Gen垃圾回收時,採用將存活物件複製到到空的Suvivor Space的方式來確保不存在記憶體碎片,採用空間換時間的方式來加速記憶體垃圾回收。
      2)年老代(Tenured Gen):年老代主要存放JVM認為比較old的物件(經過幾次的Young Gen的垃圾回收後仍然存在),記憶體大小相對會比較大,垃圾回收也相對沒有那麼頻繁(譬如可能幾個小時一次)。年老代主要採用壓縮的方式來避免記憶體碎片(將存活物件移動到記憶體片的一邊),當然,有些垃圾回收器(譬如CMS垃圾回收器)出於效率的原因,可能會不進行壓縮。
      3)持久代(Perm Gen):持久代主要存放類定義、位元組碼和常量等很少會變更的資訊

1. Heap設定與垃圾回收Java Heap分為3個區,Young,Old和Permanent。Young儲存剛例項化的物件。當該區被填滿時,GC會將物件移到Old區。Permanent區則負責儲存反射物件,本文不討論該區。JVM的Heap分配可以使用-X引數設定,

-Xms初始Heap大小 -Xmxjava heap最大值 -Xmnyoung generation的heap大小

JVM有2個GC執行緒。第一個執行緒負責回收Heap的Young區。第二個執行緒在Heap不足時,遍歷Heap,將Young 區升級為Older區。Older區的大小等於-Xmx減去-Xmn,不能將-Xms的值設的過大,因為第二個執行緒被迫執行會降低JVM的效能。為什麼一些程式頻繁發生GC?有如下原因:l         程式內呼叫了System.gc()或Runtime.gc()。l         一些中介軟體軟體呼叫自己的GC方法,此時需要設定引數禁止這些GC。l         Java的Heap太小,一般預設的Heap值都很小。l         頻繁例項化物件,Release物件。此時儘量儲存並重用物件,例如使用StringBuffer()和String()。如果你發現每次GC後,Heap的剩餘空間會是總空間的50%,這表示你的Heap處於健康狀態。許多Server端的Java程式每次GC後最好能有65%的剩餘空間。經驗之談:1.Server端JVM最好將-Xms和-Xmx設為相同值。為了優化GC,最好讓-Xmn值約等於-Xmx的1/3[2]。2.一個GUI程式最好是每10到20秒間執行一次GC,每次在半秒之內完成[2]。 注意:1.增加Heap的大小雖然會降低GC的頻率,但也增加了每次GC的時間。並且GC執行時,所有的使用者執行緒將暫停,也就是GC期間,Java應用程式不做任何工作。2.Heap大小並不決定程序的記憶體使用量。程序的記憶體使用量要大於-Xmx定義的值,因為Java為其他任務分配記憶體,例如每個執行緒的Stack等。 2.Stack的設定每個執行緒都有他自己的Stack。

-Xss每個執行緒的Stack大小

Stack的大小限制著執行緒的數量。如果Stack過大就好導致記憶體溢漏。-Xss引數決定Stack大小,例如-Xss1024K。如果Stack太小,也會導致Stack溢漏。3.硬體環境硬體環境也影響GC的效率,例如機器的種類,記憶體,swap空間,和CPU的數量。如果你的程式需要頻繁建立很多transient物件,會導致JVM頻繁GC。這種情況你可以增加機器的記憶體,來減少Swap空間的使用[2]。4.4種GC第一種為單執行緒GC,也是預設的GC。,該GC適用於單CPU機器。第二種為Throughput GC,是多執行緒的GC,適用於多CPU,使用大量執行緒的程式。第二種GC與第一種GC相似,不同在於GC在收集Young區是多執行緒的,但在Old區和第一種一樣,仍然採用單執行緒。-XX:+UseParallelGC引數啟動該GC。第三種為Concurrent Low Pause GC,類似於第一種,適用於多CPU,並要求縮短因GC造成程式停滯的時間。這種GC可以在Old區的回收同時,執行應用程式。-XX:+UseConcMarkSweepGC引數啟動該GC。第四種為Incremental Low Pause GC,適用於要求縮短因GC造成程式停滯的時間。這種GC可以在Young區回收的同時,回收一部分Old區物件。-Xincgc引數啟動該GC

相關推薦

JVM GC 機制與效能優化

1 背景介紹 與C/C++相比,JAVA並不要求我們去人為編寫程式碼進行記憶體回收和垃圾清理。JAVA提供了垃圾回收器(garbage collector)來自動檢測物件的作用域),可自動把不再被使用的儲存空間釋放掉,也就是說,GC機制可以有效地防止記憶體洩露

JVM GC機制

 記憶體管理和垃圾回收是JVM非常關鍵的點,對Java效能的剖析而言,瞭解記憶體管理和垃圾回收的基本策略非常重要。本篇對Sun JVM 6.0的記憶體管理和垃圾回收做大概的描述。       1.記憶體管理       在程式執行過程當中,會建立大量的物件,這些物件,大

JVM內存管理及GC機制

per 內存清理 bject long 變量 percent 大數 標記 編寫程序 一、概述 Java GC(Garbage Collection,垃圾收集,垃圾回收)機制,是Java與C++/C的主要區別之一,作為Java開發者,一般不需要專門編寫內存回收和垃圾清理代碼,

#jvm內存及GC機制#

最大 比較 就會 java 意義 VM 可能 word head 轉載 1 為什麽要有Survivor區 先不去想為什麽有兩個Survivor區,第一個問題是,設置Survivor區的意義在哪裏? 如果沒有Survivor,Eden區每進行一次Minor GC,存活的

關於JVMGC機制的總結

“自適應的、分代的、停止-複製、標記-清掃”式垃圾回收器 Java的垃圾回收機制是Java虛擬機器提供的能力,用於在空閒時間以不定時的方式動態回收無任何引用的物件佔據的記憶體空間。 事實上,除了釋放沒用的物件,垃圾回收也可以清除記憶體記錄碎片。由於建

深入JVM系列(二)之GC機制、收集器與GC調優

一、回顧JVM記憶體分配 1.1、記憶體分配: 1、物件優先在EDEN分配 2、大物件直接進入老年代  3、長期存活的物件將進入老年代  4、適齡物件也可能進入老年代:動態物件年齡判斷 動態物件年齡判斷: 虛擬機器並不總是要求物件的年齡必須達到MaxTenuring

JVM記憶體管理及GC機制

一、概述 Java GC(Garbage Collection,垃圾收集,垃圾回收)機制,是Java與C++/C的主要區別之一,作為Java開發者,一般不需要專門編寫記憶體回收和垃圾清理程式碼,對記憶體洩露和溢位的問題,也不需要像C程式設計師那樣戰戰兢兢。經過這麼長時間的發

jvm原理,記憶體模型及GC機制

1. jvm記憶體模型 程式計數器、本地方法棧、方法區、Java棧、Java堆及其他隱含暫存器。 1.1 程式計數器: 程式計數器是一塊較小的記憶體空間,可以看作是當前執行緒所執行的位元組碼的行號指示器。分支、迴圈、跳轉、異常處理、執行緒恢復等基礎功能都需要依賴這個

JVMGC機制新生代GC

在C++和Java之間隔著一堵由物件的記憶體手動分配釋放和自動回收圍成的牆,牆外面的人想進去,牆裡面的人卻想出來。C++和Java在對記憶體的管理上有著根本的區別。下面來講下Java的記憶體回收機制。 每種高階語言都有著自己相應的記憶體模型和回收機制。Java的記憶體是通過

JVM記憶體分割槽和垃圾回收GC機制

JVM記憶體分割槽 JVM(Java virtual machine),即Java虛擬機器,它的厲害之處在於平臺無關性,“一處編寫,到處執行”。JVM通過執行目標位元組碼(.class),解釋在不同平臺上的機器執行,所以在具體的平臺上並不產生直接依賴。 JV

深入理解JVM的記憶體結構及GC機制

開發十年,就只剩下這套架構體系了! >>>   

JVMGC機制的個人理解

  該圖代表jvm中的新生代,老年代,持久代;  新生代和老年代主要指堆區(管理物件),持久代主要指方法區

JVM GC算法 垃圾回收器

com 修正 可用 mark 信息 網站 最長 style 互聯網 JVM的垃圾回收算法有三種: 1.標記-清除(mark-sweep):啥都不說,直接上圖 2.標記-整理(mark-compact) 3.復制(copy) 分代收集算法

Java內存區域劃分和GC機制

不足 pre 清理內存 stack for 復制 內存區域 關於 並不是 Java 內存區域和GC機制 目錄 Java垃圾回收概況 Java內存區域 Java對象的訪問方式 Java內存分配機制 Java GC機制 垃圾收集器 Java垃圾回收概況   Jav

java內存管理與GC機制(一)

大於 一個棧 es2017 記錄 高速 工作 限制 fin 不存在 計算機cpu運轉速度越來越快,硬盤遠遠跟不上cpu的讀寫速度,就設計可內存。隨著cpu的發展,內存的讀寫速度也跟不上cpu處理速度,就在每顆cpu上加入了高速緩存。在多處理器系統中,每個處理

JVM GC Collector工作原理及優化

情況 .cn 次數 線程 update mode -1 verify 測試 JVM 調優主要是調整GC以及一些執行參數: 目標: 堆不要太大,不然單次GC的時間過長導致服務器無法響應的問題 壓力測試的時候TPS平穩 盡量避免full GC 檢查是否用了並行的垃圾回收器

jvm-gc

index 對象大小 https heap else 方式 應用 lag 階段 由於heap中對象的存活時間差異很大,如果每一次都是無差別的進行gc,效率會很差。將heap按照對象大小、存活時間劃分出不同的區域,針對不同的區域使用不同的gc算法可以提高效率。 年輕代的對象

Java 內存區域和GC機制

fcm c語言 eth policy 資源 技術分享 程序員 ctime dir Java垃圾回收概況   Java GC(Garbage Collection,垃圾收集,垃圾回收)機制,是Java與C++/C的主要區別之一,作為Java開發者,一般不需要專門編寫內存回收和

Java 內存回收機制——GC機制

出棧 font 學習 eap 實現 機制 virt 鏈接 http 一、Java GC 概念說明   Java GC(Garbage Collection,垃圾收集,垃圾回收)機制,是Java與C++/C的主要區別之一,作為Java開發者,一般不需要專門編寫內存回收和垃圾清

jvm gc監控分析常用命令

jvm gc tomcat 1、 jstat -gcutil pid統計gc信息統計。[root@tx-oss-web-01-16-100 jvm-monitor]# jstat -gcutil 8733S0 S1 E O P YGC YGCT FGC FGCT GCT 82.43 0.00 75