美文网首页
模拟JVM内存溢出、使用MAT分析、读GC日志、JVM常用配置

模拟JVM内存溢出、使用MAT分析、读GC日志、JVM常用配置

作者: lbcBoy | 来源:发表于2020-06-27 21:47 被阅读0次

    1.创建SpringBoot项目

    通过一个死循环,让内存溢出

    @RequestMapping("/oomTest")
    public String oomTest() {
        int i = 0;
        while (true) {
            integerList.add(i);
            i++;
            System.out.println(i);
        }
    
    }
    

    2.记得修改JVM参数

    既要设置内存大小,也要在OOM时保存文件,也要保存GC日志

    -Xms40m
    -Xmx40m
    -XX:+HeapDumpOnOutOfMemoryError
    -XX:HeapDumpPath=./
    -XX:+PrintGCDetails
    -Xloggc:./gc.log
    

    3.启动项目,调用接口

    循环到一定程度后,OOM发生了:


    image.png

    4.在根目录找到.hprof文件和gc.log文件

    4.1使用MAT分析.hprof文件
    image.png
    4.2 分析gc.log文件
    Java HotSpot(TM) 64-Bit Server VM (25.111-b14) for windows-amd64 JRE (1.8.0_111-b14), built on Sep 22 2016 19:24:05 by "java_re" with MS VC++ 10.0 (VS2010)
    Memory: 4k page, physical 33279588k(17434308k free), swap 38260324k(17228608k free)
    CommandLine flags: -XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./ -XX:InitialHeapSize=41943040 -XX:+ManagementServer -XX:MaxHeapSize=41943040 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:TieredStopAtLevel=1 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC 
    0.621: [GC (Allocation Failure) [PSYoungGen: 10240K->1528K(11776K)] 10240K->2061K(39424K), 0.0017762 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    0.733: [GC (Allocation Failure) [PSYoungGen: 11768K->1528K(11776K)] 12301K->3549K(39424K), 0.0022136 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    0.798: [GC (Allocation Failure) [PSYoungGen: 11768K->1528K(11776K)] 13789K->4684K(39424K), 0.0018205 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    0.835: [GC (Allocation Failure) [PSYoungGen: 11768K->1528K(11776K)] 14924K->5923K(39424K), 0.0019339 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    0.870: [GC (Allocation Failure) [PSYoungGen: 11768K->1512K(11776K)] 16163K->7076K(39424K), 0.0016447 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    0.906: [GC (Allocation Failure) [PSYoungGen: 11752K->1528K(7680K)] 17316K->7919K(35328K), 0.0019457 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    0.928: [GC (GCLocker Initiated GC) [PSYoungGen: 7672K->1408K(9728K)] 14064K->8673K(37376K), 0.0016146 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    0.950: [GC (Allocation Failure) [PSYoungGen: 7552K->1216K(9728K)] 14821K->8913K(37376K), 0.0011682 secs] [Times: user=0.14 sys=0.00, real=0.00 secs] 
    0.983: [GC (Allocation Failure) [PSYoungGen: 7360K->1306K(9728K)] 15057K->9284K(37376K), 0.0011392 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    1.015: [GC (Allocation Failure) [PSYoungGen: 7443K->1450K(9728K)] 15421K->9796K(37376K), 0.0040677 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    1.047: [GC (Allocation Failure) [PSYoungGen: 7594K->1048K(9728K)] 15940K->9912K(37376K), 0.0017552 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    1.077: [GC (Allocation Failure) [PSYoungGen: 7192K->995K(9728K)] 16056K->10035K(37376K), 0.0012529 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    1.106: [GC (Allocation Failure) [PSYoungGen: 7139K->1046K(9728K)] 16179K->10246K(37376K), 0.0014971 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    1.132: [GC (Allocation Failure) [PSYoungGen: 7190K->988K(9728K)] 16390K->10372K(37376K), 0.0012089 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    1.152: [GC (Metadata GC Threshold) [PSYoungGen: 4429K->562K(9728K)] 13813K->10167K(37376K), 0.0013494 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    1.153: [Full GC (Metadata GC Threshold) [PSYoungGen: 562K->0K(9728K)] [ParOldGen: 9604K->5712K(27648K)] 10167K->5712K(37376K), [Metaspace: 20603K->20603K(1067008K)], 0.0402913 secs] [Times: user=0.22 sys=0.00, real=0.04 secs] 
    1.236: [GC (Allocation Failure) [PSYoungGen: 6144K->1161K(9728K)] 11856K->6945K(37376K), 0.0015287 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    1.255: [GC (Allocation Failure) [PSYoungGen: 7291K->783K(9728K)] 13075K->7183K(37376K), 0.0010509 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    1.267: [GC (Allocation Failure) [PSYoungGen: 6927K->740K(9728K)] 13327K->7500K(37376K), 0.0009120 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    1.291: [GC (Allocation Failure) [PSYoungGen: 6828K->1789K(9728K)] 13588K->8830K(37376K), 0.0014743 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    1.314: [GC (Allocation Failure) [PSYoungGen: 7933K->2577K(9728K)] 14974K->11103K(37376K), 0.0015567 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    1.346: [GC (Allocation Failure) [PSYoungGen: 8721K->925K(9728K)] 17247K->11795K(37376K), 0.0012903 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    1.371: [GC (Allocation Failure) [PSYoungGen: 7069K->704K(9728K)] 17939K->12044K(37376K), 0.0009646 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    1.401: [GC (Allocation Failure) [PSYoungGen: 6848K->671K(9728K)] 18188K->12324K(37376K), 0.0010683 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    1.435: [GC (Allocation Failure) [PSYoungGen: 6815K->956K(9728K)] 18468K->12881K(37376K), 0.0013447 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    1.466: [GC (Allocation Failure) [PSYoungGen: 7100K->1004K(9728K)] 19025K->13096K(37376K), 0.0013478 secs] [Times: user=0.06 sys=0.00, real=0.00 secs] 
    1.493: [GC (Allocation Failure) [PSYoungGen: 7146K->777K(10240K)] 19238K->13174K(37888K), 0.0012582 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    1.533: [GC (Allocation Failure) [PSYoungGen: 7945K->881K(10240K)] 20342K->13565K(37888K), 0.0010946 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    1.563: [GC (Allocation Failure) [PSYoungGen: 8049K->672K(10240K)] 20733K->13602K(37888K), 0.0012861 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    1.593: [GC (Allocation Failure) [PSYoungGen: 7840K->672K(10240K)] 20770K->13998K(37888K), 0.0012785 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    1.620: [GC (Allocation Failure) [PSYoungGen: 7840K->562K(10240K)] 21166K->14321K(37888K), 0.0013071 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    1.650: [GC (Allocation Failure) [PSYoungGen: 7730K->640K(10240K)] 21489K->14662K(37888K), 0.0013652 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    1.680: [GC (Allocation Failure) [PSYoungGen: 7808K->910K(10752K)] 21830K->15253K(38400K), 0.0010506 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    1.723: [GC (Allocation Failure) [PSYoungGen: 9102K->736K(10752K)] 23445K->15590K(38400K), 0.0020021 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    1.761: [GC (Allocation Failure) [PSYoungGen: 8928K->967K(10752K)] 23782K->16261K(38400K), 0.0013968 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    1.803: [GC (Allocation Failure) [PSYoungGen: 9159K->1524K(10752K)] 24453K->17170K(38400K), 0.0013322 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    1.834: [GC (Allocation Failure) [PSYoungGen: 9715K->774K(10752K)] 25362K->16996K(38400K), 0.0016574 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    1.878: [GC (Allocation Failure) [PSYoungGen: 8966K->994K(10752K)] 25188K->17585K(38400K), 0.0016544 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    1.915: [GC (Allocation Failure) [PSYoungGen: 9186K->576K(11264K)] 25777K->17552K(38912K), 0.0016180 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    1.954: [GC (Allocation Failure) [PSYoungGen: 9792K->674K(11264K)] 26768K->18066K(38912K), 0.0013063 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    1.985: [GC (Allocation Failure) [PSYoungGen: 9890K->672K(11264K)] 27282K->18400K(38912K), 0.0017008 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    2.021: [GC (Allocation Failure) [PSYoungGen: 9888K->1189K(11264K)] 27616K->19389K(38912K), 0.0015143 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    2.055: [GC (Allocation Failure) [PSYoungGen: 10405K->672K(11264K)] 28605K->19600K(38912K), 0.0015006 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    2.089: [GC (Allocation Failure) [PSYoungGen: 9888K->672K(11264K)] 28816K->20048K(38912K), 0.0011516 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    2.124: [GC (Allocation Failure) [PSYoungGen: 9888K->705K(11264K)] 29264K->20361K(38912K), 0.0018830 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    2.157: [GC (Allocation Failure) [PSYoungGen: 9921K->1043K(11264K)] 29577K->21123K(38912K), 0.0013440 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    2.190: [GC (Allocation Failure) [PSYoungGen: 10259K->784K(11264K)] 30339K->21288K(38912K), 0.0014076 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    2.218: [GC (Allocation Failure) [PSYoungGen: 10000K->576K(11264K)] 30504K->21528K(38912K), 0.0015571 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    2.251: [GC (Allocation Failure) [PSYoungGen: 9792K->942K(11264K)] 30744K->22262K(38912K), 0.0015738 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    2.283: [GC (Allocation Failure) [PSYoungGen: 10158K->832K(11264K)] 31478K->22640K(38912K), 0.0016733 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    2.314: [GC (Allocation Failure) [PSYoungGen: 10048K->787K(11776K)] 31856K->23147K(39424K), 0.0017683 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    2.340: [GC (Allocation Failure) [PSYoungGen: 11027K->576K(11776K)] 33387K->23328K(39424K), 0.0013116 secs] [Times: user=0.02 sys=0.00, real=0.00 secs] 
    2.366: [GC (Allocation Failure) [PSYoungGen: 10816K->634K(11776K)] 33568K->23826K(39424K), 0.0013396 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    13.719: [GC (Allocation Failure) [PSYoungGen: 10874K->1295K(11776K)] 34066K->24815K(39424K), 0.0024640 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    13.864: [GC (Allocation Failure) [PSYoungGen: 11535K->1373K(10752K)] 35055K->25441K(38400K), 0.0022676 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    14.046: [GC (Allocation Failure) [PSYoungGen: 10589K->1376K(11264K)] 34657K->26229K(38912K), 0.0031012 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    14.249: [GC (Allocation Failure) [PSYoungGen: 10592K->2033K(10240K)] 35445K->27149K(37888K), 0.0028242 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    14.423: [GC (Allocation Failure) [PSYoungGen: 10225K->1801K(10752K)] 35341K->28366K(38400K), 0.0040072 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    14.427: [Full GC (Ergonomics) [PSYoungGen: 1801K->0K(10752K)] [ParOldGen: 26564K->20847K(27648K)] 28366K->20847K(38400K), [Metaspace: 33268K->33268K(1079296K)], 0.1311243 secs] [Times: user=0.72 sys=0.00, real=0.13 secs] 
    14.736: [GC (Allocation Failure) [PSYoungGen: 8192K->928K(10752K)] 29039K->21775K(38400K), 0.0079679 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
    14.883: [GC (Allocation Failure) [PSYoungGen: 9120K->2558K(10752K)] 29967K->23717K(38400K), 0.0050739 secs] [Times: user=0.02 sys=0.00, real=0.00 secs] 
    15.347: [GC (Allocation Failure) [PSYoungGen: 10750K->928K(9728K)] 31909K->24685K(37376K), 0.0042086 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    15.473: [GC (Allocation Failure) [PSYoungGen: 6823K->768K(10240K)] 30581K->25341K(37888K), 0.0123800 secs] [Times: user=0.16 sys=0.00, real=0.01 secs] 
    15.608: [GC (Allocation Failure) [PSYoungGen: 7936K->2686K(10240K)] 32509K->27852K(37888K), 0.0047171 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    15.792: [GC (Allocation Failure) --[PSYoungGen: 9854K->9854K(10240K)] 35020K->37498K(37888K), 0.0112540 secs] [Times: user=0.14 sys=0.00, real=0.01 secs] 
    15.803: [Full GC (Ergonomics) [PSYoungGen: 9854K->0K(10240K)] [ParOldGen: 27644K->25779K(27648K)] 37498K->25779K(37888K), [Metaspace: 33268K->33268K(1079296K)], 0.2247909 secs] [Times: user=1.06 sys=0.01, real=0.22 secs] 
    16.180: [GC (Allocation Failure) [PSYoungGen: 7168K->800K(10240K)] 32947K->26579K(37888K), 0.0068336 secs] [Times: user=0.16 sys=0.00, real=0.01 secs] 
    16.334: [GC (Allocation Failure) [PSYoungGen: 7968K->1504K(10240K)] 33747K->27283K(37888K), 0.0118211 secs] [Times: user=0.14 sys=0.00, real=0.01 secs] 
    16.437: [GC (Allocation Failure) --[PSYoungGen: 8672K->8672K(10240K)] 34451K->34451K(37888K), 0.0141972 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 
    16.452: [Full GC (Ergonomics) [PSYoungGen: 8672K->0K(10240K)] [ParOldGen: 25779K->26133K(27648K)] 34451K->26133K(37888K), [Metaspace: 33268K->33046K(1079296K)], 0.1953328 secs] [Times: user=0.88 sys=0.02, real=0.19 secs] 
    16.795: [Full GC (Ergonomics) [PSYoungGen: 7168K->0K(10240K)] [ParOldGen: 26133K->26792K(27648K)] 33301K->26792K(37888K), [Metaspace: 33046K->33046K(1079296K)], 0.0963588 secs] [Times: user=0.50 sys=0.00, real=0.10 secs] 
    17.039: [Full GC (Ergonomics) [PSYoungGen: 7168K->0K(10240K)] [ParOldGen: 26792K->27475K(27648K)] 33960K->27475K(37888K), [Metaspace: 33046K->33046K(1079296K)], 0.0731456 secs] [Times: user=0.61 sys=0.00, real=0.07 secs] 
    17.261: [Full GC (Ergonomics) [PSYoungGen: 7168K->536K(10240K)] [ParOldGen: 27475K->27621K(27648K)] 34643K->28158K(37888K), [Metaspace: 33046K->33046K(1079296K)], 0.0792916 secs] [Times: user=0.63 sys=0.02, real=0.08 secs] 
    17.481: [Full GC (Ergonomics) [PSYoungGen: 7168K->1166K(10240K)] [ParOldGen: 27621K->27621K(27648K)] 34789K->28788K(37888K), [Metaspace: 33046K->33046K(1079296K)], 0.0822999 secs] [Times: user=0.81 sys=0.00, real=0.08 secs] 
    17.690: [Full GC (Ergonomics) [PSYoungGen: 7168K->1738K(10240K)] [ParOldGen: 27621K->27621K(27648K)] 34789K->29360K(37888K), [Metaspace: 33046K->33046K(1079296K)], 0.1052190 secs] [Times: user=0.73 sys=0.02, real=0.11 secs] 
    17.919: [Full GC (Ergonomics) [PSYoungGen: 7168K->2253K(10240K)] [ParOldGen: 27621K->27621K(27648K)] 34789K->29875K(37888K), [Metaspace: 33046K->33046K(1079296K)], 0.1066049 secs] [Times: user=0.78 sys=0.00, real=0.11 secs] 
    18.114: [Full GC (Ergonomics) [PSYoungGen: 6179K->2621K(10240K)] [ParOldGen: 27621K->27621K(27648K)] 33801K->30243K(37888K), [Metaspace: 33046K->33046K(1079296K)], 0.1012066 secs] [Times: user=0.88 sys=0.02, real=0.10 secs] 
    18.215: [Full GC (Allocation Failure) [PSYoungGen: 2621K->2621K(10240K)] [ParOldGen: 27621K->27555K(27648K)] 30243K->30176K(37888K), [Metaspace: 33046K->33036K(1079296K)], 0.2175771 secs] [Times: user=1.47 sys=0.00, real=0.22 secs] 
    18.693: [Full GC (Ergonomics) [PSYoungGen: 7168K->3177K(10240K)] [ParOldGen: 27555K->27541K(27648K)] 34723K->30718K(37888K), [Metaspace: 33481K->33481K(1079296K)], 0.2012172 secs] [Times: user=1.42 sys=0.01, real=0.20 secs] 
    5297.358: [Full GC (Ergonomics) [PSYoungGen: 7168K->3360K(10240K)] [ParOldGen: 27541K->27518K(27648K)] 34709K->30879K(37888K), [Metaspace: 33671K->33671K(1079296K)], 0.1424810 secs] [Times: user=0.83 sys=0.00, real=0.14 secs] 
    7009.462: [Full GC (Ergonomics) [PSYoungGen: 4120K->3117K(10240K)] [ParOldGen: 27518K->27513K(27648K)] 31639K->30631K(37888K), [Metaspace: 33687K->33685K(1079296K)], 0.1384130 secs] [Times: user=0.92 sys=0.02, real=0.14 secs] 
    7009.601: [Full GC (Allocation Failure) [PSYoungGen: 3117K->3115K(10240K)] [ParOldGen: 27513K->27513K(27648K)] 30631K->30629K(37888K), [Metaspace: 33685K->33685K(1079296K)], 0.0834903 secs] [Times: user=0.55 sys=0.00, real=0.08 secs] 
    

    5.如何读GC文件

    其中GC, Full GC 说明垃圾收集的停顿类型,full GC表示其他线程均停止工作,仅有垃圾回收线程工作
    其中 PSYoungGen, ParOldGen 表示 GC发生的区域,该区域与 使用的GC收集器密切相关。
        - 例 PSYoungGen 表示 采用 Parallel Scavenge收集器时, 新生代发生的变化
        - 同理 当出现 DefNew 表示 采用 Serial收集器时,新生代发生的变化, default new generation。
    方括号内数字:7307K->480K(9216K) 表示 GC前该内存区域已使用的容量 -> GC后该内存区域已使用的容量(该内存区域总容量)
    方括号外数字:7307K->6624K(19456K) 表示 GC前java 堆已使用容量 -> GC后java堆已使用容量(java堆总容量)
    0.0072860 secs 表示 该内存区域GC所占用的时间
    [Times: user=0.01 sys=0.01, real=0.00 secs] :
        - 分别表示用户态消耗cpu时间,
        - 内核态消耗cpu时间,
        - 操作从开始到结束经过的墙钟时间
    cpu时间与墙钟时间区别:
        - 墙钟时间包括非运算等待耗时,例如等待磁盘I/O,等待阻塞,而cpu不包括
        - 但当系统有多cpu或者多核的话,多线程操作会叠加这些cpu时间,所以看到user或sys时间超过real时间是完全正常的
    

    6.常见报错解释

    GC (Allocation Failure)
    Full GC (Allocation Failure)
    - 表明本次引起GC的原因是因为在年轻代中没有足够的空间能够存储新的数据了
    
    GC (Metadata GC Threshold)
    Full GC (Metadata GC Threshold)
    - Metaspace区是保存在本地内存中,是没有上限的,
      JDK8中,XX:MaxMetaspaceSize确实是没有上限的,最大容量与机器的内存有关;
      但是XX:MetaspaceSize是有一个默认值的:21M,需要改大一点;
    
    Full GC (Ergonomics)
    - 自动选择和调优引发的FullGC
    
    
    java.lang.OutOfMemoryError: GC overhead limit exceeded
    - JVM花费了98%的时间进行垃圾回收,而只得到2%可用的内存,频繁的进行内存回收(最起码已经进行了5次连续的垃圾回收),
      JVM就会曝出ava.lang.OutOfMemoryError: GC overhead limit exceeded错误
    

    7.问题

    元空间是啥?

    方法区也是所有线程共享。主要用于存储类的信息、常量池、方法数据、方法代码等。
    方法区是JVM 的规范,永久代(PermGen space)是HotSpot对这种规范的实现。
    在 JDK 1.8 中, HotSpot 已经没有 “PermGen space”这个区间了,取而代之的是 Metaspace(元空间)。
    
    元空间的本质和永久代类似,都是对JVM规范中方法区的实现。
    不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。
    因此,默认情况下,元空间的大小仅受本地内存限制,但可以通过以下参数来指定元空间的大小:
    -XX:MetaspaceSize 初始空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:
        如果释放了大量的空间,就适当降低该值;
        如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。
    -XX:MaxMetaspaceSize最大空间,默认是没有限制的。
    
    除了上面两个指定大小的选项以外,还有两个与 GC 相关的属性:
    -XX:MinMetaspaceFreeRatio在GC之后,最小的Metaspace剩余空间容量的百分比,减少为分配空间所导致的垃圾收集
    -XX:MaxMetaspaceFreeRatio在GC之后,最大的Metaspace剩余空间容量的百分比,减少为释放空间所导致的垃圾收集
    

    Young GC和Full GC分别在什么情况下会发生?

    Young GC的触发时机:Young GC其实一般就是在新生代的Eden区域满了之后就会触发,采用复制算法来回收新生代的垃圾。
    Full GC的触发时机如下:
    (1)发生Young GC之前进行检查(允许空间分配担保失败),如果“老年代可用的连续内存空间” < “新生代历次Young GC后升入老年代的对象总和的平均大小”,
    说明本次Young GC后可能升入老年代的对象大小,可能超过了老年代当前可用内存空间此时必须先触发一次Old GC给老年代腾出更多的空间,然后再执行Young GC。
    (2)执行Young GC之后有一批对象需要放入老年代,此时老年代就是没有足够的内存空间存放这些对象了,此时必须立即触发一次Old GC。
    (3)老年代内存使用率超过了92%,也要直接触发Old GC,当然这个比例是可以通过参数调整的。
    
    概括成一句话,就是老年代空间也不够了,没法放入更多对象了,这个时候务必执行Old GC对老年代进行垃圾回收。
    

    8.经典案例

    记一次诡异的频繁Full GChttps://www.jianshu.com/p/f3fd1664f1ee
    一次由于YoungGC引起的性能问题分析https://blog.csdn.net/zhxdick/article/details/79105421

    9.JVM常用配置

    堆设置
    -Xms256M:初始堆大小256M,默认为物理内存的1/64
    -Xmx1024M:最大堆大小1024M,默认为物理内存的1/4,等于与-XX:MaxHeapSize=64M
    -Xmn64M:年轻代大小为64M(JDK1.4后支持),相当于同时设置NewSize和MaxNewSize为64M
    -XX:NewSize=64M:初始年轻代大小
    -XX:MaxNewSize=256M:最大年轻代大小(默认为堆最大值的1/3)
    -XX:OldSize=64M:年老代大小64M(测试验证JDK1.8.191该参数设置无效,JDK11下设置成功)
    -XX:NewRatio=4:年老代:年轻代=4:1
    -XX:SurvivorRatio=8:年轻代中,2个Survivor区与1个Eden区比例=2:8,Survivor占新生代内存比例为1/5
    -XX:MaxHeapFreeRatio=70:堆内存使用率大于70时扩张堆内存,xms=xmx时该参数无效
    -XX:MinHeapFreeRatio=40:堆内存使用率小于40时缩减堆内存,xms=xmx时该参数无效。
    备注:堆大小=年轻代(Young Generation)+年老代(Old Generation),Young Generation=Eden Space + 2 Survivor Space。
    
    
    非堆设置--持久代设置
    -XX:PermSize=56M:初始分配的持久代容量,默认为物理内存的1/64(从1.8起,该参数已作废,可使用-XX:MetaspaceSize替代)
    -XX:MaxPermSize=56M:持久代的最大容量,默认为物理内存的1/4,设置值过小会导致java.lang.OutOfMemoryError: PermGen space错误。(从1.8起,该参数已作废,可使用-XX:MaxMetaspaceSize替代)
    
    
    非堆设置--虚拟机栈
    -Xss128k:虚拟机栈大小为128k
    
    GC相关
    -Xnoclassgc:关闭JVM垃圾回收功能
    -XX:+UseG1GC:使用G1垃圾回收器
    -XX:+DisableExplicitGC:静止Java程序中的FULL GC,如System.gc()
    -XX:PrintGCDetails:GC时打印详细信息
    -XX:PrintGC:GC时打印信息
    -XX:PrintHeapAtGC:GC时打印堆前后信息
    
    其他
    -XX:+HeapDumpOnOutOfMemoryError:内存溢出时Dump出当前堆内存快照
    

    参考:
    https://blog.csdn.net/zc19921215/article/details/83029952
    https://www.cnblogs.com/airnew/p/11756450.html
    https://blog.csdn.net/u010588262/article/details/81365547
    http://www.manongjc.com/article/91948.html
    https://www.cnblogs.com/cecWork/p/13061071.html
    https://www.cnblogs.com/huigelaile/p/11188231.html

    相关文章

      网友评论

          本文标题:模拟JVM内存溢出、使用MAT分析、读GC日志、JVM常用配置

          本文链接:https://www.haomeiwen.com/subject/suvmfktx.html