假設你是一個普通的 Java 對象,你出生在 Eden 區,在 Eden 區有許多和你差很少的小兄弟、小姐妹,能夠把 Eden 區當成幼兒園,在這個幼兒園裏你們玩了很長時間。Eden 區不能無休止地放大家在裏面,因此當年紀稍大,你就要被送到學校去上學,這裏假設從小學到高中都稱爲 Survivor 區。開始的時候你在 Survivor 區裏面劃分出來的的「From」區,讀到高年級了,就進了 Survivor 區的「To」區,中間因爲學習成績不穩定,還常常來回折騰。直到你 18 歲的時候,高中畢業了,該去社會上闖闖了。因而你就去了年老代,年老代裏面人也不少。在年老代裏,你生活了 20 年 (每次 GC 加一歲),最後壽終正寢,被 GC 回收。有一點沒有提,你在年老代遇到了一個同窗,他的名字叫愛德華 (慕光之城裏的帥哥吸血鬼),他以及他的家族永遠不會死,那麼他們就生活在永生代html
GC 命令行選項 描述java
id | name |
---|---|
-Xms | 設置Java堆大小的初始值/最小值。例如:-Xms512m (請注意這裏沒有」=」) |
-Xmx | 設置Java堆大小的最大值 |
-Xmn | 設置年輕代對空間的初始值,最小值和最大值。請注意,年老代堆空間大小是依賴於年輕代堆空間大小的 |
-XX:PermSize=[g/m/k] | 設置持久代堆空間的初始值和最小值 |
-XX:MaxPermSize=[g/m/k] | 設置持久代堆空間的最大值 |
### 如何將新對象預留在年輕代學習
-XX:+PrintGCDetails -Xmx1000M -Xms500M -Xmn100M -XX:SurvivorRatio=8 設置一個較大的年輕代預留新對象,設置合理的 Survivor 區而且提供 Survivor 區的使用率,能夠將年輕對象保存在年輕代。通常來講,Survivor 區的空間不夠,或者佔用量達到 50%時,就會使對象進入年老代 (無論它的年齡有多大)url
-XX:TargetSurvivorRatio=90 參數,這樣能夠提升 from 區的利用率,使 from 區使用到 90%時,再將對象送入年老代spa
讓大對象進入年老代
參數-XX:PetenureSizeThreshold 設置大對象直接進入年老代的閾值。當對象的大小超過這個值時,將直接在年老代分配。參數-XX:PetenureSizeThreshold 只對串行收集器和年輕代並行收集器有效,並行回收收集器不識別這個參數。.net
將 1MB 以上的對象直接在年老代分配,設置-XX:PetenureSizeThreshold=1000000命令行
設置對象進入年老代的年齡
若是對象每通過一次 GC 依然存活,則年齡再加 1。當對象年齡達到閾值時,就移入年老代,成爲老年對象。這個閾值的最大值能夠經過參數-XX:MaxTenuringThreshold 來設置,默認值是 15。雖然-XX:MaxTenuringThreshold 的值多是 15 或者更大,但這不意味着新對象非要達到這個年齡才能進入年老代。線程
-XX:+PrintGCDetails -Xmx20M -Xms20M -Xmn10M -XX:SurvivorRatio=2 -XX:MaxTenuringThreshold=1htm
### 穩定的 Java 堆 VS 動盪的 Java 堆 得到一個穩定的堆大小的方法是使-Xms 和-Xmx 的大小一致,即最大堆和最小堆 (初始堆) 同樣。對象
JVM 還提供了兩個參數用於壓縮和擴展堆空間。
-XX:MinHeapFreeRatio 參數用來設置堆空間最小空閒比例,默認值是 40。當堆空間的空閒內存小於這個數值時,JVM 便會擴展堆空間。
-XX:MaxHeapFreeRatio 參數用來設置堆空間最大空閒比例,默認值是 70。當堆空間的空閒內存大於這個數值時,便會壓縮堆空間,獲得一個較小的堆。
當-Xmx 和-Xms 相等時,-XX:MinHeapFreeRatio 和-XX:MaxHeapFreeRatio 兩個參數無效。
-XX:+PrintGCDetails -Xms10M -Xmx40M -XX:MinHeapFreeRatio=40 -XX:MaxHeapFreeRatio=50
java –Xmx3800m –Xms3800m –Xmn2G –Xss128k –XX:+UseParallelGC –XX:ParallelGC-Threads=20 –XX:+UseParallelOldGC -Xss128k:減小線程棧的大小,這樣能夠使剩餘的系統內存支持更多的線程;
-Xmn2g:設置年輕代區域大小爲 2GB;
–XX:+UseParallelGC:年輕代使用並行垃圾回收收集器。這是一個關注吞吐量的收集器,能夠儘量地減小 GC 時間。
–XX:ParallelGC-Threads:設置用於垃圾回收的線程數,一般狀況下,能夠設置和 CPU 數量相等。但在 CPU 數量比較多的狀況下,設置相對較小的數值也是合理的;
–XX:+UseParallelOldGC:設置年老代使用並行回收收集器。
java –Xmx3550m –Xms3550m –Xmn2g –Xss128k –XX:ParallelGCThreads=20 –XX:+UseConcMarkSweepGC –XX:+UseParNewGC –XX:+SurvivorRatio=8 –XX:TargetSurvivorRatio=90 –XX:MaxTenuringThreshold=31
–XX:ParallelGCThreads=20:設置 20 個線程進行垃圾回收;
–XX:+UseParNewGC:年輕代使用並行回收器;
–XX:+UseConcMarkSweepGC:年老代使用 CMS 收集器下降停頓;
–XX:+SurvivorRatio:設置 Eden 區和 Survivor 區的比例爲 8:1。稍大的 Survivor 空間能夠提升在年輕代回收生命週期較短的對象的可能性,若是 Survivor 不夠大,一些短命的對象可能直接進入年老代,這對系統來講是不利的。
–XX:TargetSurvivorRatio=90:設置 Survivor 區的可以使用率。這裏設置爲 90%,則容許 90%的 Survivor 空間被使用。默認值是 50%。故該設置提升了 Survivor 區的使用率。當存放的對象超過這個百分比,則對象會向年老代壓縮。所以,這個選項更有助於將對象留在年輕代。
–XX:MaxTenuringThreshold:設置年輕對象晉升到年老代的年齡。默認值是 15 次,即對象通過 15 次 Minor GC 依然存活,則進入年老代。這裏設置爲 31,目的是讓對象儘量地保存在年輕代區域。