日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

深入理解JVM(三)——配置参数

發(fā)布時(shí)間:2024/4/14 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入理解JVM(三)——配置参数 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

JVM配置參數(shù)分為三類(lèi)參數(shù):

1、跟蹤參數(shù)

2、堆分配參數(shù)

3、棧分配參數(shù)

這三類(lèi)參數(shù)分別用于跟蹤監(jiān)控JVM狀態(tài),分配堆內(nèi)存以及分配棧內(nèi)存。

在eclipse根目錄下的eclipse.ini配置文件中添加參數(shù)(其他編譯器,可以類(lèi)似操作)。

跟蹤參數(shù)

跟蹤參數(shù)用于跟蹤監(jiān)控JVM,往往被開(kāi)發(fā)人員用于JVM調(diào)優(yōu)以及故障排查。

1、當(dāng)發(fā)生GC時(shí),打印GC簡(jiǎn)要信息

使用-XX:+PrintGC或-verbose:gc參數(shù)

這兩個(gè)配置參數(shù)效果是一樣的,都是在發(fā)生GC時(shí)打印出簡(jiǎn)要的信息,例如執(zhí)行代碼:

/*** 這個(gè)程序連續(xù)創(chuàng)建了100個(gè)1M的數(shù)組對(duì)象**/ public class GCDemo {public static void main(String[] args) {byte[] bytes =null;for(int i=0;i<100;i++){bytes = new byte[1 * 1024 * 1024];}} }

使用-XX:+PrintGC或-verbose:gc參數(shù)執(zhí)行該程序,即可查看到GC情況:

1: [GC (Allocation Failure) 32686K->1648K(123904K), 0.0007230 secs] 2: [GC (Allocation Failure) 34034K->1600K(123904K), 0.0009652 secs] 3: [GC (Allocation Failure) 33980K->1632K(123904K), 0.0005306 secs]

可以看到程序執(zhí)行了3次GC(minor GC),這三次GC都是新生代的GC,因?yàn)檫@個(gè)程序每次創(chuàng)建新的數(shù)組對(duì)象,都會(huì)把新的對(duì)象賦給bytes變量,而老的對(duì)象沒(méi)有任意對(duì)象引用它,老對(duì)象會(huì)變的不可達(dá),這些不可達(dá)的對(duì)象在新生代minor GC時(shí)候被回收掉。

32686K表示回收前,對(duì)象占用空間。1648K表示回收后,對(duì)象占用空間。123904K表示還有多少空間可用。0.0007230 secs表示這次垃圾回收花的時(shí)間。

2、打印GC的詳細(xì)信息以及堆使用詳細(xì)信息

使用-XX:+PrintGCDetails參數(shù)

1: [GC (Allocation Failure) [PSYoungGen: 32686K->1656K(37888K)] 32686K->1664K(123904K), 0.0342788 secs] [Times: user=0.00 sys=0.00, real=0.03 secs] 2: [GC (Allocation Failure) [PSYoungGen: 34042K->1624K(70656K)] 34050K->1632K(156672K), 0.0013466 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 3: Heap 4: PSYoungGen total 70656K, used 43118K [0x00000000d6100000, 0x00000000dab00000, 0x0000000100000000)5: eden space 65536K, 63% used [0x00000000d6100000,0x00000000d8985ac8,0x00000000da100000) 6: from space 5120K, 31% used [0x00000000da600000,0x00000000da796020,0x00000000dab00000) 7: to space 5120K, 0% used [0x00000000da100000,0x00000000da100000,0x00000000da600000) 8: ParOldGen total 86016K, used 8K [0x0000000082200000, 0x0000000087600000, 0x00000000d6100000) 9: object space 86016K, 0% used [0x0000000082200000,0x0000000082202000,0x0000000087600000) 10: Metaspace used 2669K, capacity 4486K, committed 4864K, reserved 1056768K 11: class space used 288K, capacity 386K, committed 512K, reserved 1048576K

可以看到除了打印GC信息之外,還顯示了堆使用情況,堆分為新生代、老年代、元空間。注意這里沒(méi)有永久區(qū)了,永久區(qū)在java8已經(jīng)移除,原來(lái)放在永久區(qū)的常量、字符串靜態(tài)變量都移到了元空間,并使用本地內(nèi)存。

新生代當(dāng)中又分為伊甸區(qū)(eden)和幸存區(qū)(from和to),從上面打印的內(nèi)容可以看到新生代總大小為70656K,使用了43118K,細(xì)心的同學(xué)的可能會(huì)發(fā)現(xiàn)eden+from+to=65536K+5120K+5120K=75776 并不等于總大小70656K,這是為什么呢?這是因?yàn)樾律睦厥账惴ㄊ遣捎脧?fù)制算法,簡(jiǎn)單的說(shuō)就是在from和to之間來(lái)回復(fù)制(復(fù)制過(guò)程中再把不可達(dá)的對(duì)象回收掉),所以必須保證其中一個(gè)區(qū)是空的,這樣才能有預(yù)留空間存放復(fù)制過(guò)來(lái)的數(shù)據(jù),所以新生代的總大小其實(shí)等于eden+from(或to)=65536K+5120K=70656k。

