国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java虛擬機(jī)(JVM)、垃圾回收器

這篇具有很好參考價(jià)值的文章主要介紹了Java虛擬機(jī)(JVM)、垃圾回收器。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、Java簡介

1、Java開發(fā)及運(yùn)行版本

JRE(Java Runtime Environment,運(yùn)行環(huán)境)
所有的程序都要在JRE下才能夠運(yùn)行。包括JVM和Java核心類庫和支持文件。

JDK(Java Development Kit,開發(fā)工具包)
用來編譯、調(diào)試Java程序的開發(fā)工具包。包括Java工具(javac/java/jdb等)和Java基礎(chǔ)的類庫(java API )。

JVM(Java Virtual Machine,虛擬機(jī))
JRE的一部分,是Java的核心和基礎(chǔ),用來加載字節(jié)碼(.class)文件、管理并分配內(nèi)存、執(zhí)行垃圾收集。解釋自己的指令集(即字節(jié)碼)并映射到本地的CPU指令集和OS的系統(tǒng)調(diào)用。不同的操作系統(tǒng)會(huì)有不同的JVM映射規(guī)則,完成跨平臺(tái)性。

Java虛擬機(jī)(JVM)、垃圾回收器,java,jvm,開發(fā)語言

2、Java程序的應(yīng)用版本

Java SE
標(biāo)準(zhǔn)版(桌面程序、控制臺(tái)開發(fā)、嵌入式環(huán)境...),Java的基礎(chǔ)與核心,也是JavaEE和JavaME技術(shù)的基礎(chǔ)。
javaSE包含:面向?qū)ο?、多線程、IO流、javaSwing

Java EE
在javaSE的基礎(chǔ)上,創(chuàng)建了規(guī)范和框架,提供Web服務(wù)、組件模型、管理和通信API、服務(wù)器開發(fā),如開發(fā)B/S架構(gòu)軟件
javaEE包含:serclet、jstl、jsp、spring、mybatis

Java ME
機(jī)頂盒、移動(dòng)電話和PDA之類嵌入式消費(fèi)電子設(shè)備提供的Java語言平臺(tái),包括虛擬機(jī)和一系列標(biāo)準(zhǔn)化的Java API。

Java Card
支持一些java小程序(Applets),運(yùn)行在小內(nèi)存設(shè)備上的平臺(tái)。

二、Java的類加載

1、類加載器種類

啟動(dòng)類加載器(Bootstrap ClassLoader)
負(fù)責(zé)加載%JAVA_HOME%/lib目錄下的 jar 包和類。它只能加載自己能夠識(shí)別的類。
擴(kuò)展類加載器(Extendtion ClassLoader)
它負(fù)責(zé)加載<JAVA_HOME>\lib\ext目錄中的或者被java.ext.dirs系統(tǒng)變量所指定的路徑中的所有類庫,開發(fā)者可以使用擴(kuò)展類加載器。
應(yīng)用程序類加載器(Application ClassLoader)
負(fù)責(zé)加載ClassPath上所指定的類庫,如果應(yīng)用程序沒有自定義過自己的類加載器,一般情況下這就是程序的默認(rèn)類加載器。
自定義類加載器(CustomerClassLoader)
自己定義的類加載器,如tomcat、jboss都會(huì)根據(jù)j2ee規(guī)范自行實(shí)現(xiàn)ClassLoader。

Java虛擬機(jī)(JVM)、垃圾回收器,java,jvm,開發(fā)語言

2、類加載步驟

1.加載(類加載器完成)

1.通過類的全限定名來獲取定義此類的二進(jìn)制字節(jié)流
2.將這個(gè)類字節(jié)流代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)
3.在堆中生成一個(gè)代表此類的java.lang.Class對(duì)象,作為訪問方法區(qū)這些數(shù)據(jù)結(jié)構(gòu)的入口。

2.校驗(yàn)(連接階段)

確保Class文件的字節(jié)流中包含的信息符合當(dāng)前虛擬機(jī)的要求,不危害虛擬機(jī)的自身安全。
1.文件格式驗(yàn)證:基于字節(jié)流驗(yàn)證。
2.元數(shù)據(jù)驗(yàn)證:基于方法區(qū)的存儲(chǔ)結(jié)構(gòu)驗(yàn)證。
3.字節(jié)碼驗(yàn)證:基于方法區(qū)的存儲(chǔ)結(jié)構(gòu)驗(yàn)證。
4.符號(hào)引用驗(yàn)證:基于方法區(qū)的存儲(chǔ)結(jié)構(gòu)驗(yàn)證。

