營(yíng)銷型網(wǎng)站建設(shè)極速建站seo推廣軟件排行榜前十名
文章目錄
- 1、JVM參數(shù)有哪些?
- 1.1、 標(biāo)準(zhǔn)參數(shù)
- 1.2、-X參數(shù)
- 1.3、 -XX參數(shù)
- 1.4、 其他參數(shù)
- 1.5、 查看參數(shù)
- 1.6、 設(shè)置參數(shù)的常見方式
- 1.7、 常用參數(shù)含義
- 2、JVM常用命令有哪些?
- 2.1、jps
- 2.2、jinfo
- 2.3、jstat
- 2.4、jstack
- 2.5、jmap
- 3、你會(huì)估算GC頻率嗎?
- 4、 內(nèi)存溢出(OOM)怎么解決?
- 4.1、大并發(fā)[秒殺]
- 4.2、內(nèi)存泄露導(dǎo)致內(nèi)存溢出
1、JVM參數(shù)有哪些?
1.1、 標(biāo)準(zhǔn)參數(shù)
-version
-help
-server
-cp
1.2、-X參數(shù)
-Xint 解釋執(zhí)行
-Xcomp 第一次使用就編譯成本地代碼
-Xmixed 混合模式,JVM自己來(lái)決定
1.3、 -XX參數(shù)
使用得最多的參數(shù)類型,主要用于JVM調(diào)優(yōu)和Debug
a.Boolean類型
格式:-XX:[+-]<name> +或-表示啟用或者禁用name屬性
比如:-XX:+UseConcMarkSweepGC 表示啟用CMS類型的垃圾回收器-XX:+UseG1GC 表示啟用G1類型的垃圾回收器
b.非Boolean類型
格式:-XX<name>=<value>表示name屬性的值是value
比如:-XX:MaxGCPauseMillis=500
1.4、 其他參數(shù)
這塊也相當(dāng)于是-XX類型的參數(shù)
-Xms1000M等價(jià)于-XX:InitialHeapSize=1000M
-Xmx1000M等價(jià)于-XX:MaxHeapSize=1000M
-Xss100等價(jià)于-XX:ThreadStackSize=100
1.5、 查看參數(shù)
java -XX:+PrintFlagsFinal -version > flags.txt
值得注意的是"=“表示默認(rèn)值,”:="表示被用戶或JVM修改后的值
一般要設(shè)置參數(shù),可以先查看一下當(dāng)前參數(shù)是什么,然后進(jìn)行修改
1.6、 設(shè)置參數(shù)的常見方式
- 開發(fā)工具中設(shè)置比如IDEA,eclipse
- 運(yùn)行jar包的時(shí)候:java -XX:+UseG1GC xxx.jar
- web容器比如tomcat,可以在腳本中的進(jìn)行設(shè)置
- 通過(guò)jinfo實(shí)時(shí)調(diào)整某個(gè)java進(jìn)程的參數(shù)(參數(shù)只有被標(biāo)記為manageable的flags可以被實(shí)時(shí)修改)
1.7、 常用參數(shù)含義
參數(shù) | 含義 | 說(shuō)明 |
---|---|---|
-XX:CICompilerCount=3 | 最大并行編譯數(shù) | 如果設(shè)置大于1,雖然編譯速度會(huì)提高,但是同樣影響系統(tǒng)穩(wěn)定性,會(huì)增加JVM崩潰的可能 |
-XX:InitialHeapSize=100M | 初始化堆大小 | 簡(jiǎn)寫-Xms100M |
-XX:MaxHeapSize=100M | 最大堆大小 | 簡(jiǎn)寫-Xms100M |
-XX:NewSize=20M | 設(shè)置年輕代的大小 | |
-XX:MaxNewSize=50M | 年輕代最大大小 | |
-XX:OldSize=50M | 設(shè)置老年代大小 | |
-XX:MetaspaceSize=50M | 設(shè)置方法區(qū)大小 | |
-XX:MaxMetaspaceSize=50M | 方法區(qū)最大大小 | |
-XX:+UseParallelGC | 使用UseParallelGC | 新生代,吞吐量?jī)?yōu)先 |
-XX:+UseParallelOldGC | 使用UseParallelOldGC | 老年代,吞吐量?jī)?yōu)先 |
-XX:+UseConcMarkSweepGC | 使用CMS | 老年代,停頓時(shí)間優(yōu)先 |
-XX:+UseG1GC | 使用G1GC | 新生代,老年代,停頓時(shí)間優(yōu)先 |
-XX:NewRatio | 新老生代的比值 | 比如-XX:Ratio=4,則表示新生代:老年代=1:4,也就是新生代占整個(gè)堆內(nèi)存的1/5 |
-XX:SurvivorRatio | 兩個(gè)S區(qū)和Eden區(qū)的比值 | 比如-XX:SurvivorRatio=8,也就是(S0+S1):Eden=2:8,也就是一個(gè)S占整個(gè)新生代的1/10 |
-XX:+HeapDumpOnOutOfMemoryError | 啟動(dòng)堆內(nèi)存溢出打印 | 當(dāng)JVM堆內(nèi)存發(fā)生溢出時(shí),也就是OOM,自動(dòng)生成dump文件 |
-XX:HeapDumpPath=heap.hprof | 指定堆內(nèi)存溢出打印目錄 | 表示在當(dāng)前目錄生成一個(gè)heap.hprof文件 |
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:g1-gc.log | 打印出GC日志 | 可以使用不同的垃圾收集器,對(duì)比查看GC情況 |
-Xss128k | 設(shè)置每個(gè)線程的堆棧大小 | 經(jīng)驗(yàn)值是3000-5000最佳 |
-XX:MaxTenuringThreshold=6 | 提升年老代的最大臨界值 | 默認(rèn)值為 15 |
-XX:InitiatingHeapOccupancyPercent | 啟動(dòng)并發(fā)GC周期時(shí)堆內(nèi)存使用占比 | G1之類的垃圾收集器用它來(lái)觸發(fā)并發(fā)GC周期,基于整個(gè)堆的使用率,而不只是某一代內(nèi)存的使用比. 值為 0 則表示”一直執(zhí)行GC循環(huán)”. 默認(rèn)值為 45. |
-XX:G1HeapWastePercent | 允許的浪費(fèi)堆空間的占比 | 默認(rèn)是10%,如果并發(fā)標(biāo)記可回收的空間小于10%,則不會(huì)觸發(fā)MixedGC。 |
-XX:MaxGCPauseMillis=200ms | G1最大停頓時(shí)間 | 暫停時(shí)間不能太小,太小的話就會(huì)導(dǎo)致出現(xiàn)G1跟不上垃圾產(chǎn)生的速度。最終退化成Full GC。所以對(duì)這個(gè)參數(shù)的調(diào)優(yōu)是一個(gè)持續(xù)的過(guò)程,逐步調(diào)整到最佳狀態(tài)。 |
-XX:ConcGCThreads=n | 并發(fā)垃圾收集器使用的線程數(shù)量 | 默認(rèn)值隨JVM運(yùn)行的平臺(tái)不同而不同 |
-XX:G1MixedGCLiveThresholdPercent=65 | 混合垃圾回收周期中要包括的舊區(qū)域設(shè)置占用率閾值 | 默認(rèn)占用率為 65% |
-XX:G1MixedGCCountTarget=8 | 設(shè)置標(biāo)記周期完成后,對(duì)存活數(shù)據(jù)上限為 G1MixedGCLIveThresholdPercent 的舊區(qū)域執(zhí)行混合垃圾回收的目標(biāo)次數(shù) | 默認(rèn)8次混合垃圾回收,混合回收的目標(biāo)是要控制在此目標(biāo)次數(shù)以內(nèi) |
-XX:G1OldCSetRegionThresholdPercent=1 | 描述Mixed GC時(shí),Old Region被加入到CSet中 | 默認(rèn)情況下,G1只把10%的Old Region加入到CSet中 |
2、JVM常用命令有哪些?
2.1、jps
查看java進(jìn)程
2.2、jinfo
實(shí)時(shí)查看和調(diào)整JVM配置參數(shù)
# 查看某個(gè)java進(jìn)程屬性的值
jinfo -flag MaxHeapSize PID
jinfo -flag UseG1GC PID
# 參數(shù)只有被標(biāo)記為manageable的flags可以被實(shí)時(shí)修改
jinfo -flag [+|-] PID
jinfo -flag <name>=<value> PID
# 查看曾經(jīng)賦過(guò)值的一些參數(shù)
jinfo -flags PID
2.3、jstat
查看虛擬機(jī)性能統(tǒng)計(jì)信息
# 查看類裝載信息 每1000毫秒輸出一次,共輸出10次
jstat -class PID 1000 10
# 查看垃圾收集信息
jstat -gc PID 1000 10
2.4、jstack
查看線程堆棧信息
jstack PID
排查死鎖案例
//運(yùn)行主類
public class DeadLockDemo
{public static void main(String[] args){DeadLock d1=new DeadLock(true);DeadLock d2=new DeadLock(false);Thread t1=new Thread(d1);Thread t2=new Thread(d2);t1.start();t2.start();}
}
//定義鎖對(duì)象
class MyLock{public static Object obj1=new Object();public static Object obj2=new Object();
}
//死鎖代碼
class DeadLock implements Runnable{private boolean flag;DeadLock(boolean flag){this.flag=flag;}public void run() {if(flag) {while(true) {synchronized(MyLock.obj1) {System.out.println(Thread.currentThread().getName()+"----if獲得obj1鎖");synchronized(MyLock.obj2) {System.out.println(Thread.currentThread().getName()+"----if獲得obj2鎖");}}}}else {while(true){synchronized(MyLock.obj2) {System.out.println(Thread.currentThread().getName()+"----否則獲得obj2鎖");synchronized(MyLock.obj1) {System.out.println(Thread.currentThread().getName()+"----否則獲得obj1鎖");}}}}}
}
jstack分析
把打印信息拉到最后可以發(fā)現(xiàn)1個(gè)死鎖信息。
2.5、jmap
# 打印出堆內(nèi)存相關(guān)信息
jmap -heap PID
# 生成堆快照
jmap -dump:format=b,file=heap.hprof PID
一般在開發(fā)中,JVM參數(shù)可以加上下面兩句,這樣內(nèi)存溢出時(shí),會(huì)自動(dòng)dump出該文件
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.hprof
3、你會(huì)估算GC頻率嗎?
正常情況我們應(yīng)該根據(jù)我們的系統(tǒng)來(lái)進(jìn)行一個(gè)內(nèi)存的估算,這個(gè)我們可以在測(cè)試環(huán)境進(jìn)行測(cè)試,最開始可以將內(nèi)存設(shè)置的大一些,比如4G這樣,當(dāng)然這也可以根據(jù)業(yè)務(wù)系統(tǒng)估算來(lái)的。
比如從數(shù)據(jù)庫(kù)獲取一條數(shù)據(jù)占用128個(gè)字節(jié),需要獲取1000條數(shù)據(jù),那么一次讀取到內(nèi)存的大小就是((128 B/1024 Kb/1024M)* 1000 = 0.122M,那么我們程序可能需要并發(fā)讀取,比如每秒讀取100次,那么內(nèi)存占用就是0.122100 = 12.2M,如果堆內(nèi)存設(shè)置1個(gè)G,那么年輕代大小大約就是333M,那么333M*80%/12.2M =21.84s,也就是說(shuō)我們的程序幾乎每分鐘進(jìn)行兩到三次youngGC。這樣可以讓我們對(duì)系統(tǒng)有一個(gè)大致的估算。
4、 內(nèi)存溢出(OOM)怎么解決?
發(fā)生內(nèi)存溢出一般會(huì)有兩個(gè)原因:
- 內(nèi)存不夠用:大并發(fā)情況下
- 代碼問(wèn)題:內(nèi)存泄露導(dǎo)致內(nèi)存溢出
4.1、大并發(fā)[秒殺]
緩存、CDN、集群+負(fù)載均衡、限流等方式解決
4.2、內(nèi)存泄露導(dǎo)致內(nèi)存溢出
-
jstack查看線程情況,有沒有死鎖或者IO阻塞的情況,查找可能出現(xiàn)問(wèn)題的類名或等待時(shí)間最長(zhǎng)的進(jìn)程號(hào)。
jstack PID
-
查看堆內(nèi)存的使用,獲取到j(luò)vm.hprof文件,上傳到指定的工具分析,比如heaphero.io
jmap -heap PID