关于java内存管理和OSR的一个小实验

 向ArrayList大量插入对象,并且统计耗时。在不同的jvm内存相关参数下,看看程序的性能有哪些改进。

package com.company;

import java.util.ArrayList;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        List<Integer> lInt=new ArrayList<>();
        int num=10000000;
        int max2=num+num;
        int max3=max2+num;
        long time0=System.currentTimeMillis();
        for(int i=0;i<num;i++){
            lInt.add(i);
        }
        System.out.println("first : "+(System.currentTimeMillis()-time0));

        long time1=System.currentTimeMillis();
        for(int i=num;i<max2;i++){
            lInt.add(i);
        }
        System.out.println("first : "+(System.currentTimeMillis()-time1));


        long time2=System.currentTimeMillis();

        for(int i=max2;i<max3;i++){
            lInt.add(i);
        }
        System.out.println("first : "+(System.currentTimeMillis()-time2));

    }
}

上述代码很简单,就是往ArrayList中疯狂加数据,每添加1000万条,算一下花的时间

在不同的jvm参数设置下,运行的结果也不一样:

除了打印GC信息,没有任何参数:

"C:\Program Files\Java\jdk1.8.0_221\bin\java.exe" -XX:+PrintGCDetails "-javaagent:D:\javaDev\JetBrains\IntelliJ IDEA 2019.2.1\lib\idea_rt.jar=59769:D:\javaDev\JetBrains\IntelliJ IDEA 2019.2.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_221\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\rt.jar;C:\Users\che101ast\IdeaProjects\TestOSR\out\production\TestOSR" com.company.Main
[GC (Allocation Failure) [PSYoungGen: 33280K->5108K(38400K)] 33280K->21780K(125952K), 0.0595895 secs] [Times: user=0.16 sys=0.00, real=0.06 secs] 
[GC (Allocation Failure) [PSYoungGen: 38388K->5096K(71680K)] 55060K->43219K(159232K), 0.0716241 secs] [Times: user=0.14 sys=0.03, real=0.07 secs] 
[GC (Allocation Failure) [PSYoungGen: 53967K->5096K(71680K)] 92090K->91619K(159232K), 0.1440162 secs] [Times: user=0.36 sys=0.02, real=0.14 secs] 
[Full GC (Ergonomics) [PSYoungGen: 5096K->0K(71680K)] [ParOldGen: 86523K->80785K(188928K)] 91619K->80785K(260608K), [Metaspace: 3230K->3230K(1056768K)], 1.7553881 secs] [Times: user=2.67 sys=0.01, real=1.76 secs] 
[GC (Allocation Failure) [PSYoungGen: 66560K->5120K(103424K)] 183400K->157808K(292352K), 0.2841864 secs] [Times: user=0.56 sys=0.05, real=0.28 secs] 
[Full GC (Ergonomics) [PSYoungGen: 5120K->0K(103424K)] [ParOldGen: 152688K->141676K(298496K)] 157808K->141676K(401920K), [Metaspace: 3737K->3737K(1056768K)], 1.6569263 secs] [Times: user=3.38 sys=0.00, real=1.66 secs] 
[GC (Allocation Failure) [PSYoungGen: 98304K->5120K(138240K)] 239980K->238103K(436736K), 0.2013691 secs] [Times: user=0.63 sys=0.05, real=0.20 secs] 
[Full GC (Ergonomics) [PSYoungGen: 5120K->0K(138240K)] [ParOldGen: 232983K->201917K(448000K)] 238103K->201917K(586240K), [Metaspace: 3737K->3737K(1056768K)], 2.3679085 secs] [Times: user=6.00 sys=0.03, real=2.37 secs] 
first : 6770
[GC (Allocation Failure) [PSYoungGen: 133120K->93696K(188928K)] 416161K->416337K(636928K), 0.6321554 secs] [Times: user=1.98 sys=0.14, real=0.63 secs] 
first : 767
[Full GC (Ergonomics) [PSYoungGen: 188928K->50097K(188928K)] [ParOldGen: 444327K->447772K(765952K)] 633255K->497869K(954880K), [Metaspace: 3741K->3741K(1056768K)], 5.9627248 secs] [Times: user=14.63 sys=0.03, real=5.96 secs] 
first : 6119
Heap
 PSYoungGen      total 188928K, used 145329K [0x00000000d5d80000, 0x00000000f1280000, 0x0000000100000000)
  eden space 95232K, 100% used [0x00000000d5d80000,0x00000000dba80000,0x00000000dba80000)
  from space 93696K, 53% used [0x00000000e3e00000,0x00000000e6eec6e0,0x00000000e9980000)
  to   space 134656K, 0% used [0x00000000dba80000,0x00000000dba80000,0x00000000e3e00000)
 ParOldGen       total 765952K, used 447772K [0x0000000081800000, 0x00000000b0400000, 0x00000000d5d80000)
  object space 765952K, 58% used [0x0000000081800000,0x000000009cd47088,0x00000000b0400000)
 Metaspace       used 3748K, capacity 4540K, committed 4864K, reserved 1056768K
  class space    used 410K, capacity 428K, committed 512K, reserved 1048576K

