源碼篇-JVM調(diào)優(yōu)(一)-認(rèn)識(shí)垃圾寂屏,垃圾回收算法和垃圾回收器

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ì)被回收掉

image-20210317110245223.png

但有時(shí)候在堆里面,對(duì)象相互指向因痛,但是棧里面并沒(méi)有任何一個(gè)引用指向?qū)ο蠡槠唬敲茨切?duì)象會(huì)被認(rèn)為是一堆垃圾。如下圖所示

image-20210317110743157

棧里面沒(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ì)象為垃圾非区。

如圖

image-20210319095808432.png

當(dāng)沒(méi)有任何引用指向?qū)ο髸r(shí),即對(duì)象存儲(chǔ)的計(jì)數(shù)為0時(shí)盹廷,則認(rèn)為是一個(gè)垃圾

image-20210319100015328

注意:這種方式的壞處就是當(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ì)象是不可能再被使用的

如圖所示

image-20210319102446798

圖中,可以通過(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ì)象聚假。如下圖所示

image-20210319115502139
image-20210319115543244

注意

這種方式回收垃圾块蚌,會(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)行清空赞赖。如圖

image-20210323094343538
image-20210323094522866

這種算法好處如下:

  • 實(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)避诽。具體如下:

image-20210323100228305
image-20210323100418347

這種算法與之前的標(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)存模型圖如下:

image-20210323103748384

3.1 新生代

新生代主要分為三個(gè)區(qū)域:

  • 伊甸區(qū)(eden)
  • 幸存0區(qū)(survivor0)
  • 幸存1區(qū)(survivor1)

其中他們的比例為 8 :1 : 1,同時(shí)木蹬,新生代采用的是復(fù)制算法進(jìn)行垃圾回收至耻。如下:

image-20210323104114939

新生成的對(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,如下:

image-20210323104315585

在新生代中經(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)象称勋。如下:

image-20210324101151501

從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回收器一摸一樣。

具體工作流程如下:

image-20210324102804638

注意:上圖中的老年代垃圾回收器采用的還是Serial Old,當(dāng)然也可以與CMS回收器配合使用喷屋,當(dāng)然也推薦與CMS配合使用

4.1.3 Parallel Scavenge

Parallel ScavengeParNew回收器類似琳拨,也是一個(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è)置吞吐量大小

工作流程圖如下:

image-20210324104302407

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)先餓垃圾回收器

工作流程圖如下:

image-20210324105144299

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ì)象11

    image-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
image-20210324125033378

上圖中選中的代表現(xiàn)在HotSpot虛擬機(jī)采用的是Parallel Scavenage + Parallel Old垃圾回收器

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末薪前,一起剝皮案震驚了整個(gè)濱河市润努,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌示括,老刑警劉巖铺浇,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異垛膝,居然都是意外死亡鳍侣,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)吼拥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)倚聚,“玉大人,你說(shuō)我怎么就攤上這事凿可』笳郏” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)唬复。 經(jīng)常有香客問(wèn)我矗积,道長(zhǎng)全肮,這世上最難降的妖魔是什么敞咧? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮辜腺,結(jié)果婚禮上休建,老公的妹妹穿的比我還像新娘。我一直安慰自己评疗,他們只是感情好测砂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著百匆,像睡著了一般砌些。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上加匈,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天存璃,我揣著相機(jī)與錄音,去河邊找鬼雕拼。 笑死纵东,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的啥寇。 我是一名探鬼主播偎球,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼辑甜!你這毒婦竟也來(lái)了衰絮?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤磷醋,失蹤者是張志新(化名)和其女友劉穎猫牡,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體子檀,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡镊掖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了褂痰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亩进。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖缩歪,靈堂內(nèi)的尸體忽然破棺而出归薛,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布主籍,位于F島的核電站习贫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏千元。R本人自食惡果不足惜苫昌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望幸海。 院中可真熱鬧祟身,春花似錦、人聲如沸物独。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)挡篓。三九已至婉陷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間官研,已是汗流浹背秽澳。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留阀参,地道東北人肝集。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蛛壳,于是被迫代替她去往敵國(guó)和親杏瞻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容