1. 程式人生 > >JVM啟動引數的類別及使用

JVM啟動引數的類別及使用

本文和大家重點討論一下JVM啟動引數,JVM啟動引數共分為三類,分別是標準引數(-),非標準引數(-X)和非Stable引數(-XX),相信本文介紹一定會讓你有所收穫。

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”的例子 

  1. publicclassHelloWorld  
  2. {  
  3. publicstaticvoidmain(String[]args)  
  4. {  
  5. System.out.println(”HelloWorld!”);  
  6. }  
  7. }  

編譯並執行:
 

  1. D:\work>javacHelloWorld.java  
  2. D:\work>java-Xms256M-Xmx512MHelloWorld  
  3. 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來設定。