3.準(zhǔn)備(連接階段)

為類變量分配內(nèi)存,并將其初始化為默認(rèn)值。在方法區(qū)中分配這些變量所使用的內(nèi)存空間。
例1:
public static int value = 123;
此時(shí)在準(zhǔn)備階段過后的初始值為0而不是123;
例2:
public static final int value = 123;
此時(shí)value的值在準(zhǔn)備階段過后就是123。

4.解析(連接階段)

把類型中的符號(hào)引用轉(zhuǎn)換為直接引用,主要四種:
1.類或接口的解析
2.字段解析
3.類方法解析
4.接口方法解析

5.初始化

為類的靜態(tài)變量賦予正確的初始值、執(zhí)行類的靜態(tài)代碼塊。
如果有父類,則先運(yùn)行父類中的變量賦值語句和靜態(tài)語句。

6.注意

1.類在使用時(shí)才會(huì)加載:反射觸發(fā)、 new 對(duì)象。
2.加載類的子類會(huì)先加載父類。
3.static final修飾的常量屬性會(huì)存到常量池中,類不會(huì)加載。

Java虛擬機(jī)(JVM)、垃圾回收器,java,jvm,開發(fā)語言

三、JVM的內(nèi)存模型

Java虛擬機(jī)(JVM)、垃圾回收器,java,jvm,開發(fā)語言
運(yùn)行時(shí)數(shù)據(jù)區(qū)域

1、程序計(jì)數(shù)器

存放下條指令所在單元的地址。

2、線程棧(虛擬機(jī)棧)

1.局部變量表:存儲(chǔ)基本數(shù)據(jù)類型(int、float、byte等),如果是引用數(shù)據(jù)類型,則存儲(chǔ)的是其在堆中的內(nèi)存地址,也就是指向?qū)ο蟮囊粋€(gè)指針。
2.操作數(shù)棧:操作數(shù)運(yùn)算時(shí)一塊臨時(shí)的空間來存放操作數(shù)。
3.動(dòng)態(tài)鏈接:將代碼的符號(hào)引用轉(zhuǎn)換為在方法區(qū)(運(yùn)行時(shí)常量池)中的直接引用。
4.方法出口:存儲(chǔ)了棧幀中的方法執(zhí)完之后回到上一層方法的位置。

3、本地方法棧

與虛擬機(jī)棧結(jié)構(gòu)一致,本地方法棧執(zhí)行的是Java底層由C++編寫的native方法。

4、元空間(方法區(qū))

主要包括:常量、靜態(tài)變量、類信息(對(duì)象頭)、運(yùn)行時(shí)常量池,操作的是直接內(nèi)存。
默認(rèn)情況下是off heap的(堆的一個(gè)邏輯分區(qū))內(nèi)存,大小不受jvm大小的限制,屬于操作系統(tǒng)內(nèi)存。
運(yùn)行時(shí)常量池:虛擬機(jī)啟動(dòng),將各個(gè)Class文件中的常量池載入到運(yùn)行時(shí)常量池中(加載到內(nèi)存中)。Class常量池只是一個(gè)媒介場(chǎng)所。

5、堆

虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建。此內(nèi)存區(qū)域的唯一目的就是存放對(duì)象實(shí)例,幾乎所有的對(duì)象實(shí)例都在這里分配內(nèi)存。

5.1 對(duì)象結(jié)構(gòu)

Java虛擬機(jī)(JVM)、垃圾回收器,java,jvm,開發(fā)語言

Java虛擬機(jī)(JVM)、垃圾回收器,java,jvm,開發(fā)語言

四、垃圾回收

Java虛擬機(jī)(JVM)、垃圾回收器,java,jvm,開發(fā)語言

1、回收策略

1.四種引用類型

強(qiáng)引用?
new 對(duì)象就是,發(fā)生 gc 的時(shí)候不會(huì)被回收,內(nèi)存不足時(shí)拋?OOM 導(dǎo)致程序異常。
軟引用?
用 SoftReference 類實(shí)現(xiàn),內(nèi)存充足時(shí)不會(huì)回收,內(nèi)存不足時(shí)會(huì)回收,適合用于創(chuàng)建緩存。
弱引用?
用 WeakReference 類實(shí)現(xiàn),只要垃圾回收機(jī)制一運(yùn)行掃描到該對(duì)象時(shí)無論內(nèi)存是否充足都會(huì)回收該對(duì)象。ThreadLocal 的 Key 就是弱引用。
虛引用?
要 PhantomReference 類實(shí)現(xiàn),跟沒有任何引用一樣,任何適合都可以被回收。主要用跟蹤對(duì)象被垃圾回收的狀態(tài),在 gc 時(shí)返回一個(gè)通知。

