1 垃圾
1.1 前言
眾所周知,JVM
擁有著垃圾回收器娜搂,自動(dòng)回收內(nèi)存凑保,讓開(kāi)發(fā)人員只專注于編程,而不需要手動(dòng)進(jìn)行內(nèi)存管理涌攻。
那么到底什么樣的對(duì)象才會(huì)被定義為垃圾欧引,且被JVM
的垃圾回收器回收掉
1.2 定位
1.2.1 簡(jiǎn)介
在JVM
中當(dāng)一個(gè)對(duì)象沒(méi)有任何引用指向他的時(shí)候就會(huì)被認(rèn)為是一個(gè)垃圾,例如下圖中
當(dāng)棧里面的person
引用不再指向堆里面的Person
對(duì)象時(shí)恳谎,Person
對(duì)象就會(huì)被認(rèn)為是一個(gè)垃圾對(duì)象芝此,那么就會(huì)被回收掉
但有時(shí)候在堆里面,對(duì)象相互指向因痛,但是棧里面并沒(méi)有任何一個(gè)引用指向?qū)ο蠡槠唬敲茨切?duì)象會(huì)被認(rèn)為是一堆垃圾。如下圖所示
棧里面沒(méi)有一個(gè)引用指向堆里面的對(duì)象鸵膏,那么對(duì)象1 對(duì)象2 對(duì)象3 就會(huì)被認(rèn)為是一塊垃圾膊升,從而被回收掉
1.2.2 尋找
那么JVM
是如何尋找到垃圾對(duì)象,并且進(jìn)行回收掉的呢谭企? 在JVM
有兩種算法去定位垃圾的存在:
- 引用計(jì)數(shù)算法
- 根可達(dá)算法
接下來(lái)就來(lái)仔細(xì)探討這兩種算法的區(qū)別是什么
引用計(jì)數(shù)
所謂的引用計(jì)數(shù)指的的就是記錄一個(gè)對(duì)象有多少個(gè)引用指向該對(duì)象廓译。當(dāng)引用為0,即沒(méi)有任何引用指向該對(duì)象時(shí)债查,就認(rèn)為該對(duì)象為垃圾非区。
如圖
當(dāng)沒(méi)有任何引用指向?qū)ο髸r(shí),即對(duì)象存儲(chǔ)的計(jì)數(shù)為0時(shí)盹廷,則認(rèn)為是一個(gè)垃圾
注意:這種方式的壞處就是當(dāng)幾個(gè)對(duì)象相互指向的時(shí)候征绸,是沒(méi)有辦法通過(guò)引用計(jì)數(shù)來(lái)判斷對(duì)象是否為垃圾
因此
JVM
則采用另外一個(gè)算法(根可達(dá)算法)來(lái)確定垃圾
根可達(dá)算法
所謂的根可達(dá)算法就是一系列稱為GCRoots
的根對(duì)象作為起始節(jié)點(diǎn)集,從這些節(jié)點(diǎn)開(kāi)始俄占,根據(jù)引用關(guān)系向下搜索管怠,搜索過(guò)程所走過(guò)的路徑稱為“引用鏈”(ReferenceChain
)。
如果某個(gè)對(duì)象到GCRoots間沒(méi)有任何引用鏈相連缸榄,或者用圖論的話來(lái)說(shuō)就是從GCRoots到這個(gè)對(duì)象不可達(dá)時(shí)渤弛,則證明此對(duì)象是不可能再被使用的
如圖所示
圖中,可以通過(guò)根“找到”對(duì)象1碰凶,對(duì)象2暮芭,對(duì)象3鹿驼,就認(rèn)為這三個(gè)對(duì)象不是垃圾
圖中,對(duì)象10辕宏,對(duì)象20畜晰,對(duì)象30 通過(guò) 根引用無(wú)法“找到”,所以這三個(gè)對(duì)象是垃圾
在JVM
規(guī)范中以下對(duì)象會(huì)認(rèn)為是根:
- 在虛擬機(jī)棧(棧幀中的本地變量表)中引用
- 在本地方法棧中
JNI
(即通常所說(shuō)的Native方法)引用 - 運(yùn)行常量池引用
- 方法區(qū)的靜態(tài)引用
-
Class
類型引用還有一些常駐對(duì)象引用(NullPointerException
)
2. 回收
在JVM
中關(guān)于常見(jiàn)垃圾回收的算法,一共有三個(gè):
- 標(biāo)記清除算法(
Mark-Sweep
) - 復(fù)制算法(
Copy
) - 標(biāo)記壓縮算法(
Mark-Compact
)
下面是對(duì)這三種算法的詳細(xì)描述和對(duì)比
2.1 Mark-Sweep
JVM
中最早出現(xiàn)的垃圾回收算法瑞筐,算法主要分為標(biāo)記和清除兩部分凄鼻,簡(jiǎn)單了解就是先標(biāo)記所有的垃圾對(duì)象,然后統(tǒng)一回收掉所有的標(biāo)記對(duì)象聚假。如下圖所示
注意
這種方式回收垃圾块蚌,會(huì)產(chǎn)生碎片化的內(nèi)容,從而有可能導(dǎo)致無(wú)法分配連續(xù)的內(nèi)存空間
2.2 Mark-Copying
標(biāo)記-復(fù)制算法也叫復(fù)制算法膘格,這種算法的出現(xiàn)主要是為了解決標(biāo)記-清除算法的缺陷峭范。標(biāo)記-復(fù)制算法就是將一個(gè)可用內(nèi)存劃分為兩塊等同的區(qū)域。
每次都使用其中某一塊區(qū)域瘪贱,當(dāng)一塊區(qū)域(A
)使用完畢就會(huì)把存活的對(duì)象復(fù)制到另外一塊區(qū)域(B
)逛尚,復(fù)制完成掸犬,再將之前的區(qū)域(A
)進(jìn)行清空赞赖。如圖
這種算法好處如下:
- 實(shí)現(xiàn)簡(jiǎn)單咱枉,運(yùn)行高效
- 可以為一個(gè)對(duì)象分配一個(gè)連續(xù)的內(nèi)存空間,不用考慮碎片化內(nèi)存
- 回收時(shí)只需要對(duì)半個(gè)內(nèi)存空間全部清空即可
但是缺點(diǎn)也顯而易見(jiàn)球昨,如下:
- 存在內(nèi)存空間的復(fù)制開(kāi)銷
- 可使用的內(nèi)存縮小為原來(lái)的一半尔店,存在空間浪費(fèi)
縱觀有這樣那樣的缺陷,但是現(xiàn)在商用的
JVM
,例如HotSpot
,也是有限采用這種算法去對(duì)新生代的對(duì)象進(jìn)行垃圾回收
2.3 Mark-Compact
標(biāo)記-壓縮算法也是針對(duì)標(biāo)記-清除算法主慰,進(jìn)行改進(jìn)嚣州,當(dāng)標(biāo)記的對(duì)象清除以后,存貨的對(duì)象進(jìn)行移動(dòng)河哑,從而防止碎片化的內(nèi)存出現(xiàn)避诽。具體如下:
這種算法與之前的標(biāo)記-清除算法本質(zhì)的區(qū)別就是,標(biāo)記-清除算法只是清除璃谨,而不會(huì)移動(dòng)存活的對(duì)象。標(biāo)記-壓縮則是清除后會(huì)進(jìn)行移動(dòng)鲤妥,從而防止碎片化的內(nèi)存出現(xiàn)
這種算法也有很大的缺陷:
移動(dòng)存活對(duì)象操作必須全程暫停用戶程序才能進(jìn)行佳吞。
這種算法主要是針對(duì)老年代,老年代存活對(duì)象較多棉安,如果頻繁對(duì)老年代進(jìn)行垃圾回收底扳,會(huì)導(dǎo)致程序卡頓,因此這種現(xiàn)象稱為
STW
(Stop The World
)
3. 分代
在經(jīng)典的垃圾回收器中,JVM
采用了分代模型(主要是針對(duì)jdk1.7 - jdk1.9
),JVM
將堆分為了兩部分
-
新生代
- 新出生的對(duì)象都在新生代
- 新生代的對(duì)象朝生夕死
- 采用標(biāo)記-復(fù)制算法進(jìn)行垃圾回收
-
老年代
- 垃圾較少贡耽,存活對(duì)象較多
- 一般采用標(biāo)記-壓縮算法衷模,如果采用的是G1垃圾回收器則采用標(biāo)記-復(fù)制算法
-
永久代
- 在
JDK1.8
之后沒(méi)有永久代了鹊汛,取而代之的是元數(shù)據(jù)區(qū)(Metaspace
) - 永久代 和 元數(shù)據(jù)區(qū)都是用來(lái)存放 Class對(duì)象
- 永久代可以指定大小,元數(shù)據(jù)區(qū)則不需要指定大小阱冶,而是直接依賴物理內(nèi)存
- 在
注意:如果JVM采用最新的垃圾回收器刁憋,則不區(qū)分新生代和老年代了
堆內(nèi)存模型圖如下:
3.1 新生代
新生代主要分為三個(gè)區(qū)域:
- 伊甸區(qū)(
eden
) - 幸存0區(qū)(
survivor0
) - 幸存1區(qū)(
survivor1
)
其中他們的比例為 8 :1 : 1
,同時(shí)木蹬,新生代采用的是復(fù)制算法進(jìn)行垃圾回收至耻。如下:
新生成的對(duì)象優(yōu)先存放在新生代中,新生代對(duì)象朝生夕死镊叁,存活率很低尘颓,在新生代中,常規(guī)應(yīng)用進(jìn)行一次垃圾收集一般可以回收70% ~ 95% 的空間晦譬,回收效率很高疤苹。
HotSpot將新生代劃分為三塊,一塊較大的Eden空間和兩塊較小的Survivor空間敛腌,默認(rèn)比例為8:1:1痰催。劃分的目的是因?yàn)镠otSpot采用復(fù)制算法來(lái)回收新生代,設(shè)置這個(gè)比例是為了充分利用內(nèi)存空間迎瞧,減少浪費(fèi)夸溶。新生成的對(duì)象在Eden區(qū)分配(大對(duì)象除外,大對(duì)象直接進(jìn)入老年代)凶硅,當(dāng)Eden區(qū)沒(méi)有足夠的空間進(jìn)行分配時(shí)缝裁,虛擬機(jī)將發(fā)起一次
Minor GC
GC開(kāi)始時(shí),對(duì)象只會(huì)存在于Eden區(qū)和Survivor 0區(qū)足绅,S1區(qū)是空的(作為保留區(qū)域)捷绑。GC進(jìn)行時(shí),
Eden
區(qū)中所有存活的對(duì)象都會(huì)被復(fù)制到S1區(qū)氢妈,而在S0
區(qū)中粹污,仍存活的對(duì)象會(huì)根據(jù)它們的年齡值決定去向,年齡值達(dá)到年齡閥值(默認(rèn)為15首量,新生代中的對(duì)象每熬過(guò)一輪垃圾回收壮吩,年齡值就加1,GC分代年齡存儲(chǔ)在對(duì)象的header
中)的對(duì)象會(huì)被移到老年代中加缘。沒(méi)有達(dá)到閥值的對(duì)象會(huì)被復(fù)制到
s1
區(qū)鸭叙。接著清空Eden
區(qū)和s0
區(qū),新生代中存活的對(duì)象都在s1
區(qū)拣宏。接著沈贝,s0
區(qū)和s1
區(qū)會(huì)交換它們的角色,也就是新的s1
區(qū)就是上次GC清空的s0
區(qū)勋乾,新的s0
區(qū)就是上次GC的s1
區(qū)宋下,總之嗡善,不管怎樣都會(huì)保s1
區(qū)在一輪GC后是空的。GC時(shí)當(dāng)s1
區(qū)沒(méi)有足夠的空間存放上一次新生代收集下來(lái)的存活對(duì)象時(shí)学歧,需要依賴?yán)夏甏M(jìn)行分配擔(dān)保罩引,將這些對(duì)象存放在老年代中。
3.2 老年代
老年代與新生代比例為3:1
,如下:
在新生代中經(jīng)歷了多次(具體看虛擬機(jī)配置的閥值)GC后仍然存活下來(lái)的對(duì)象會(huì)進(jìn)入老年代中撩满。老年代中的對(duì)象生命周期較長(zhǎng)蜒程,存活率比較高,在老年代中進(jìn)行GC的頻率相對(duì)而言較低伺帘,而且回收的速度也比較慢昭躺。
注意:當(dāng)較大的對(duì)象無(wú)法在新生代分配內(nèi)存時(shí),則會(huì)直接進(jìn)入老年代
注意:老年代的垃圾回收稱為
FullGC
,老年代頻繁垃圾回收則會(huì)出現(xiàn)STW
現(xiàn)象伪嫁,因此JVM調(diào)優(yōu)主要就是盡量減少FGC
4. 回收器
上述都是對(duì)JVM
進(jìn)行理論闡述领炫,而垃圾回收器則是對(duì)上述理論的實(shí)現(xiàn)。在《JVM規(guī)范》中沒(méi)有對(duì)垃圾回收器做各種規(guī)定张咳,因此不同的廠商的不同虛擬機(jī)會(huì)存在不同的區(qū)別帝洪。
在這里主要是探討HotSpot
虛擬機(jī)的垃圾回收器,關(guān)于所有垃圾回收器(jdk1.0-jdk13
)如下圖
圖中的G1
,ZGC
,Shenandoah
回收器不再區(qū)分新生代和老年代脚猾,Epsilon
是JDK內(nèi)部調(diào)試的回收器
在目前的環(huán)境中葱峡,向后面三個(gè)用的還是比較少的,因此主要是還是集中討論新生代和老年代的垃圾回收
圖中虛線部分連接起來(lái)代表兩個(gè)垃圾回收器可以結(jié)合使用
4.1 新生代
4.1.1 Serial
Serial
回收器是一個(gè)用來(lái)新生代垃圾回收器龙助,Serial old
是一個(gè)用在老年代的垃圾回收器
這個(gè)回收器是一個(gè)單線程工程的垃圾回收器砰奕,這個(gè)“單線程”回收器是指使用一個(gè)處理器或者一條收集線程去執(zhí)行。
當(dāng)進(jìn)行垃圾回收的時(shí)候提鸟,必須暫停其他所有的工作線程军援,直到回收結(jié)束。當(dāng)然這樣就會(huì)產(chǎn)生STW
現(xiàn)象称勋。如下:
從JDK1.3開(kāi)始胸哥,一直到現(xiàn)在最新的JDK13,HotSpot虛擬機(jī)開(kāi)發(fā)團(tuán)隊(duì)為消除或者降低用戶線程因垃圾收集而導(dǎo)致停頓的努力一直持續(xù)進(jìn)行著赡鲜,從Serial收集器到Parallel收集器空厌,再到ConcurrentMarkSweep(CMS)和GarbageFirst(G1)收集器,最終至現(xiàn)在垃圾收集器的最前沿成果Shenandoah和ZGC等蝗蛙,我們看到了一個(gè)個(gè)越來(lái)越構(gòu)思精巧蝇庭,越來(lái)越優(yōu)秀,也越來(lái)越復(fù)雜的垃圾收集器不斷涌現(xiàn)捡硅,用戶線程的停頓時(shí)間在持續(xù)縮短,但是仍然沒(méi)有辦法徹底消除(這里不去討論RTSJ中的收集器)盗棵,探索更優(yōu)秀垃圾收集器的工作仍在繼續(xù)(出自《深入理解JVM第三版》)
4.1.2 ParNew
ParNew
垃圾回收器本質(zhì)上相當(dāng)于Serial
垃圾回收器的多線程并行版本壮韭,除了在回收的時(shí)候使用多線程并行回收北发,其他的與Serial
回收器一摸一樣。
具體工作流程如下:
注意:上圖中的老年代垃圾回收器采用的還是
Serial Old
,當(dāng)然也可以與CMS
回收器配合使用喷屋,當(dāng)然也推薦與CMS
配合使用
4.1.3 Parallel Scavenge
Parallel Scavenge
與ParNew
回收器類似琳拨,也是一個(gè)新生代的垃圾回收器,也是基于標(biāo)記-復(fù)制算法實(shí)現(xiàn)的垃圾回收器屯曹。同時(shí)也是一款并行的垃圾回收器狱庇,
只不過(guò)Parallel Scavenge
更加專注于一個(gè)可以達(dá)到的吞吐量
吞吐量 = 用戶代碼運(yùn)行時(shí)間 / (用戶代碼運(yùn)行時(shí)間 + 垃圾回收時(shí)間)
吞吐量越高就意味著垃圾回收時(shí)間越短,例如用戶代碼運(yùn)行時(shí)間是20s
,垃圾回收時(shí)間1s
,那么意味著吞吐量為20/21 =95%
當(dāng)然也可以通過(guò)一些參數(shù)去設(shè)置用戶的吞吐量:
-
-XX: MaxGCPauseMillis
設(shè)置最大垃圾收集停頓時(shí)間 -
-XX: GCTimeRatio
設(shè)置吞吐量大小
工作流程圖如下:
4.2 老年代
4.2.1 Serial Old
Serial Old
就相當(dāng)于Serial
垃圾回收器的老年代版本恶耽,同樣的是單線程密任,采用標(biāo)記-壓縮算法。這里就不再追訴了
4.2.2 Parallel Old
Parallel Old
回收器相當(dāng)于是Parallel Scavenge
回收器的老年代版本偷俭,這個(gè)回收器同樣是一個(gè)基于標(biāo)記-壓縮算的多線程垃圾回收器浪讳。
這個(gè)垃圾回收器是在jdk1.6
以后才開(kāi)始提供,之前Parallel Scavenge
垃圾回收器都是于Serial Old
垃圾回收器配合使用涌萤。
直到Parallel Old
垃圾回收器的出現(xiàn)淹遵,老年代才慢慢開(kāi)始以吞吐量?jī)?yōu)先餓垃圾回收器
工作流程圖如下:
4.2.3 CMS
-
簡(jiǎn)介
CMS(Concurrent Mark Sweep)
回收器是一個(gè)老年代的垃圾回收器,從名字可以看到是一個(gè)并發(fā)的,標(biāo)記-清除垃圾回收器负溪。
這個(gè)回收器是以最短回收停頓時(shí)間 為目標(biāo)的垃圾回收器透揣,從上述的介紹中可以得到老年代的的垃圾回收器,都需要暫停用戶線程在進(jìn)行垃圾回收川抡,因此都會(huì)產(chǎn)生STW
現(xiàn)象
而當(dāng)今大部分Java程序都是以B/S
架構(gòu)為主辐真,在開(kāi)發(fā)這類程序時(shí),更加關(guān)注服務(wù)端的響應(yīng)時(shí)間猖腕,也就說(shuō)盡量減少系統(tǒng)的停頓時(shí)間拆祈。
那么CMS
回收器就是一個(gè)盡量減少停頓時(shí)間的的垃圾回收器。
-
工作原理
與之前的標(biāo)記-壓縮算法不用倘感,
CMS
垃圾回收器則是基于標(biāo)記-清除算法放坏,該垃圾回收器主要基于以下幾部分:- 初始標(biāo)記
- 并發(fā)標(biāo)記
- 重新標(biāo)記
- 并發(fā)清除
其中初始標(biāo)記,重新標(biāo)記還是會(huì)產(chǎn)生
STW
,但是這個(gè)時(shí)間非常短,不會(huì)占據(jù)特別長(zhǎng)的時(shí)間初始標(biāo)記只是標(biāo)記以下
GC ROOT
能夠直接關(guān)聯(lián)的對(duì)象老玛,如下圖淤年,初始標(biāo)記就是標(biāo)記對(duì)象1 和 對(duì)象11image-20210324110848531初始標(biāo)記還是會(huì)暫停其他用戶線程,因此還是會(huì)產(chǎn)生
STW
蜡豹,但是這個(gè)標(biāo)記速度很快
并發(fā)標(biāo)記 是從
GC Root
遍歷整個(gè)對(duì)象的過(guò)程麸粮,這個(gè)速度需要的時(shí)間較長(zhǎng),但是不會(huì)暫停用戶所有的線程镜廉,而是和用戶線程一起執(zhí)行弄诲,這樣也不會(huì)產(chǎn)生停頓的現(xiàn)象image-20210324111253954
重新標(biāo)記則是修改并發(fā)標(biāo)記期間,因?yàn)橛脩舫绦虻倪\(yùn)行,從而導(dǎo)致標(biāo)記的對(duì)象發(fā)生變量
例如:上圖中有可能在程序運(yùn)行過(guò)程中
GC ROOT
不再指向?qū)ο?1齐遵,因此需要重新標(biāo)記但是這個(gè)標(biāo)記時(shí)間比初始標(biāo)記長(zhǎng)寂玲,但是比并發(fā)標(biāo)記時(shí)間短。
注意 重新標(biāo)記也會(huì)暫停所有用戶線程去進(jìn)行標(biāo)記
并發(fā)清理清除上述標(biāo)記中需要清除的垃圾對(duì)象梗摇,由于是采用標(biāo)記-清除算法拓哟,因此也不需要向標(biāo)記-壓縮算法一樣,移動(dòng)存活的對(duì)象伶授,所以這個(gè)時(shí)間也是比較快的断序。
同時(shí)這個(gè)過(guò)程也不需要暫停用戶所有線程,而是與用戶線程一起運(yùn)行糜烹,如下圖所示:
image-20210324112320181
當(dāng)然這個(gè)垃圾收器也有一些缺點(diǎn)违诗,例如最明顯由于采用標(biāo)記-清除算法,所以就會(huì)導(dǎo)致會(huì)產(chǎn)生過(guò)多的隨便化空間景图,這樣會(huì)給大對(duì)象分配帶來(lái)很大的麻煩较雕。
當(dāng)沒(méi)有足夠大的空間為大內(nèi)存,不得不提前觸發(fā)一次FullGC的情況挚币。為了解決這個(gè)問(wèn)題亮蒋,CMS收集器提供了一個(gè)
-XX:+UseCMS-CompactAtFullCollection
開(kāi)關(guān)參數(shù)用于在CMS收集器不得不進(jìn)行FullGC時(shí)開(kāi)啟內(nèi)存碎片的合并整理過(guò)程,由于這個(gè)內(nèi)存整理必須移動(dòng)存活對(duì)象妆毕,所以就會(huì)導(dǎo)致停頓時(shí)間過(guò)長(zhǎng)等
5. 指令
JVM
的指令主要分為三大類:
-
標(biāo)準(zhǔn)指令
以
-
開(kāi)頭慎玖,所有版本的HotSpot
的都支持 -
非標(biāo)準(zhǔn)指令
以
-X
開(kāi)頭 特定版本的HotSpot
都支持 -
高級(jí)運(yùn)行時(shí)指令
以
-XX
開(kāi)頭,可能下個(gè)版本會(huì)取消的指令
所有詳細(xì)命令可以參考以下網(wǎng)址:
http://www.oracle.com/technetwork/java/javase/documentation/index.html
5.1 非標(biāo)準(zhǔn)
輸入java -X
即可看到常用的非標(biāo)準(zhǔn)指令笛粘,如下:
-Xmixed 混合模式執(zhí)行 (默認(rèn))
-Xint 僅解釋模式執(zhí)行
-Xbootclasspath:<用 ; 分隔的目錄和 zip/jar 文件>
設(shè)置搜索路徑以引導(dǎo)類和資源
-Xbootclasspath/a:<用 ; 分隔的目錄和 zip/jar 文件>
附加在引導(dǎo)類路徑末尾
-Xbootclasspath/p:<用 ; 分隔的目錄和 zip/jar 文件>
置于引導(dǎo)類路徑之前
-Xdiag 顯示附加診斷消息
-Xnoclassgc 禁用類垃圾收集
-Xincgc 啟用增量垃圾收集
-Xloggc:<file> 將 GC 狀態(tài)記錄在文件中 (帶時(shí)間戳)
-Xbatch 禁用后臺(tái)編譯
-Xms<size> 設(shè)置初始 Java 堆大小
-Xmx<size> 設(shè)置最大 Java 堆大小
-Xss<size> 設(shè)置 Java 線程堆棧大小
-Xprof 輸出 cpu 配置文件數(shù)據(jù)
-Xfuture 啟用最嚴(yán)格的檢查, 預(yù)期將來(lái)的默認(rèn)值
-Xrs 減少 Java/VM 對(duì)操作系統(tǒng)信號(hào)的使用 (請(qǐng)參閱文檔)
-Xcheck:jni 對(duì) JNI 函數(shù)執(zhí)行其他檢查
-Xshare:off 不嘗試使用共享類數(shù)據(jù)
-Xshare:auto 在可能的情況下使用共享類數(shù)據(jù) (默認(rèn))
-Xshare:on 要求使用共享類數(shù)據(jù), 否則將失敗趁怔。
-XshowSettings 顯示所有設(shè)置并繼續(xù)
-XshowSettings:all
顯示所有設(shè)置并繼續(xù)
-XshowSettings:vm 顯示所有與 vm 相關(guān)的設(shè)置并繼續(xù)
-XshowSettings:properties
顯示所有屬性設(shè)置并繼續(xù)
-XshowSettings:locale
顯示所有與區(qū)域設(shè)置相關(guān)的設(shè)置并繼續(xù)
-X 選項(xiàng)是非標(biāo)準(zhǔn)選項(xiàng), 如有更改, 恕不另行通知。
例如在這里可以設(shè)置堆的初始化內(nèi)存大小和最大堆
java -Xms128m -Xmx1024m
5.2 高級(jí)運(yùn)行時(shí)指令
常用的高級(jí)指令如下:
-XX:+PrintFlagsFinal
# 設(shè)置最終生效值
-XX:+PrintFlagsInitial
# 查看默認(rèn)值
-XX:+PrintCommandLineFlags
# 查看命令行參數(shù)
例如輸入
java -XX:PrintCommandLineFlags
上圖中選中的代表現(xiàn)在HotSpot
虛擬機(jī)采用的是Parallel Scavenage
+ Parallel Old
垃圾回收器