十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
典型JVM參數(shù)設(shè)置: java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -Xmx3550m:設(shè)置JVM最大可用內(nèi)存為3550M。 -Xms3550m:設(shè)置JVM促使內(nèi)存為3550m。此值可以設(shè)置與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配內(nèi)存。 -Xmn2g:設(shè)置年輕代大小為2G。整個堆大小=年輕代大小 + 年老代大小 + 持久代大小。持久代一般固定大小為64m,所以增大年輕代后,將會減小年老代大小。此值對系統(tǒng)性能影響較大,Sun官方推薦配置為整個堆的3/8。 -Xss128k:設(shè)置每個線程的堆棧大小。JDK5.0以后每個線程堆棧大小為1M,以前每個線程堆棧大小為256K。更具應(yīng)用的線程所需內(nèi)存大小進行調(diào)整。在相同物理內(nèi)存下,減小這個值能生成更多的線程。但是操作系統(tǒng)對一個進程內(nèi)的線程數(shù)還是有限制的,不能無限生成,經(jīng)驗值在3000~5000左右。java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0 -XX:NewRatio=4:設(shè)置年輕代(包括Eden和兩個Survivor區(qū))與年老代的比值(除去持久代)。設(shè)置為4,則年輕代與年老代所占比值為1:4,年輕代占整個堆棧的1/5 -XX:SurvivorRatio=4:設(shè)置年輕代中Eden區(qū)與Survivor區(qū)的大小比值。設(shè)置為4,則兩個Survivor區(qū)與一個Eden區(qū)的比值為2:4,一個Survivor區(qū)占整個年輕代的1/6 -XX:MaxPermSize=16m:設(shè)置持久代大小為16m。 -XX:MaxTenuringThreshold=0:設(shè)置垃圾最大年齡。如果設(shè)置為0的話,則年輕代對象不經(jīng)過Survivor區(qū),直接進入年老代。對于年老代比較多的應(yīng)用,可以提高效率。如果將此值設(shè)置為一個較大值,則年輕代對象會在Survivor區(qū)進行多次復(fù)制,這樣可以增加對象再年輕代的存活時間,增加在年輕代即被回收的概論。
站在用戶的角度思考問題,與客戶深入溝通,找到萬柏林網(wǎng)站設(shè)計與萬柏林網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站設(shè)計、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名與空間、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋萬柏林地區(qū)。
32位的java虛擬機最多支持1.5G的內(nèi)存,也就是1500M。你最小內(nèi)存設(shè)為512M沒有問題,最大值也是512M就有點小了。如果程序夠用就罷了,如果程序使用內(nèi)存多,那么512M可能不夠。建議把最大內(nèi)存設(shè)的大一些如800M或1200M更保險。現(xiàn)在隨便一臺機器的內(nèi)存都4G多。而java一般跑在服務(wù)器上的,分配內(nèi)存不用太吝嗇。
JVM是最好的軟件工程之一,它為Java提供了堅實的基礎(chǔ),許多流行語言如Kotlin、Scala、Clojure、Groovy都使用JVM作為運行基礎(chǔ)。一個專業(yè)的Java工程師必須要了解并掌握J(rèn)VM,接下來就給大家分享Java基礎(chǔ)知識中JVM調(diào)優(yōu)相關(guān)知識點。
杭州Java基礎(chǔ)知識學(xué)習(xí)之JVM調(diào)優(yōu)講解
JVM常見的調(diào)優(yōu)參數(shù)包括:
-Xmx:指定java程序的最大堆內(nèi)存, 使用java -Xmx5000M -version判斷當(dāng)前系統(tǒng)能分配的最大堆內(nèi)存;
-Xms:指定最小堆內(nèi)存, 通常設(shè)置成跟最大堆內(nèi)存一樣,減少GC;
-Xmn:設(shè)置年輕代大小。整個堆大小=年輕代大小+年老代大小。所以增大年輕代后,將會減小年老代大小。此值對系統(tǒng)性能影響較大,Sun官方推薦配置為整個堆的3/8;
-Xss:指定線程的最大??臻g, 此參數(shù)決定了java函數(shù)調(diào)用的深度, 值越大調(diào)用深度越深, 若值太小則容易出棧溢出錯誤(StackOverflowError);
-XX:PermSize:指定方法區(qū)(永久區(qū))的初始值,默認(rèn)是物理內(nèi)存的1/64,在Java8永久區(qū)移除, 代之的是元數(shù)據(jù)區(qū),由-XX:MetaspaceSize指定;
-XX:MaxPermSize:指定方法區(qū)的最大值, 默認(rèn)是物理內(nèi)存的1/4,在java8中由-XX:MaxMetaspaceSize指定元數(shù)據(jù)區(qū)的大??;
-XX:NewRatio=n:年老代與年輕代的比值,-XX:NewRatio=2, 表示年老代與年輕代的比值為2:1;
-XX:SurvivorRatio=n:Eden區(qū)與Survivor區(qū)的大小比值,-XX:SurvivorRatio=8表示Eden區(qū)與Survivor區(qū)的大小比值是8:1:1,因為Survivor區(qū)有兩個(from, to)。
JVM實質(zhì)上分為三大塊,年輕代(YoungGen),年老代(Old Memory),及持久代(Perm,在Java8中被取消)。
年輕代大小選擇
響應(yīng)時間優(yōu)先的應(yīng)用:盡可能設(shè)大,直到接近系統(tǒng)的最低響應(yīng)時間限制(根據(jù)實際情況選擇)。在此種情況下,年輕代收集發(fā)生的頻率也是最小的。同時,減少到達年老代的對象。
吞吐量優(yōu)先的應(yīng)用:盡可能的設(shè)置大,可能到達Gbit的程度。因為對響應(yīng)時間沒有要求,垃圾收集可以并行進行,一般適合8CPU以上的應(yīng)用。
年老代大小選擇
響應(yīng)時間優(yōu)先的應(yīng)用:年老代使用并發(fā)收集器,所以其大小需要小心設(shè)置,一般要考慮并發(fā)會話率和會話持續(xù)時間等一些參數(shù)。如果堆設(shè)置小了,可以會造成內(nèi)存碎片、高回收頻率以及應(yīng)用暫停而使用傳統(tǒng)的標(biāo)記清除方式;如果堆大了,則需要較長的收集時間。最優(yōu)化的方案,一般需要參考以下數(shù)據(jù)獲得:并發(fā)垃圾收集信息、持久代并發(fā)收集次數(shù)、傳統(tǒng)GC信息、花在年輕代和年老代回收上的時間比例。
減少年輕代和年老代花費的時間,一般會提高應(yīng)用的效率。
吞吐量優(yōu)先的應(yīng)用:一般吞吐量優(yōu)先的應(yīng)用都有一個很大的年輕代和一個較小的年老代。原因是,這樣可以盡可能回收掉大部分短期對象,減少中期的對象,而年老代盡存放長期存活對象。
較小堆引起的碎片問題
因為年老代的并發(fā)收集器使用標(biāo)記、清除算法,所以不會對堆進行壓縮。當(dāng)收集器回收時,他會把相鄰的空間進行合并,這樣可以分配給較大的對象。但是,當(dāng)堆空間較小時,運行一段時間以后,就會出現(xiàn)“碎片”,如果并發(fā)收集器找不到足夠的空間,那么并發(fā)收集器將會停止,然后使用傳統(tǒng)的標(biāo)記、清除方式進行回收。如果出現(xiàn)“碎片”,可能需要進行如下配置:
-XX:+UseCMSCompactAtFullCollection:使用并發(fā)收集器時,開啟對年老代的壓縮。
-XX:CMSFullGCsBeforeCompaction=0:上面配置開啟的情況下,這里設(shè)置多少次Full GC后,對年老代進行壓縮。