2.判定堆中對(duì)象是否為垃圾

引用計(jì)數(shù)法:在對(duì)象中添加一個(gè)引用計(jì)數(shù)器,當(dāng)有地方引用這個(gè)對(duì)象時(shí),引用計(jì)數(shù)器值+1,當(dāng)引用失效時(shí),計(jì)數(shù)器值-1。兩個(gè)對(duì)象循環(huán)引用的時(shí),各自的計(jì)數(shù)器始終不會(huì)變成0,導(dǎo)致無法回收,引起內(nèi)存泄露。(一般不采用)。
可達(dá)性分析法:從GCRoots的對(duì)象虛擬機(jī)棧、方法區(qū)的類屬性引用的對(duì)象、方法區(qū)中常量引用的對(duì)象、本地方法棧中引用的對(duì)象)的引用連來判斷是否為垃圾。

Java虛擬機(jī)(JVM)、垃圾回收器,java,jvm,開發(fā)語言

3.回收算法

1.標(biāo)記–清除
首先通過根節(jié)點(diǎn),標(biāo)記所有從根節(jié)點(diǎn)開始的可達(dá)對(duì)象。清除階段,清除所有未被標(biāo)記的對(duì)象。
2.標(biāo)記–整理(壓縮)
標(biāo)記-壓縮算法從根節(jié)點(diǎn)開始,對(duì)所有可達(dá)對(duì)象做一次標(biāo)記。將所有的存活對(duì)象壓縮到內(nèi)存的一端,清理邊界外所有的空間。
3.標(biāo)記-復(fù)制
將內(nèi)存區(qū)域均分為了兩塊(記為S0和S1),創(chuàng)建對(duì)象的時(shí)只用其中的一塊(如S0),當(dāng)S0使用完之后,將S0上面存活的對(duì)象全復(fù)制到S1上去,然后將S0全部清理掉。
4.分代收集
目前大部分JVM的采用的算法。根據(jù)對(duì)象存活周期將內(nèi)存劃分為幾塊。根據(jù)每塊內(nèi)存區(qū)間的特點(diǎn),使用不同的回收算法,以提高垃圾回收的效率。
將Java堆劃分為新生代 (Young Generation)和老年代(Old Generation)兩個(gè)區(qū)域。新生代又分為Eden區(qū)、From Survivor和To Survivor。

4.分代收集算法?

Java8及之前用 分代收集算法, 會(huì)根據(jù)對(duì)象存活周期的不同將內(nèi)存劃分為幾塊,?
新生代、老年代、永久代,這樣就可以根據(jù)各年代特點(diǎn)分別采用最適當(dāng)?shù)?GC 算法

新生代—復(fù)制算法
每次垃圾收集都能發(fā)現(xiàn)大批對(duì)象已死, 只有少量存活. 因此選用復(fù)制算法, 只需要付出少量存活對(duì)象的復(fù)制成本就可以完成收集.

老年代—標(biāo)記整理算法
因?yàn)閷?duì)象存活率高、沒有額外空間對(duì)它進(jìn)行分配擔(dān)保, 就必須采用“標(biāo)記—清理”或“標(biāo)記—整理”算法來進(jìn)行回收, 不必進(jìn)行內(nèi)存復(fù)制, 且直接騰出空閑內(nèi)存.

4.三色標(biāo)記法

1.三色

黑色:表示根對(duì)象,或者該對(duì)象與它引用的對(duì)象都已經(jīng)被掃描過了。
灰色:該對(duì)象本身已經(jīng)被標(biāo)記,但是它引用的對(duì)象還沒有掃描完。
白色:未被掃描的對(duì)象,如果掃描完所有對(duì)象之后,最終為白色的為不可達(dá)對(duì)象,也就是垃圾對(duì)象。

2.三色標(biāo)記過程

1.初始時(shí),全部對(duì)象都是白色的
2.GC Roots直接引用的對(duì)象變?yōu)榛疑?br> 3.從灰色集合中獲取元素;將本對(duì)象直接引用的對(duì)象標(biāo)記為灰色;然后將當(dāng)前的對(duì)象標(biāo)記為黑色。
4.重復(fù)步驟3,直到灰色的對(duì)象集合全部變?yōu)榭?br> 5.結(jié)束后,仍然被標(biāo)記為白色的對(duì)象就是不可達(dá)對(duì)象,就視為垃圾對(duì)象。