Process finished with exit code 0

初始堆内存调大:

"C:\Program Files\Java\jdk1.8.0_221\bin\java.exe" -XX:+PrintGCDetails -Xms1024m "-javaagent:D:\javaDev\JetBrains\IntelliJ IDEA 2019.2.1\lib\idea_rt.jar=51090:D:\javaDev\JetBrains\IntelliJ IDEA 2019.2.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_221\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\rt.jar;C:\Users\che101ast\IdeaProjects\TestOSR\out\production\TestOSR" com.company.Main
[GC (Allocation Failure) [PSYoungGen: 262144K->43519K(305664K)] 262144K->179111K(1005056K), 0.5143245 secs] [Times: user=1.17 sys=0.13, real=0.52 secs] 
first : 815
[GC (Allocation Failure) [PSYoungGen: 305663K->43496K(567808K)] 441255K->343787K(1267200K), 0.4872296 secs] [Times: user=1.38 sys=0.08, real=0.49 secs] 
first : 656
first : 134
Heap
 PSYoungGen      total 567808K, used 385451K [0x00000000d5d80000, 0x00000000fb280000, 0x0000000100000000)
  eden space 524288K, 65% used [0x00000000d5d80000,0x00000000eab70ce0,0x00000000f5d80000)
  from space 43520K, 99% used [0x00000000f8800000,0x00000000fb27a020,0x00000000fb280000)
  to   space 43520K, 0% used [0x00000000f5d80000,0x00000000f5d80000,0x00000000f8800000)
 ParOldGen       total 699392K, used 300291K [0x0000000081800000, 0x00000000ac300000, 0x00000000d5d80000)
  object space 699392K, 42% used [0x0000000081800000,0x0000000093d40fc8,0x00000000ac300000)
 Metaspace       used 3746K, capacity 4540K, committed 4864K, reserved 1056768K
  class space    used 410K, capacity 428K, committed 512K, reserved 1048576K

Process finished with exit code 0

初始堆内存改成2G,年轻代改成768M

"C:\Program Files\Java\jdk1.8.0_221\bin\java.exe" -XX:+PrintGCDetails -Xms2048m -Xmn768m "-javaagent:D:\javaDev\JetBrains\IntelliJ IDEA 2019.2.1\lib\idea_rt.jar=51134:D:\javaDev\JetBrains\IntelliJ IDEA 2019.2.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_221\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\rt.jar;C:\Users\che101ast\IdeaProjects\TestOSR\out\production\TestOSR" com.company.Main
first : 279
first : 245
[GC (Allocation Failure) [PSYoungGen: 589824K->98283K(688128K)] 589824K->403875K(1998848K), 1.0042512 secs] [Times: user=2.77 sys=0.30, real=1.00 secs] 
first : 1181
Heap
 PSYoungGen      total 688128K, used 395383K [0x00000000d0000000, 0x0000000100000000, 0x0000000100000000)
  eden space 589824K, 50% used [0x00000000d0000000,0x00000000e2222fe8,0x00000000f4000000)
  from space 98304K, 99% used [0x00000000f4000000,0x00000000f9ffafe8,0x00000000fa000000)
  to   space 98304K, 0% used [0x00000000fa000000,0x00000000fa000000,0x0000000100000000)
 ParOldGen       total 1310720K, used 305592K [0x0000000080000000, 0x00000000d0000000, 0x00000000d0000000)
  object space 1310720K, 23% used [0x0000000080000000,0x0000000092a6e000,0x00000000d0000000)
 Metaspace       used 3747K, capacity 4540K, committed 4864K, reserved 1056768K
  class space    used 410K, capacity 428K, committed 512K, reserved 1048576K