3、使用外部文件記錄GC的日志

還有一個(gè)非常有用的參數(shù),它可以把GC的日志記錄到外部文件中,這在生產(chǎn)環(huán)境進(jìn)行故障排查時(shí)尤為重要,當(dāng)java程序出現(xiàn)OOM時(shí),總希望看到當(dāng)時(shí)垃圾回收的情況,通過(guò)這個(gè)參數(shù)就可以把GC的日志記錄下來(lái),便于排查問(wèn)題,當(dāng)然也可以做日常JVM監(jiān)控。

-Xloggc:log/gc.log

4、監(jiān)控類(lèi)的加載

-XX:+TraceClassLoading

使用這個(gè)參數(shù)可以監(jiān)控java程序加載的類(lèi):

堆配置參數(shù)

指定最大堆,最小堆:Xmx、Xms

這兩個(gè)參數(shù)是我們最熟悉最常用的參數(shù),可以用以下代碼打印出目前內(nèi)存使用的情況:

public static void main(String[] args) { System.out.println("最大堆:"+Runtime.getRuntime().maxMemory()/1024/1024+"M"); System.out.println("空閑堆:"+Runtime.getRuntime().freeMemory()/1024/1024+"M"); System.out.println("總的堆:"+Runtime.getRuntime().totalMemory()/1024/1024+"M"); }

最大堆也就是Xmx參數(shù)指定的大小,表示java程序最大能使用多少內(nèi)存大小,如果超過(guò)這個(gè)大小,那么java程序會(huì)報(bào):out of memory(OOM錯(cuò)誤),空閑堆表示程序已經(jīng)分配的內(nèi)存大小減去已經(jīng)使用的內(nèi)存大小,而總的堆表示目前程序已經(jīng)配置到多少內(nèi)存大小,一般而言程序一啟動(dòng),會(huì)按照-Xms5m先分配5M的空間,這時(shí)總的堆大小就是5M。

指定新生代內(nèi)存大小:Xmn,例如指定-Xmx20m -Xms5m -Xmn2m -XX:+PrintGCDetails

1: 最大堆:19.5M 2: 空閑堆:4.720428466796875M 3: 總的堆:5.5M 4: Heap 5: PSYoungGen total 1536K, used 819K [0x00000000ffe00000, 0x0000000100000000, 0x0000000100000000) 6: eden space 1024K, 79% used [0x00000000ffe00000,0x00000000ffeccc80,0x00000000fff00000) 7: from space 512K, 0% used [0x00000000fff80000,0x00000000fff80000,0x0000000100000000) 8: to space 512K, 0% used [0x00000000fff00000,0x00000000fff00000,0x00000000fff80000) 9: ParOldGen total 4096K, used 0K [0x00000000fec00000, 0x00000000ff000000, 0x00000000ffe00000) 10: object space 4096K, 0% used [0x00000000fec00000,0x00000000fec00000,0x00000000ff000000) 11: Metaspace used 2723K, capacity 4486K, committed 4864K, reserved 1056768K 12: class space used 293K, capacity 386K, committed 512K, reserved 1048576K

可以看到新生代總大小為eden+from+to=1024k+512k+512k=2M,和設(shè)置的-Xmn相對(duì)應(yīng)。

新生代(eden+from+to)和老年代(不包含永久區(qū))的比值:-XX:NewRatio

例如設(shè)置參數(shù):-Xmx20m -Xms20m -XX:NewRatio=4 -XX:+PrintGCDetails(注意這里改參數(shù)為4表示新生代和老年代比值為1:4)

1: 最大堆:19.5M 2: 空閑堆:8.665084838867188M 3: 總的堆:19.5M 4: Heap 5: PSYoungGen total 3584K, used 916K [0x00000000ffc00000, 0x0000000100000000, 0x0000000100000000) 6: eden space 3072K, 29% used [0x00000000ffc00000,0x00000000ffce52f8,0x00000000fff00000) 7: from space 512K, 0% used [0x00000000fff80000,0x00000000fff80000,0x0000000100000000) 8: to space 512K, 0% used [0x00000000fff00000,0x00000000fff00000,0x00000000fff80000) 9: ParOldGen total 16384K, used 10240K [0x00000000fec00000, 0x00000000ffc00000, 0x00000000ffc00000) 10: object space 16384K, 62% used [0x00000000fec00000,0x00000000ff600010,0x00000000ffc00000) 11: Metaspace used 2723K, capacity 4486K, committed 4864K, reserved 1056768K 12: class space used 293K, capacity 386K, committed 512K, reserved 1048576K