Java虛擬機(jī)(JVM)、垃圾回收器,java,jvm,開發(fā)語言

2、各類回收器

垃圾收集器 工作方式 作用空間 ? ? ?算法 ? 特點(diǎn) 適用場(chǎng)景
Serial
串行
新生代
復(fù)制算法
響應(yīng)速度優(yōu)先
適用于單CPU環(huán)境下的client模式
ParNew
并行
新生代
復(fù)制算法
響應(yīng)速度優(yōu)先
多CPU環(huán)境Server模式下與CMS配合使用
Parallel
并行
新生代
復(fù)制算法
吞吐量優(yōu)先
適用于后臺(tái)運(yùn)算而不需要太多交互的場(chǎng)景
Serial Old
串行
老年代
標(biāo)記-整理(壓縮)算法
響應(yīng)速度優(yōu)先
適用于單CPU環(huán)境下的Client模式
Paraller Old
并行
老年代
標(biāo)記-整理(壓縮)算法
吞吐量優(yōu)先
適用于后臺(tái)運(yùn)算而不需要太多交互的場(chǎng)景
CMS
并發(fā)
老年代
標(biāo)記-清除算法
響應(yīng)速度優(yōu)先
適用于互聯(lián)網(wǎng)或B/S業(yè)務(wù)
G1
并發(fā)、并行
新生代、老年代
標(biāo)記-整理(壓縮)算法
響應(yīng)速度優(yōu)先
響應(yīng)速度優(yōu)先

1、對(duì)象分配

1.優(yōu)先分配到Eden。
2.如果對(duì)象在Eden出生并經(jīng)過第一次 Minor GC后仍然存活,且能被 Survivor容納的話,將被移動(dòng)到 Survivor空間中。對(duì)象在Survivor區(qū)中每熬過一次 Minor GC,年齡就增加1歲,當(dāng)?shù)竭_(dá)閾值(默認(rèn)為15歲,其實(shí)每個(gè)JVM、每個(gè)GC都有所不同)時(shí),就會(huì)被晉升到老年代中。
3.大對(duì)象直接分配到老年代,盡量避免程序中出現(xiàn)過多的大對(duì)象。
4.長期存活的對(duì)象分配到老年代。
5.動(dòng)態(tài)對(duì)象年齡判斷,如果 Survivor區(qū)中相同年齡的所有對(duì)象大小的總和大于 Survivor空間的一半,年齡大于或等于該年齡的對(duì)象可以直接進(jìn)入老年代,無須等到MaxtenuringThreshold中要求的年齡。

2.GC收集

新生代收集(Minor GC/ Young GC):新生代的垃圾收集。
老年代收集(Major GC/ old GC):老年代的垃圾收集。目前,只有 CMS GC會(huì)有單獨(dú)收集老年代的行為。注意,很多時(shí)候 Major GC會(huì)和Full GC混淆使用,需要具體分辨是老年代回收還是整堆回收。
混合收集(Mixed GC):收集整個(gè)新生代以及部分老年代的垃圾收集,目前,只有G1會(huì)有這種行為。
整堆收集(Full GC):收集整個(gè)java堆和方法區(qū)的垃圾收集。

1.年輕代GC(Minor GC)觸發(fā)機(jī)制

(1)當(dāng)年輕代空間不足時(shí),就會(huì)觸發(fā) Minor GC,這里的年輕代滿指的是Eden代滿,,Survivor滿不會(huì)引發(fā)GC。(每次 Minor Gc會(huì)清理年輕代的內(nèi)存。)
(2)因?yàn)镴ava對(duì)象大多都具備朝生夕滅的特性,所以 Minor gc非常頻繁,一般回收速度也比較快。這一定義既清晰又易于理解。
(3)Minor gc會(huì)引發(fā)STW,暫停其它用戶的線程,等垃圾回收結(jié)束,用戶線程才恢復(fù)運(yùn)行。

2.老年代GC(Major GC/FullGC)觸發(fā)機(jī)制

(1)指發(fā)生在老年代的GC,對(duì)象從老年代消失時(shí),?Major GC”或“Fu11GC發(fā)生了。
(2)出現(xiàn)了 Major GC,經(jīng)常會(huì)伴隨至少一次的 Minor GC(但非絕對(duì)的,在Parallel Scavenge收集器的收集策略里就有直接進(jìn)行 Major GC的策略選擇過程)。
(3)也就是在老年代空間不足時(shí),會(huì)先嘗試觸發(fā) Minor GC。如果之后空間還不足,則觸發(fā) Major GC。
(4)Major GC的速度一般會(huì)比 Minor gc慢10倍以上,STW的時(shí)間更長。

