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。html
咱們能夠看到:Young Gen垃圾回收時,採用將存活對象複製到到空的Suvivor Space的方式來確保不存在內存碎片,採用空間換時間的方式來加速內存垃圾回收。
2)年老代(Tenured Gen):年老代主要存放JVM認爲比較old的對象(通過幾回的Young Gen的垃圾回收後仍然存在),內存大小相對會比較大,垃圾回收也相對沒有那麼頻繁(譬如可能幾個小時一次)。年老代主要採用壓縮的方式來避免內存碎片(將存活對象移動到內存片的一邊),固然,有些垃圾回收器(譬如CMS垃圾回收器)出於效率的緣由,可能會不進行壓縮。
3)持久代(Perm Gen):持久代主要存放類定義、字節碼和常量等不多會變動的信息java
-Xms
|
初始Heap大小
|
-Xmx
|
java heap最大值
|
-Xmn
|
young generation的heap大小
|
-Xss
|
每一個線程的
Stack
大小
|