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