3.觸發(fā)FullGc執(zhí)行的情況

(1)調(diào)用 System. gc()時(shí),系統(tǒng)建議執(zhí)行Fu11GC,但是不必然執(zhí)行。
(2)老年代空間不足。
(3)方法區(qū)空間不足。
(4)通過 Minor GC后進(jìn)入老年代的平均大小大于老年代的可用內(nèi)存。
(5)由Eden區(qū)、 from區(qū)向 from區(qū)復(fù)制時(shí),對(duì)象大小大于 To Space可用內(nèi)存,則把該對(duì)象轉(zhuǎn)存到老年代,且老年代的可用內(nèi)存小于該對(duì)象大小。

3、G1回收器

G1 作為 JDK9 之后的服務(wù)端默認(rèn)收集器,不再區(qū)分年輕代和老年代進(jìn)行垃圾回收。
G1 默認(rèn)把堆內(nèi)存分為 N 個(gè)分區(qū),每個(gè) 1~32M。提供了四種不同區(qū)域標(biāo)簽 Eden、Survivor 、Old、 Humongous。H(Humongous)區(qū)可以認(rèn)為是 Old 區(qū)中一種特列專門用來存儲(chǔ)大數(shù)據(jù)的。

Java虛擬機(jī)(JVM)、垃圾回收器,java,jvm,開發(fā)語言

1.G1的運(yùn)行過程

1.初始標(biāo)記:標(biāo)記下GC Roots能直接關(guān)聯(lián)到的對(duì)象。這個(gè)階段需要短暫停頓線程。
2.并發(fā)標(biāo)記:從GC Root開始對(duì)堆中對(duì)象進(jìn)行可達(dá)性分析,遞歸掃描整個(gè)堆里的對(duì)象圖,找出要回收的對(duì)象,這階段耗時(shí)較長,但可與用戶程序并發(fā)執(zhí)行。
3.最終標(biāo)記:對(duì)用戶線程做一個(gè)短暫的暫停,用于處理并發(fā)標(biāo)記階段仍遺留下來的最后那少量的SATB記錄(漏標(biāo)對(duì)象)。
4.篩選回收:負(fù)責(zé)更新Region的統(tǒng)計(jì)數(shù)據(jù),對(duì)各個(gè)Region的回收價(jià)值和成本進(jìn)行排序,根據(jù)用戶所期望的停頓時(shí)間來制定回收計(jì)劃,采用復(fù)制清除算法,把有用的復(fù)制到新Region,再清理掉整個(gè)舊Region的全部空間。須暫停用戶線程,由多個(gè)收集器線程并行完成。

Java虛擬機(jī)(JVM)、垃圾回收器,java,jvm,開發(fā)語言

2.G1的特點(diǎn)

優(yōu)點(diǎn):
1、支持較大的內(nèi)存。
2、暫停時(shí)間可控。
3、壓縮空間,避免產(chǎn)生內(nèi)存碎片。
4、簡單配置就能達(dá)到很好的性能。
5、內(nèi)存模型方面:G1采用物理分區(qū),邏輯分代,不連續(xù)的內(nèi)存區(qū)域Region組成。而CMS中Eden,Survivor,Old區(qū)是連續(xù)的一整塊內(nèi)存。
6、G1既可以收集年輕代,也可以收集老年代,而CMS只能在老年代使用。
缺點(diǎn):
1、記憶集RSet會(huì)占用比較大的內(nèi)存,因此不建議在小內(nèi)存下使用G1,推薦至少6G。
2、對(duì)CPU的負(fù)載可能會(huì)更大一點(diǎn)。
3、由于采用復(fù)制算法,GC垃圾回收過程對(duì)象復(fù)制轉(zhuǎn)移會(huì)占用較多的內(nèi)存,更容易出現(xiàn)回收失敗(Allocation (Evacuation) Failure)的問題。
4、可能會(huì)降低吞吐量。
雖然 G1收集器的垃圾收集暫停時(shí)間通常要短得多,但應(yīng)用程序吞吐量也往往略低一些。
相當(dāng)于把一次垃圾回收的工作,分開多次進(jìn)行執(zhí)行(主要指老年代),單次暫停的時(shí)間雖然更加可控,但是由于每次垃圾回收的空間會(huì)更少,
總體來說垃圾回收的效率會(huì)更低,暫停的總時(shí)間會(huì)更長,所以吞吐量往往會(huì)略低一些。

