一、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)性。
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。
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ì)加載。
三、JVM的內(nèi)存模型

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)
四、垃圾回收
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ì)象)的引用連來判斷是否為垃圾。
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ì)象。
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ù)的。
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è)收集器線程并行完成。
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í)行。
五、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文章來源:http://www.zghlxwxcb.cn/news/detail-529233.html
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)!