常见jvm参数配置
垃圾收集器做一個(gè)實(shí)戰(zhàn)的調(diào)優(yōu),你自己可以下去做一個(gè)小實(shí)驗(yàn),以后你要做架構(gòu)師的時(shí)候,生產(chǎn)環(huán)境關(guān)于JVM調(diào)優(yōu)的時(shí)候,一般都是架構(gòu)師去做的,這個(gè)時(shí)候你可以大致的去了解一下,今天會(huì)講到一個(gè)性能測(cè)試工具,JMeter,是用來(lái)測(cè)試HTTP請(qǐng)求的吞吐量的,待會(huì)我也會(huì)說一下吞吐量的一個(gè)意思,我們今天可能會(huì)講到哪些內(nèi)容呢,關(guān)于JVM參數(shù)的一個(gè)調(diào)優(yōu),我們?cè)趺慈ヅ湟粋€(gè)JVM的基本的參數(shù),堆內(nèi)存大小,配置新生代的一個(gè)比例參數(shù),老年代的幾個(gè)參數(shù),做開發(fā)的一般的都會(huì)遇到方法區(qū)異常,還有棧異常,棧溢出的,其實(shí)還是比較常見的,我們?cè)趺醋鲆粋€(gè)參數(shù)的一個(gè)配置,內(nèi)存溢出和內(nèi)存泄露的區(qū)別,因?yàn)楹芏嘣诔鯇W(xué)的時(shí)候,在字面上對(duì)于溢出和泄露,兩個(gè)概念肯定會(huì)搞混淆,內(nèi)存泄露其實(shí)是包含了內(nèi)存溢出的,具體什么意思,講到市面上比較流行的垃圾收集器,串行回收和并行回收,CMS,四種收集器會(huì)詳細(xì)講一下,測(cè)試一個(gè)吞吐量
JVM參數(shù)的配置,這個(gè)有沒有人配過的,配置過一些參數(shù)的,你們沒有遇到過內(nèi)存溢出嗎,遇到內(nèi)存溢出肯定是會(huì)配置內(nèi)存參數(shù)的,調(diào)堆內(nèi)存的一個(gè)大小,其實(shí)JVM參數(shù)調(diào)優(yōu)還是比較重要的,如果你們做到架構(gòu)師的級(jí)別的時(shí)候,基本上生產(chǎn)環(huán)境每臺(tái)服務(wù)器的配置,都是由你來(lái)做的,其實(shí)JVM相關(guān)的參數(shù),有非常非常多,我在這里可能只講比較常用的,你們下次可以研究一下更細(xì)節(jié)的,我只說幾個(gè)比較常見的,第一個(gè)我會(huì)講到-XX:+PrintGC,只要是在我們JAVA運(yùn)行的時(shí)候,你配置這樣一個(gè)JVM參數(shù),當(dāng)它每次GC做一個(gè)回收的時(shí)候,都會(huì)去打印一個(gè)日志,還有一個(gè)是-XX:+UseSerialGC,是專門做串行回收的,串行回收現(xiàn)在一般用的比較少,-XX:+PrintGCDetail是可以更加詳細(xì)的打印一些GC信息,-Xms這個(gè)常用的是起什么作用呢,表示堆初始值,表示我堆內(nèi)存的時(shí)候,我最開始初始的時(shí)候的堆內(nèi)存大小是多少,這是你們以后經(jīng)常會(huì)遇到的,堆的初始值一定要和最大值設(shè)置成相等的,如果不相等的情況下,-Xmx表示配置堆的最大的可用值,表示配置堆的最大的一個(gè)大小,堆內(nèi)存默認(rèn)配置的是4個(gè)G,如果你們沒有配置JVM參數(shù)的話,默認(rèn)是4個(gè)G的,但是有人會(huì)說如果我的電腦是2個(gè)G呢,2個(gè)G的話它就根據(jù)你的實(shí)際內(nèi)存來(lái)定的,因?yàn)樵谖抑白錾a(chǎn)服務(wù)器的時(shí)候,比如我的是8G內(nèi)存,他默認(rèn)就是4個(gè)G,不是8個(gè)G的,還有一個(gè)叫-Xmn,表示新生代的最大可用值,如果新生代一旦滿的情況下,會(huì)發(fā)生這個(gè)GC的,如果新生代滿的情況下,會(huì)產(chǎn)生什么GC,Minor GC,Full GC是會(huì)把新生代和老年代都會(huì)回收的,還有一個(gè)參數(shù),-XX:SuvivorRatio這個(gè)參數(shù)也是用的比較多的,他是配置eden區(qū)和from/to區(qū)的一個(gè)比列大小,eden區(qū)一般比f(wàn)rom大兩倍,相當(dāng)于eden區(qū)占兩份,from/to占一份,還有一個(gè)參數(shù)-XX:NewRatio=2主要是配置新生代和老年代的一個(gè)占比,這個(gè)幾個(gè)參數(shù)你們可以記下了,配置垃圾收集器,G1,還有CMS,在做JVM配置的時(shí)候,初始值一定和要最大值相等,如果不等的情況下,如果我現(xiàn)在的堆初始值是10,最大值是512M,這樣的話會(huì)有什么問題呢,就會(huì)產(chǎn)生垃圾回收機(jī)制不停的在回收,因?yàn)槲业目臻g太小了,不停的申請(qǐng),不停的回收,不停的去申請(qǐng)內(nèi)存,這個(gè)一定要相等的,不要配置初始值是0M,然后堆的最大值是512M,這樣的話性能是不好的,減少垃圾回收的次數(shù),垃圾回收的時(shí)候如果每次都在回收的情況下,這個(gè)時(shí)候其他的工作線程是會(huì)停頓一段時(shí)間的,但是我們?nèi)藶榈目床怀鰜?lái),這個(gè)時(shí)候我們都是看不出來(lái)的,為什么看不出來(lái)呢,有的時(shí)候是因?yàn)槟愕姆?wù)器配置太好了,他的回收可能不是很頻繁,所以對(duì)整個(gè)程序影響不大,如果你的初始值和堆內(nèi)存配置不大的情況下,這個(gè)時(shí)候垃圾回收機(jī)制不停的回收的情況下,這樣會(huì)導(dǎo)致程序會(huì)一直停下,運(yùn)行一下,停一下,這樣對(duì)應(yīng)用程序不好的,本身垃圾回收機(jī)制會(huì)導(dǎo)致其他線程暫停的,為什么暫停呢,如果說你不暫停的情況下,如果又產(chǎn)生新的垃圾呢,那我怎么去回收呢,所以他這么做的目的,保證回收的時(shí)候稍微干凈一點(diǎn),這是我要講的第一個(gè)原則,第二個(gè)原則是什么呢,一定要把新生代堆的空間,一定要比老年代要小,垃圾回收器回收的時(shí)候,盡量在新生代里做回收,不要在老年代做回收,老年代的對(duì)象已經(jīng)經(jīng)歷過很多考驗(yàn)了,基本上都是經(jīng)歷過15次的考驗(yàn),如果非常成熟的情況下,會(huì)從eden區(qū)晉升到from區(qū)或者to區(qū),然后到老年代里面去,這樣他是非常穩(wěn)定的,為什么要垃圾回收到新生代回收呢,新生代的對(duì)象可能一次之后就不再使用了,所以要把新生代的比列稍微小一點(diǎn),什么時(shí)候垃圾回收機(jī)制會(huì)頻繁回收呢,就是我的空間比較小的情況下,他的回收次數(shù)比較多,如果在生產(chǎn)環(huán)境的時(shí)候,你會(huì)發(fā)現(xiàn)好多公司怎么配的,一般把新生代配置為1:2,就是新生代占比1份,老年代占比2份,這樣的話,我新生代占比越小的情況下,垃圾回收機(jī)制就可能越頻繁,如果老年代占比越大的情況下,垃圾回收機(jī)制就可能不會(huì)那么頻繁去回收,這樣的話對(duì)整個(gè)性能就會(huì)非常好,大體回收原則
常見參數(shù)配置
-XX:+PrintGC 每次觸發(fā)GC的時(shí)候打印相關(guān)日志
-XX:+UseSerialGC 串行回收
-XX:+PrintGCDetails 更詳細(xì)的GC日志
-Xms 堆初始值
-Xmx 堆最大可用值
-Xmn 新生代堆最大可用值
-XX:SurvivorRatio 用來(lái)設(shè)置新生代中eden空間和from/to空間的比例.
-XX:NewRatio 配置新生代與老年代占比 1:2
含以-XX:SurvivorRatio=eden/from=den/to
總結(jié):在實(shí)際工作中,我們可以直接將初始的堆大小與最大堆大小相等,
這樣的好處是可以減少程序運(yùn)行時(shí)垃圾回收次數(shù),從而提高效率。
-XX:SurvivorRatio 用來(lái)設(shè)置新生代中eden空間和from/to空間的比例.
?
總結(jié)
- 上一篇: Java内存结构与垃圾回收机制算法分析
- 下一篇: 配置jvm堆最大内存eden区与s0或者