3.對(duì)比CMS

CMS的老年代回收采用的是標(biāo)記-清除算法
初始標(biāo)記:標(biāo)記GC root能直接關(guān)聯(lián)的對(duì)象(短暫STW)。
并發(fā)標(biāo)記:GCRootsTracing,從并發(fā)標(biāo)記中的root遍歷,對(duì)不可達(dá)的對(duì)象進(jìn)行標(biāo)記。
重新標(biāo)記:修正并發(fā)標(biāo)記期間因?yàn)橛脩舨僮鲗?dǎo)致標(biāo)記發(fā)生表更的對(duì)象,采用的incremental update算法,會(huì)出現(xiàn)比較多的STW。
并發(fā)清除:由于是直接清理,不涉及對(duì)象的復(fù)制轉(zhuǎn)移,所以階段可以并發(fā)執(zhí)行。

Java虛擬機(jī)(JVM)、垃圾回收器,java,jvm,開發(fā)語言

五、JVM的工具及調(diào)優(yōu)

1、工具

jps:輸出 JVM 中運(yùn)行的進(jìn)程狀態(tài)信息
jstack:生成虛擬機(jī)當(dāng)前時(shí)刻的線程快照
jstat:虛擬機(jī)統(tǒng)計(jì)信息監(jiān)控工具
jinfo:實(shí)時(shí)地查看和調(diào)整虛擬機(jī)各項(xiàng)參數(shù)
jmap:生成虛擬機(jī)的內(nèi)存轉(zhuǎn)儲(chǔ)快照,heapdump 文件
JConsole:可視化管理工具,常用

2、調(diào)優(yōu)

在沒有全面監(jiān)控、收集性能數(shù)據(jù)之前,調(diào)優(yōu)是盲目的(一般項(xiàng)目加個(gè) xms 和 xmx 參數(shù)就夠)。
日常分析 GC 情況優(yōu)化代碼比優(yōu)化 GC 參數(shù)要多得多。一般如下情況不用調(diào)優(yōu)的:
minor GC 單次耗時(shí) < 50ms,頻率 10 秒以上。說明年輕代 OK。
Full GC 單次耗時(shí) < 1 秒,頻率 10 分鐘以上,說明年老代 OK。
GC 調(diào)優(yōu)目的:GC 時(shí)間夠少,GC 次數(shù)夠少。

3、調(diào)優(yōu)建議

-Xms5m 設(shè)置 JVM 初始堆為 5M,-Xmx5m 設(shè)置 JVM 最大堆為 5M。-Xms 跟-Xmx 值一樣時(shí)可以避免每次垃圾回收完成后 JVM 重新分配內(nèi)存。
-Xmn2g:設(shè)置年輕代大小為 2G,一般默認(rèn)為整個(gè)堆區(qū)的 1/3 ~ 1/4。- Xss 每個(gè)線程??臻g設(shè)置。
-XX:SurvivorRatio,設(shè)置年輕代中 Eden 區(qū)與 Survivor 區(qū)的比值,默認(rèn)=8,比值為 8:1:1。
-XX:+HeapDumpOnOutOfMemoryError 當(dāng) JVM 發(fā)生 OOM 時(shí),自動(dòng)生成 DUMP 文件。
-XX:PretenureSizeThreshold 當(dāng)創(chuàng)建的對(duì)象超過指定大小時(shí),直接把對(duì)象分配在老年代。
-XX:MaxTenuringThreshold 設(shè)定對(duì)象在 Survivor 區(qū)最大年齡閾值,超過閾值轉(zhuǎn)移到老年代,默認(rèn) 15。
開啟 GC 日志對(duì)性能影響很小且能幫助我們定位問題,-XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:gc.log

4、JVM 參數(shù)?

