如何查看一個正在運行中的java程序,它的某個jvm參數是否開啟?具體值是多少?
jps
jinfo
jvm的參數類型:
1.標配參數:java -version ,java -help , java -showversion
2.X參數(了解): java -Xint (解釋執行), java -Xcomp(第一次使用就編譯成本地代碼),-Xmixed (混合模式)
3.XX參數:
3.1 Boolean類型 ,公式:-XX:+或者-某個屬性值,其中+表示開啟,-表示關閉
例子:是否打印GC收集細節,是否使用串行垃圾回收器
public class HelloGC {
public static void main(String[ ]args) throws InterruptedException {
System.out.println("***********helloGC");
Thread.sleep(Integer.MAX_VALUE);
}
}
結果見下圖:
可以進行修改
3.2 KV設值類型,默認元空間大小
默認多少極限年齡可以升養老區
兩個經典參數:-Xms 和-Xmx
-Xms 等價於:-XX:InitialHeapSize
-Xmx 等價於:-XX:MaxHeapSize
-Xss 設置單個線程棧的大小,一般默認為512k~1024k,等價於 -XX:ThreadStackSize
-Xms128m -Xmx4096m -Xss1024k -XX:MetaspaceSize=512m -XX:+PrintCommandLineFlags
-XX:+PrintGCDetails -XX:+UseSerialGC
第一種,查看參數盤點家底
jps
jinfo -flag 具體參數 java進程編號
jinfo -flags java進程編號
第二種,查看參數盤點家底
java -XX:+PrintFlagsInitial 這個是初始的
java -XX:+PrintFlagsFinal 這個是修改以后的 =表示沒有改過 :=表示人為修改或者jvm修改過的 公式:java -XX:+PrintFlagsFinal -version
java -XX:+PrintCommandLineFlags 也是可以查看初始參數
public class MemDemo {
public static void main(String[ ] args) {
long maxMemory = Runtime.getRuntime().maxMemory();
long totalMemory = Runtime.getRuntime().totalMemory();
System.out.println("-Xmx 最大分配內存 "+(maxMemory/(double)1024/1024)+"MB");
System.out.println("-Xms 初始分配內存 "+(totalMemory/(double)1024/1024)+"MB");
}
}
運行結果見下圖:
OOM異常例子:
public class HelloGC {
public static void main(String[ ]args) throws InterruptedException {
System.out.println("***********helloGC");
//創建50m大小空間,實際調整為10m
byte[] bytes= new byte[50*1024*1024];
}
}
日志分析總結:
1.GC前后的對比。
2.新生代占堆內存三分之一,老年代占堆內存三分之二,老年代回收不了將拋oom異常。
常用基礎參數SurvivorRatio
-XX:SurvivorRatio 設置新生代中eden和S0/S1空間的比例,默認
-XX:SurvivorRatio=8, Eden:S0:S1=8:1:1
假如
-XX:SurvivorRatio=4, Eden:S0:S1=4:1:1
SurvivorRatio值就是設置eden區的比例占多少,S0/S1相同
public class HelloGC {
public static void main(String[ ]args) throws InterruptedException {
System.out.println("***********helloGC");
//byte[] bytes= new byte[50*1024*1024];
}
}
默認狀態:8:1:1
加參數后:4:1:1
常用基礎參數NewRatio
-XX:NewRatio
配置年輕代與老年代在堆結構的占比
-XX:NewRatio=2新生代占1,老年代2,年輕代占整個堆的1/3
假如
-XX:NewRatio=4新生代占1,老年代4,年輕代占整個堆的1/5
NewRatio值就是設置老年代的占比,剩下的1給新生代
用法跟上圖配置一樣。