Process finished with exit code 0

初始堆内存改成4G,年轻代改成1G

"C:\Program Files\Java\jdk1.8.0_221\bin\java.exe" -XX:+PrintGCDetails -Xms4g -Xmn1g "-javaagent:D:\javaDev\JetBrains\IntelliJ IDEA 2019.2.1\lib\idea_rt.jar=51169:D:\javaDev\JetBrains\IntelliJ IDEA 2019.2.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_221\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\rt.jar;C:\Users\che101ast\IdeaProjects\TestOSR\out\production\TestOSR" com.company.Main
first : 286
first : 222
[GC (Allocation Failure) [PSYoungGen: 786432K->131053K(917504K)] 786432K->496197K(4063232K), 1.6266151 secs] [Times: user=3.11 sys=0.31, real=1.63 secs] 
first : 2200
Heap
 PSYoungGen      total 917504K, used 243094K [0x0000000780000000, 0x00000007c0000000, 0x00000007c0000000)
  eden space 786432K, 14% used [0x0000000780000000,0x0000000786d6a2e8,0x00000007b0000000)
  from space 131072K, 99% used [0x00000007b0000000,0x00000007b7ffb7d0,0x00000007b8000000)
  to   space 131072K, 0% used [0x00000007b8000000,0x00000007b8000000,0x00000007c0000000)
 ParOldGen       total 3145728K, used 365144K [0x00000006c0000000, 0x0000000780000000, 0x0000000780000000)
  object space 3145728K, 11% used [0x00000006c0000000,0x00000006d6496000,0x0000000780000000)
 Metaspace       used 3748K, capacity 4540K, committed 4864K, reserved 1056768K
  class space    used 410K, capacity 428K, committed 512K, reserved 1048576K

Process finished with exit code 0

6G和1G

"C:\Program Files\Java\jdk1.8.0_221\bin\java.exe" -XX:+PrintGCDetails -Xms6g -Xmn1g "-javaagent:D:\javaDev\JetBrains\IntelliJ IDEA 2019.2.1\lib\idea_rt.jar=51228:D:\javaDev\JetBrains\IntelliJ IDEA 2019.2.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_221\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\rt.jar;C:\Users\che101ast\IdeaProjects\TestOSR\out\production\TestOSR" com.company.Main
Error occurred during initialization of VM
Could not reserve enough space for object heap

Process finished with exit code 1

6G和1G,但是把本机的浏览器和应用尽量关闭,以便释放内存

