Java虛擬機-3-JVM參數

三、JVM參數

1、標準選項

常用的有2個:

-server         選擇 "server" VM
                默認 VM 是 server.

-D<名稱>=<>    設置系統屬性

64位的JDK,Java HotSpot™ 64-Bit Server VM,默認是服務器選項

2、非標準選項

通過命令java -X來設置

常用的:

-Xms<size>    設置初始 Java 堆大小
-Xmx<size>    設置最大 Java 堆大小
-Xss<size>    設置 Java 線程堆棧大小
-Xmn<size>    設置新生代大小

大小:1g=1024m=1048576k=1073741824

注意:-Xss(Java線程堆棧大小)如果設置不當,就會拋出java.lang.OutOfMemoryError: unable to create new native thread異常

(MaxProcessMemory - JVMMemory - ReservedOSMemory) / ThreadStackSize

線程數 =(一個進程的最大內存 - JVM內存 - 保留的操作系統內存)/ 線程棧的大小

也就是說系統可以創建的線程數量與分配給JVM的內存大小成反比

默認大小:

  • Linux/x64 (64-bit): 1024 KB
  • OS X (64-bit): 1024 KB
  • Windows: 依賴於虛擬內存

如果使用CMS垃圾收集器,則推薦的配置是

(Xmx - Xmn) * (100 - CMSInitiatingOccupancyFraction) / 100 >= Xmn

3、不穩定、不建議隨便使用的選項

【1】選項規則

主要有兩種 java -XX:參數名=參數值java -XX:+參數名[開啓],java -XX:-參數名[關閉]

【2】查看默認值

使用jinfo命令,查看指定Java進程的信息

jinfo -flag 參數名 進程ID    查看指定參數的信息
jinfo -flags 進程ID         查看此Java進程的所有參數設置情況

查看初始化配置和修改後的配置

java -XX:+PrintFlagsInitial    查看出廠配置
java -XX:+PrintFlagsFinal      查看修改後的配置,如果有調整,則會在等號前面添加一個冒號(:=

查看程序啓動時輸入的參數

-XX:+PrintCommandLineFlags

【3】打印垃圾回收細節日誌

-XX:-XX:+PrintGCDetails

以JDK8爲例

-Xms1m -Xmx1m -XX:+PrintGCDetails
public static void main(String[] args) {
    byte[] arr = new byte[1024 * 1024];
}
[GC (Allocation Failure) [PSYoungGen: 512K->488K(1024K)] 512K->496K(1536K), 0.0006315 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 994K->488K(1024K)] 1002K->632K(1536K), 0.0024668 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 991K->488K(1024K)] 1135K->768K(1536K), 0.0015305 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 997K->488K(1024K)] 1277K->883K(1536K), 0.0026983 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (Ergonomics) [PSYoungGen: 488K->477K(1024K)] [ParOldGen: 395K->290K(512K)] 883K->768K(1536K), [Metaspace: 2805K->2805K(1056768K)], 0.0125178 secs] [Times: user=0.06 sys=0.00, real=0.01 secs] 
[GC (Allocation Failure) [PSYoungGen: 682K->504K(1024K)] 972K->860K(1536K), 0.0006652 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (Ergonomics) [PSYoungGen: 504K->461K(1024K)] [ParOldGen: 356K->298K(512K)] 860K->760K(1536K), [Metaspace: 3032K->3032K(1056768K)], 0.0050665 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 461K->504K(1024K)] 760K->818K(1536K), 0.0022655 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (Allocation Failure) [PSYoungGen: 504K->448K(1024K)] [ParOldGen: 314K->294K(512K)] 818K->742K(1536K), [Metaspace: 3032K->3032K(1056768K)], 0.0053731 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at ???.main(???.java:???)
Heap
 PSYoungGen      total 1024K, used 523K [0x00000000ffe80000, 0x0000000100000000, 0x0000000100000000)
  eden space 512K, 14% used [0x00000000ffe80000,0x00000000ffe92e28,0x00000000fff00000)
  from space 512K, 87% used [0x00000000fff80000,0x00000000ffff0148,0x0000000100000000)
  to   space 512K, 0% used [0x00000000fff00000,0x00000000fff00000,0x00000000fff80000)
 ParOldGen       total 512K, used 294K [0x00000000ffe00000, 0x00000000ffe80000, 0x00000000ffe80000)
  object space 512K, 57% used [0x00000000ffe00000,0x00000000ffe49a48,0x00000000ffe80000)
 Metaspace       used 3132K, capacity 4496K, committed 4864K, reserved 1056768K
  class space    used 338K, capacity 388K, committed 512K, reserved 1048576K

解釋:

[GC (Allocation Failure) [PSYoungGen: 512K->488K(1024K)] 512K->496K(1536K), 0.0006315 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC (分配失敗) [GC類型: YoungGC前新生區大小->YoungGC後新生區大小(新生區總大小)] YoungGC前堆內存大小->YoungGC後堆內存大小(堆內存總大小), YoungGC耗時] [YoungGC耗時: 用戶 系統, 實際]

[Full GC (Allocation Failure) [PSYoungGen: 504K->448K(1024K)] [ParOldGen: 314K->294K(512K)] 818K->742K(1536K), [Metaspace: 3032K->3032K(1056768K)], 0.0053731 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
[Full GC (分配失敗) [PSYoungGen: GC前新生區大小->GC後新生區大小(新生區總大小)] [ParOldGen: GC前養老區大小->GC後養老區大小(養老區總大小)] GC前堆內存大小->GC後堆內存大小(堆內存總大小), [Metaspace: GC前元空間內存大小->GC後元空間內存大小(元空間內存總大小)], Full GC耗時] [Full GC耗時: 用戶=?.?? 系統=?.??, 實際=?.?? secs]

【4】調整永久代大小

-XX:PermSize=???           設置初始永久代大小【JDK7】
-XX:MaxPermSize=???        設置最大永久代大小【JDK7】

-XX:MetaspaceSize=???      設置初始元空間大小【JDK8】
-XX:MaxMetaspaceSize=???   設置最大元空間大小【JDK8】

【5】調整新生區大小

-XX:NewSize=???        設置新生代初始大小,等同於-Xmn
-XX:MaxNewSize=???     設置新生代最大大小

【6】調整新生區比例

-XX:NewRatio=2    默認爲2

【7】調整伊甸園區比例

-XX:SurvivorRatio=8    默認爲8

【8】調整新生區內垃圾對象的存活次數

-XX:MaxTenuringThreshold=15    默認爲15,且範圍必須是在0到15之間

java version “1.8.0_211”

【9】調整養老區大小

-XX:OldSize=???

【10】當發生OOM時,輸出堆內存信息

-XX:+HeapDumpOnOutOfMemoryError    默認是關閉的狀態

【11】修改堆內存Dump文件路徑

-XX:HeapDumpPath=???

例如:-XX:HeapDumpPath=./java_pid.hprof

【12】調整堆內存初始大小

-XX:InitialHeapSize=???

等同於-Xms,默認爲物理內存的1/64

【13】調整堆內存最大大小

-XX:MaxHeapSize=???

等同於-Xmx,默認爲物理內存的1/4

【14】調整虛擬機棧線程大小

-XX:ThreadStackSize=???

等同於-Xss

發佈了155 篇原創文章 · 獲贊 89 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章