1. 程式人生 > >jvm 啟動引數設定

jvm 啟動引數設定

jvm記憶體區域劃分 Eden Space、Survivor Space、Tenured Gen

jvm區域總體分兩類,heap區和非heap區。heap區又分:Eden Space(伊甸園)、Survivor Space(倖存者區)、Tenured Gen(老年代-養老區)。 非heap區又分:Code Cache(程式碼快取區)、Perm Gen(永久代)、Jvm Stack(java虛擬機器棧)、Local Method Statck(本地方法棧)。

HotSpot虛擬機器GC演算法採用分代收集演算法:

1、一個人(物件)出來(new 出來)後會在Eden Space(伊甸園)無憂無慮的生活,直到GC到來打破了他們平靜的生活。GC會逐一問清楚每個物件的情況,有沒有錢(此物件的引用)啊,因為GC想賺錢呀,有錢的才可以敲詐嘛。然後富人就會進入Survivor Space(倖存者區),窮人的就直接kill掉。

2、並不是進入Survivor Space(倖存者區)後就保證人身是安全的,但至少可以活段時間。GC會定期(可以自定義)會對這些人進行敲詐,億萬富翁每次都給錢,GC很滿意,就讓其進入了Genured Gen(養老區)。萬元戶經不住幾次敲詐就沒錢了,GC看沒有啥價值啦,就直接kill掉了。

3、進入到養老區的人基本就可以保證人身安全啦,但是億萬富豪有的也會揮霍成窮光蛋,只要錢沒了,GC還是kill掉。

分割槽的目的:新生區由於物件產生的比較多並且大都是朝生夕滅的,所以直接採用標記-清理演算法。而養老區生命力很強,則採用複製演算法,針對不同情況使用不同演算法。

非heap區域中Perm Gen中放著類、方法的定義,jvm Stack區域放著方法引數、局域變數等的引用,方法執行順序按照棧的先入後出方式。

JVM在程式執行過程當中,會建立大量的物件,這些物件,大部分是短週期的物件,小部分是長週期的物件,對於短週期的物件,需要頻繁地進行垃圾回收以保證無用物件儘早被釋放掉,對於長週期物件,則不需要頻率垃圾回收以確保無謂地垃圾掃描檢測。為解決這種矛盾,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。同時,在掃描Suvivor Space時,如果物件已經經過了幾次的掃描仍然存活,JVM認為其為一個持久化物件,則將其移到Old Gen。掃描完畢後,JVM將Eden Space和A Suvivor Space清空,然後交換A和B的角色(即下次垃圾回收時會掃描Eden Space和BSuvivor Space。這麼做主要是為了減少記憶體碎片的產生。

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

-gcutil Option

Summary of Garbage Collection Statistics
Column Description
S0 Survivor space 0 utilization as a percentage of the space's current capacity.
S1 Survivor space 1 utilization as a percentage of the space's current capacity.
E Eden space utilization as a percentage of the space's current capacity.
O Old space utilization as a percentage of the space's current capacity.
P Permanent space utilization as a percentage of the space's current capacity.
YGC Number of young generation GC events.
YGCT Young generation garbage collection time.
FGC Number of full GC events.
FGCT Full garbage collection time.
GCT Total garbage collection time.

This section presents some examples of monitoring a local JVM with a lvmid of 21891.

This example attaches to lvmid 21891 and takes 7 samples at 250 millisecond intervals and displays the output as specified by the -gcutil option.

jstat -gcutil 21891 250 7

  S0     S1     E      O      P     YGC    YGCT    FGC    FGCT     GCT

 12.44   0.00  27.20   9.49  96.70    78    0.176     5    0.495    0.672

 12.44   0.00  62.16   9.49  96.70    78    0.176     5    0.495    0.672

 12.44   0.00  83.97   9.49  96.70    78    0.176     5    0.495    0.672

  0.00   7.74   0.00   9.51  96.70    79    0.177     5    0.495    0.673

  0.00   7.74  23.37   9.51  96.70    79    0.177     5    0.495    0.673

  0.00   7.74  43.82   9.51  96.70    79    0.177     5    0.495    0.673

  0.00   7.74  58.11   9.51  96.71    79    0.177     5    0.495    0.673

The output of this example shows that a young generation collection occurred between the 3rd and 4th sample. The collection took 0.001 seconds and promoted objects from the eden space (E) to the old space (O), resulting in an increase of old space utilization from 9.49% to 9.51%. Before the collection, the survivor space was 12.44% utilized, but after this collection it is only 7.74% utilized.

YGC是累計ygc的數量

YGCT 單位是秒,,,為ygc時間累計

根據這個兩個引數可以算出每次ygc的時間  0.176s/78=大概3毫秒

DF_CHANGE_DRIVER("尊敬的使用者,您預定的#order_time#的「專車服務」,司機因突發狀況無法準時來接您,故更換#dr_name#為您提供服務,電話#dr_phone#,如有疑問請致電客服#kf_phone#"),

專案實戰經驗

以http服務配置引數

1 heap總數配置   -Xmx7168m -Xms7168m

2 新生代設定成固定的值  -Xmn3072m

3 永久帶也設定成固定的值 -XX:MaxPermSize=256m  -XX:PermSize=256m (之所有http配置256m的永久帶,,,因為http要載入大量的類,,,)

4 關於gc演算法

java -server -Xss256k -XX:PermSize=96m -XX:MaxPermSize=96m -XX:SurvivorRatio=1 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=1 -XX:+CMSParallelRemarkEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=68 -XX:+DisableExplicitGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps

http://help.sap.com/saphelp_nwce10/helpdata/en/f0/cec51dabd1461b87e4db9e3958710e/content.htm

http://www.iteye.com/topic/473874

http://stackoverflow.com/questions/2101518/difference-between-xxuseparallelgc-and-xxuseparnewgc