"C:\Program Files\Java\jdk1.8.0_221\bin\java.exe" -XX:+PrintGCDetails -Xms6g -Xmn1g "-javaagent:D:\javaDev\JetBrains\IntelliJ IDEA 2019.2.1\lib\idea_rt.jar=51265:D:\javaDev\JetBrains\IntelliJ IDEA 2019.2.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_221\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\rt.jar;C:\Users\che101ast\IdeaProjects\TestOSR\out\production\TestOSR" com.company.Main
first : 347
first : 215
[GC (Allocation Failure) [PSYoungGen: 786432K->131053K(917504K)] 786432K->496221K(6160384K), 1.1398068 secs] [Times: user=3.36 sys=0.24, real=1.14 secs] 
first : 1405
Heap
 PSYoungGen      total 917504K, used 243094K [0x0000000780000000, 0x00000007c0000000, 0x00000007c0000000)
  eden space 786432K, 14% used [0x0000000780000000,0x0000000786d6a2e8,0x00000007b0000000)
  from space 131072K, 99% used [0x00000007b0000000,0x00000007b7ffb7b0,0x00000007b8000000)
  to   space 131072K, 0% used [0x00000007b8000000,0x00000007b8000000,0x00000007c0000000)
 ParOldGen       total 5242880K, used 365168K [0x0000000640000000, 0x0000000780000000, 0x0000000780000000)
  object space 5242880K, 6% used [0x0000000640000000,0x000000065649c000,0x0000000780000000)
 Metaspace       used 3747K, capacity 4540K, committed 4864K, reserved 1056768K
  class space    used 410K, capacity 428K, committed 512K, reserved 1048576K

Process finished with exit code 0

修改程序,每添加完1000万条,就clear,还是6G和1G

程序:

package com.company;

import java.util.ArrayList;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        List<Integer> lInt=new ArrayList<>();
        int num=10000000;
        int max2=num+num;
        int max3=max2+num;
        long time0=System.currentTimeMillis();
        for(int i=0;i<num;i++){
            lInt.add(i);
        }
        System.out.println("first : "+(System.currentTimeMillis()-time0));

        lInt.clear();
        long time1=System.currentTimeMillis();
        for(int i=num;i<max2;i++){
            lInt.add(i);
        }
        System.out.println("first : "+(System.currentTimeMillis()-time1));


        lInt.clear();
        long time2=System.currentTimeMillis();

        for(int i=max2;i<max3;i++){
            lInt.add(i);
        }
        System.out.println("first : "+(System.currentTimeMillis()-time2));

    }
}

输出:

"C:\Program Files\Java\jdk1.8.0_221\bin\java.exe" -XX:+PrintGCDetails -Xms6g -Xmn1g "-javaagent:D:\javaDev\JetBrains\IntelliJ IDEA 2019.2.1\lib\idea_rt.jar=51520:D:\javaDev\JetBrains\IntelliJ IDEA 2019.2.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_221\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\rt.jar;C:\Users\che101ast\IdeaProjects\TestOSR\out\production\TestOSR" com.company.Main
first : 336
first : 163
first : 162
Heap
 PSYoungGen      total 917504K, used 696430K [0x0000000780000000, 0x00000007c0000000, 0x00000007c0000000)
  eden space 786432K, 88% used [0x0000000780000000,0x00000007aa81baa8,0x00000007b0000000)
  from space 131072K, 0% used [0x00000007b8000000,0x00000007b8000000,0x00000007c0000000)
  to   space 131072K, 0% used [0x00000007b0000000,0x00000007b0000000,0x00000007b8000000)
 ParOldGen       total 5242880K, used 0K [0x0000000640000000, 0x0000000780000000, 0x0000000780000000)
  object space 5242880K, 0% used [0x0000000640000000,0x0000000640000000,0x0000000780000000)
 Metaspace       used 3745K, capacity 4540K, committed 4864K, reserved 1056768K
  class space    used 410K, capacity 428K, committed 512K, reserved 1048576K

Process finished with exit code 0

从以上的程序和输出结果来看,java程序中有大量内存占用的情况,如果没有设定好初始的堆容量,执行效率就会急剧下降。

不设置初始堆容量,1000万次插入耗时6770(其中包含若干次GC),没有任何GC的情况是336。

如果触发了OSR(On stack replacement),1000万次插入的时间是163或215

每当内存不足的时候,就会产生年轻代的内存整理,这个耗时比较小,一般是1秒以内,如果是full gc,就得1秒以上。

同时可以清楚的看出,如果没有任何GC操作,OSR(On stack replacement)会提升程序运行的速度,347 -> 215,以及 336 -> 163

关于jvm参数的说明,参考:https://blog.csdn.net/qiuzhongweiwei/article/details/81023645

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值