參數(shù) ? ? ? ?說明 ? ? ? ? ? ? ? ?實(shí)例
-Xms ? ?初始堆大小,默認(rèn)物理內(nèi)存的1/64 ? ?-Xms512M
-Xmx ? ?最大堆大小,默認(rèn)物理內(nèi)存的1/4 ? ?-Xms2G
-Xmn ? ?新生代內(nèi)存大小,官方推薦為整個(gè)堆的3/8 ? ?-Xmn512M
-Xss ? ?線程堆棧大小,jdk1.5及之后默認(rèn)1M,之前默認(rèn)256k ? ?-Xss512k
-XX:NewRatio=n ? ?設(shè)置新生代和年老代的比值。如:為3,表示年輕代與年老代比值為1:3,年輕代占整個(gè)年輕代年老代和的1/4 ? ?-XX:NewRatio=3
-XX:SurvivorRatio=n ? ?年輕代中Eden區(qū)與兩個(gè)Survivor區(qū)的比值。注意Survivor區(qū)有兩個(gè)。如:8,表示Eden:Survivor=8:1:1,一個(gè)Survivor區(qū)占整個(gè)年輕代的1/8 ? ?-XX:SurvivorRatio=8
-XX:PermSize=n ? ?永久代初始值,默認(rèn)為物理內(nèi)存的1/64 ? ?-XX:PermSize=128M
-XX:MaxPermSize=n ? ?永久代最大值,默認(rèn)為物理內(nèi)存的1/4 ? ?-XX:MaxPermSize=256M
-verbose:class ? ?在控制臺(tái)打印類加載信息
-verbose:gc ? ?在控制臺(tái)打印垃圾回收日志
-XX:+PrintGC ? ?打印GC日志,內(nèi)容簡單
-XX:+PrintGCDetails ? ?打印GC日志,內(nèi)容詳細(xì)
-XX:+PrintGCDateStamps ? ?在GC日志中添加時(shí)間戳
-Xloggc:filename ? ?指定gc日志路徑 ? ?-Xloggc:/data/jvm/gc.log
-XX:+UseSerialGC ? ?年輕代設(shè)置串行收集器Serial
-XX:+UseParallelGC ? ?年輕代設(shè)置并行收集器Parallel Scavenge
-XX:ParallelGCThreads=n ? ?設(shè)置Parallel Scavenge收集時(shí)使用的CPU數(shù)。并行收集線程數(shù)。 ? ?-XX:ParallelGCThreads=4
-XX:MaxGCPauseMillis=n ? ?設(shè)置Parallel Scavenge回收的最大時(shí)間(毫秒) ? ?-XX:MaxGCPauseMillis=100
-XX:GCTimeRatio=n ? ?設(shè)置Parallel Scavenge垃圾回收時(shí)間占程序運(yùn)行時(shí)間的百分比。公式為1/(1+n) ? ?-XX:GCTimeRatio=19
-XX:+UseParallelOldGC ? ?設(shè)置老年代為并行收集器ParallelOld收集器
-XX:+UseConcMarkSweepGC ? ?設(shè)置老年代并發(fā)收集器CMS
-XX:+CMSIncrementalMode ? ?設(shè)置CMS收集器為增量模式,適用于單CPU情況。文章來源地址http://www.zghlxwxcb.cn/news/detail-529233.html

