程序1java
package com.cxl.demo; public class T1 { class User{ int id; String name; User(int id,String name){ this.id = id; this.name = name; } } void alloc(int i){ new User(i,"name"+i); } public static void main(String[] args) { T1 t = new T1(); long s1 = System.currentTimeMillis(); for(int i = 0;i<100000000;i++) t.alloc(i); long s2 = System.currentTimeMillis(); System.out.println(s2 - s1); } } -XX:+PrintGC #打印GC -XX:-UseTLAB #使用線程本地緩存 -XX:+DoEscapeAnalysis #使用逃逸分析 -XX:+EliminateAllocations #關閉標量替換
程序2web
package com.cxl.demo; public class T2 { public static void main(String[] args) { byte[] b = new byte[1024]; } } -XX:+PrintGCDetails #打印GC詳情信息 -XX:-UseTLAB #使用線程本地緩存 -XX:+DoEscapeAnalysis #使用逃逸分析 -XX:+EliminateAllocations #關閉標量替換
程序3緩存
package com.cxl.demo; /** * 能夠用Runtime類「大體」計算內存狀況 */ public class T3 { public static void main(String[] args) { printMemoryInfo(); byte[] b = new byte[1024*1024]; System.out.println("--------------"); printMemoryInfo(); } static void printMemoryInfo(){ System.out.println("total: " + Runtime.getRuntime().totalMemory());//總共內存 long total = Runtime.getRuntime().totalMemory(); System.out.println("free: " + Runtime.getRuntime().freeMemory());//剩餘內存 long free = Runtime.getRuntime().freeMemory(); String curr = String.valueOf(total-free); System.out.println("curr: " + curr); } }
直接跑起來,使用了java自帶的,只能是個參考數值併發
程序4jvm
package com.cxl.demo; import java.util.ArrayList; import java.util.List; /** * 內存溢出 * -XX:+HeapDumpOnOutOfMemoryError #內存消耗完了,把堆的信息給(倒入)下載下來 * -XX:HeapDumpPath=c:\jvm.dump #內存溢出堆信息倒入到該路徑的文件 * -XX:+PrintGCDetails #打印GC詳情信息 * -Xms10M #JVM程序起始的堆內存空間 * -Xmx10M #JVM最大的堆內存空間 調優通常起始值和最大值同樣,效率最高 */ public class T4 { public static void main(String[] args) { List<Object> lists = new ArrayList<Object>(); for(int i = 0;i<1000000000;i++) lists.add(new byte[1024*1024]); } } -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=f:\jvm.dump -XX:+PrintGCDetails -Xms10M -Xmx10M
程序5svg
package com.cxl.demo; /** * 遞歸調用,一直遞歸調用,調用棧針,總有一天內存會滿 * Xss128 * 越小,併發越大 * 越大,線程遞歸調用比較深 */ public class T5 { static int count = 0; static void r(){ count ++; r(); } public static void main(String[] args){ try{ r(); }catch(Throwable t){ System.out.println(count); t.printStackTrace(); } } } -Xss512k
JVM經常使用參數
堆設置this
–Xms 初始堆大小
-Xmx 最大堆大小
-Xss 線程棧大小
-XX:NewSize=n 設置年輕代大小
-XX:NewRatio=n 設置年輕代和老年代的比值
-XX:SurvivorRatio=n 年輕代中Eden區與兩個Survivor區的比值,注意Survivor區有兩個
-XX:MaxPermSize=n 設置持久代大小
收集器設置
-XX:+UseSerialGC 設置串行收集器
-XX:+UseParallelGC 設置並行收集器
-XX:+UseConcMarkSweepGC 設置併發收集器
垃圾回收統計信息
-XX:+PrintGC
-XX:+PrintGCDetails
-Xloggc:filenamespa