JVM啟動(dòng)參數(shù)的類別及使用
JVM啟動(dòng)參數(shù)還是比較實(shí)用的,于是我研究了一下它的用法,前段時(shí)間下了et項(xiàng)目,啟動(dòng)jBoss的時(shí)候出現(xiàn)了一個(gè)問題,查了一下,發(fā)現(xiàn)是jBoss配置的JVM啟動(dòng)參數(shù)有問題,總結(jié)了一下解決方案希望對(duì)你的學(xué)習(xí)有所幫助。
JVM啟動(dòng)參數(shù)小結(jié)
前段時(shí)間下了et項(xiàng)目,啟動(dòng)jBoss的時(shí)候出現(xiàn)了一個(gè)問題,查了一下,發(fā)現(xiàn)是jBoss配置的JVM啟動(dòng)參數(shù)有問題。后來發(fā)現(xiàn)很多人都遇到過類似的問題。因此,在網(wǎng)上學(xué)習(xí)了相關(guān)資料以后,總結(jié)如下,希望以后對(duì)大家類似問題的查錯(cuò)能夠有點(diǎn)用。
一:JVM啟動(dòng)參數(shù)共分為三類:
其一是標(biāo)準(zhǔn)參數(shù)(-),所有的JVM實(shí)現(xiàn)都必須實(shí)現(xiàn)這些參數(shù)的功能,而且向后兼容;
其二是非標(biāo)準(zhǔn)參數(shù)(-X),指的是JVM底層的一些配置參數(shù),這些參數(shù)在一般開發(fā)中默認(rèn)即可,不需要任何配置。但是在生產(chǎn)環(huán)境中,并不保證所有jvm實(shí)現(xiàn)都滿足,所以為了提高性能,往往需要調(diào)整這些參數(shù),以求系統(tǒng)達(dá)到最佳性能。另外這些參數(shù)不保證向后兼容,也即是說“如有變更,恕不在后續(xù)版本的JDK通知”(這是官網(wǎng)上的原話);
其三是非Stable參數(shù)(-XX),這類參數(shù)在jvm中是不穩(wěn)定的,不適合日常使用的,后續(xù)也是可能會(huì)在沒有通知的情況下就直接取消了,需要慎重使用。
二:JVM內(nèi)存三個(gè)主要的域:
新域、舊域以及永久域。JVM生成的所有新對(duì)象放在新域中。一旦對(duì)象經(jīng)歷了一定數(shù)量的垃圾收集循環(huán)后,便進(jìn)入舊域。而在永久域中是用來存儲(chǔ)JVM自己的反射對(duì)象的,如class和method對(duì)象,而且GC(GarbageCollection)不會(huì)在主程序運(yùn)行期對(duì)永久域進(jìn)行清理。其中新域和舊域?qū)儆诙?,永久域是一個(gè)獨(dú)立域并且不認(rèn)為是堆的一部分。
三:各主要JVM啟動(dòng)參數(shù)的作用如下:
-Xms:設(shè)置jvm內(nèi)存的初始大小
-Xmx:設(shè)置jvm內(nèi)存的最大值
-Xmn:設(shè)置新域的大小(這個(gè)似乎只對(duì)jdk1.4來說是有效的,后來就廢棄了)
-Xss:設(shè)置每個(gè)線程的堆棧大小(也就是說,在相同物理內(nèi)存下,減小這個(gè)值能生成更多的線程)
-XX:NewRatio:設(shè)置新域與舊域之比,如-XX:NewRatio=4就表示新域與舊域之比為1:4
-XX:NewSize:設(shè)置新域的初始值
-XX:MaxNewSize:設(shè)置新域的最大值
-XX:MaxPermSize:設(shè)置永久域的最大值
-XX:SurvivorRatio=n:設(shè)置新域中Eden區(qū)與兩個(gè)Survivor區(qū)的比值。(Eden區(qū)主要是用來存放新生的對(duì)象,而兩個(gè)Survivor區(qū)則用來存放每次垃圾回收后存活下來的對(duì)象)
四:如何使用JVM啟動(dòng)參數(shù):
非常的簡單。舉一個(gè)“HelloWorld”的例子
- publicclassHelloWorld
- {
- publicstaticvoidmain(String[]args)
- {
- System.out.println(”HelloWorld!”);
- }
- }
編譯并運(yùn)行:
- D:\work>javacHelloWorld.java
- D:\work>java-Xms256M-Xmx512MHelloWorld
- HelloWorld!
這樣就可以了。
而如果你要在J2EE環(huán)境中配置這些參數(shù),那么你需要在J2EE應(yīng)用服務(wù)器或者Servlet容器相關(guān)啟動(dòng)參數(shù)設(shè)置處指定,在其啟動(dòng)文件中來配置,Tomcat是在catalina.bat中配置,JBoss是在run.bat中配置,其他服務(wù)器就不說了。
五:JVM啟動(dòng)參數(shù)使用中常見的錯(cuò)誤:
java.lang.OutOfMemoryError相信很多開發(fā)人員都用到過,這個(gè)主要就是JVM參數(shù)沒有配好引起的,但是這種錯(cuò)誤又分兩種:java.lang.OutOfMemoryError:Javaheapspace和java.lang.OutOfMemoryError:PermGenspace,其中前者是有關(guān)堆內(nèi)存的內(nèi)存溢出,可以同過配置-Xms和-Xmx參數(shù)來設(shè)置,而后者是有關(guān)永久域的內(nèi)存溢出,可以通過配置-XX:MaxPermSize來設(shè)置。
【編輯推薦】
- 探究JVM1.6與JVM1.5性能差距
- 常見JVM監(jiān)控工具用法介紹
- 探索Java工作原理之JVM內(nèi)存回收
- 實(shí)例解析Linux平臺(tái)的JVM性能評(píng)測(cè)
- 深入JVM:ClassLoader相關(guān)知識(shí)簡介