到了這里,關(guān)于Java虛擬機(jī)(JVM)、垃圾回收器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【JVM】13. 垃圾回收器

    2023年05月29日
    瀏覽(25)
  • JVM之垃圾回收器

    JVM之垃圾回收器

    垃圾回收常見面試題: 如何判斷對(duì)象是否死亡。 簡單的介紹一下強(qiáng)引用、軟引用、弱引用、虛引用。虛引用與軟引用和弱引用的區(qū)別、使用軟引用能帶來的好處 如何判斷一個(gè)常量是廢棄常量 如何判斷一個(gè)類是無用的類 垃圾收集有哪些算法,各自的特點(diǎn)? HotSpot 為什么要分

    2024年02月14日
    瀏覽(24)
  • JVM基礎(chǔ)(6)——JVM垃圾回收器簡介

    JVM基礎(chǔ)(6)——JVM垃圾回收器簡介

    作者簡介:大家好,我是smart哥,前中興通訊、美團(tuán)架構(gòu)師,現(xiàn)某互聯(lián)網(wǎng)公司CTO 聯(lián)系qq:184480602,加我進(jìn)群,大家一起學(xué)習(xí),一起進(jìn)步,一起對(duì)抗互聯(lián)網(wǎng)寒冬 學(xué)習(xí)必須往深處挖,挖的越深,基礎(chǔ)越扎實(shí)! 階段1、深入多線程 階段2、深入多線程設(shè)計(jì)模式 階段3、深入juc源碼解析

    2024年01月23日
    瀏覽(26)
  • JVM垃圾回收器G1詳解

    JVM垃圾回收器G1詳解

    在我們應(yīng)用程序所應(yīng)對(duì)的業(yè)務(wù)越來越龐大、復(fù)雜,用戶越來越多,沒有GC就不能保證應(yīng)用程序正常進(jìn)行,而經(jīng)常造成STW的GC又跟不上實(shí)際的需求,我們需要不斷地嘗試對(duì)GC進(jìn)行優(yōu)化。G1(Garbage-First)垃圾回收器是在Java7 update4之后引入的一個(gè)新的垃圾回收器,是當(dāng)今收集器技術(shù)發(fā)

    2024年02月09日
    瀏覽(20)
  • JVM常見的垃圾回收器(詳細(xì))

    JVM常見的垃圾回收器(詳細(xì))

    1、Young為年輕代出發(fā)的垃圾回收器。 2、Old為老觸發(fā)的垃圾回收器。 3、連線代表的是垃圾回收器的組合。CMS 和Serial Old連線代表CMS一旦不行了,Serial Old上場(chǎng)。 1、什么是STW? STW是Stop-The-World縮寫: 是在垃圾回收算法執(zhí)?過程當(dāng)中,將JVM內(nèi)存凍結(jié)丶應(yīng)用程序停頓的?種狀態(tài)。

    2024年02月08日
    瀏覽(30)
  • JVM基礎(chǔ)(8)——CMS垃圾回收器

    JVM基礎(chǔ)(8)——CMS垃圾回收器

    作者簡介:大家好,我是smart哥,前中興通訊、美團(tuán)架構(gòu)師,現(xiàn)某互聯(lián)網(wǎng)公司CTO 聯(lián)系qq:184480602,加我進(jìn)群,大家一起學(xué)習(xí),一起進(jìn)步,一起對(duì)抗互聯(lián)網(wǎng)寒冬 學(xué)習(xí)必須往深處挖,挖的越深,基礎(chǔ)越扎實(shí)! 階段1、深入多線程 階段2、深入多線程設(shè)計(jì)模式 階段3、深入juc源碼解析

    2024年01月16日
    瀏覽(17)
  • 說一下 JVM 有哪些垃圾回收器?

    說一下 JVM 有哪些垃圾回收器?

    如果說垃圾收集算法是內(nèi)存回收的方法論,那么垃圾收集器就是內(nèi)存回收的具體實(shí)現(xiàn)。下圖展示了7種作用于不同分代的收集器,其中用于回收新生代的收集器包括Serial、ParNew、Parallel Scavenge,回收老年代的收集器包括SerialOld、Parallel Old、CMS,還有用于回收整個(gè)Java堆的G1收集器

    2024年02月22日
    瀏覽(20)
  • JVM — JDK11垃圾回收器 ZGC

    JVM — JDK11垃圾回收器 ZGC

    1. ZGC介紹 ZGC(The Z Garbage Collector)是 JDK 11 中推出的一款低延遲垃圾回收器,為實(shí)現(xiàn)以下幾個(gè)目標(biāo)而誕生的垃圾回收器,停頓時(shí)間不超過 10ms,停頓時(shí)間不會(huì)因堆變大而變長,支持 8MB~4TB 級(jí)別的堆(未來支持 16TB) 2. ZGC內(nèi)存和原理 2.1 ZGC內(nèi)存分布 ZGC 與傳統(tǒng)的 CMS、G1 不同、它沒

    2024年02月13日
    瀏覽(21)
  • JVM的組件、自動(dòng)垃圾回收的工作原理、分代垃圾回收過程、可用的垃圾回收器類型

    JVM的組件、自動(dòng)垃圾回收的工作原理、分代垃圾回收過程、可用的垃圾回收器類型

    https://www.processon.com/diagraming/64c8aa11c07d99075d934311 https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html 年輕代是所有新對(duì)象被分配和老化的地方。當(dāng)年輕代填滿時(shí),這會(huì)導(dǎo)致minor garbage collection,minor gc會(huì)回收掉很多的游離對(duì)象。游離的年輕代很快就被收集起來。一些幸存的

    2024年02月14日
    瀏覽(63)
  • 【jvm系列-10】深入理解jvm垃圾回收器的種類以及內(nèi)部的執(zhí)行原理

    【jvm系列-10】深入理解jvm垃圾回收器的種類以及內(nèi)部的執(zhí)行原理

    JVM系列整體欄目 內(nèi)容 鏈接地址 【一】初識(shí)虛擬機(jī)與java虛擬機(jī) https://blog.csdn.net/zhenghuishengq/article/details/129544460 【二】jvm的類加載子系統(tǒng)以及jclasslib的基本使用 https://blog.csdn.net/zhenghuishengq/article/details/129610963 【三】運(yùn)行時(shí)私有區(qū)域之虛擬機(jī)棧、程序計(jì)數(shù)器、本地方法棧 https

    2024年02月05日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包