可以看到新生代:eden+from+to=3072+512+512=4096k,老年代:16384k,新生代:老年代=4096k:16384k=1:4 和-XX:NewRatio=4吻合。

Eden區(qū)與Survivor區(qū)(from、to)的大小比值:-XX:SurvivorRatio(如設(shè)置為8,則兩個(gè)Survivor區(qū)與一個(gè)Eden區(qū)的比值為2:8,一個(gè)Survivor區(qū)占整個(gè)年輕代的1/10)

例如設(shè)置參數(shù)-Xmx20m -Xms20m -Xmn8m -XX:SurvivorRatio=6 -XX:+PrintGCDetails

這個(gè)參數(shù)設(shè)置了新生代內(nèi)存大小為8m,并設(shè)置Survivor區(qū)與一個(gè)Eden區(qū)的比值為2:6,來(lái)看看打印信息:

1: 最大堆:19.0M 2: 空閑堆:8.104576110839844M 3: 總的堆:19.0M 4: Heap 5: PSYoungGen total 7168K, used 1040K [0x00000000ff800000, 0x0000000100000000, 0x0000000100000000) 6: eden space 6144K, 16% used [0x00000000ff800000,0x00000000ff904090,0x00000000ffe00000) 7: from space 1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000) 8: to space 1024K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000) 9: ParOldGen total 12288K, used 10240K [0x00000000fec00000, 0x00000000ff800000, 0x00000000ff800000) 10: object space 12288K, 83% used [0x00000000fec00000,0x00000000ff600010,0x00000000ff800000) 11: Metaspace used 2723K, capacity 4486K, committed 4864K, reserved 1056768K 12: class space used 293K, capacity 386K, committed 512K, reserved 1048576K

Survivor區(qū)=from+to=2048,Eden區(qū)=6144K,Survivor區(qū):Eden區(qū)=2:6,和-XX:SurvivorRatio=6吻合。

其他還有-XX:+HeapDumpOnOutOfMemoryError、-XX:+HeapDumpPath這兩個(gè)參數(shù)可以實(shí)現(xiàn)在發(fā)生OOM異常時(shí)把堆棧信息打印到外部文件。

堆分配參數(shù)的總結(jié)

根據(jù)實(shí)際事情調(diào)整新生代和幸存代的大小

官方推薦新生代占堆的3/8

幸存代占新生代的1/10

在OOM時(shí),記得Dump出堆,確保可以排查現(xiàn)場(chǎng)問(wèn)題

永久區(qū)分配參數(shù)

-XX:PermSize -XX:MaxPermSize

用于設(shè)置永久區(qū)的初始空間和最大空間,他們表示一個(gè)系統(tǒng)可以容納多少個(gè)類(lèi)型,一般空間比較小。在java1.8以后,永久區(qū)被移到了元數(shù)據(jù)區(qū),使用本地內(nèi)存,所以這兩個(gè)參數(shù)也不建議再使用。

棧大小分配參數(shù)

棧大小參數(shù)為-Xss,通常只有幾百k,決定了函數(shù)調(diào)用的深度,每個(gè)線程都有自己獨(dú)立的棧空間。如果函數(shù)調(diào)用太深,超過(guò)了棧的大小,則會(huì)拋出java.lang.StackOverflowError,通常遇到這種錯(cuò)誤,不是去調(diào)整-Xss參數(shù),而是應(yīng)該去調(diào)查函數(shù)調(diào)用太深的原理,是否使用遞歸,能不能保證遞歸出口等。

小結(jié)

本文講解了JVM常用的參數(shù),涉及跟蹤、堆、永久區(qū)、棧的分配,其中最重要最常用的是跟蹤、堆的分配參數(shù),他們也和調(diào)優(yōu)、故障排查息息相關(guān)。

附加:

JVM的GC日志的主要參數(shù)包括如下幾個(gè):

-XX:+PrintGC 輸出GC日志

-XX:+PrintGCDetails 輸出GC的詳細(xì)日志

-XX:+PrintGCTimeStamps 輸出GC的時(shí)間戳(以基準(zhǔn)時(shí)間的形式)

-XX:+PrintGCDateStamps 輸出GC的時(shí)間戳(以日期的形式,如?2013-05-04T21:53:59.234+0800)

-XX:+PrintHeapAtGC 在進(jìn)行GC的前后打印出堆的信息

-Xloggc:../logs/gc.log 日志文件的輸出路徑

?

轉(zhuǎn)載于:https://my.oschina.net/u/3822522/blog/1806010

總結(jié)

以上是生活随笔為你收集整理的深入理解JVM(三)——配置参数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。