深入理解Java虚拟机——Java堆测试

  • 代码Test案例是对Java堆,新生代、老年代的理解和认识,对GC回收机制的应用
  • 1.直接运行只展示Java堆内存的使用情况。
  • 2.在运行之前,eclipse或Idea配置JVM运行参数(见代码注释中),运行可得详细信息。

知识点都在注释里

package demo;

public class TestJvm {

    public static void main(String[] args) {

        long maxMemory = Runtime.getRuntime().maxMemory();
        long freeMemory = Runtime.getRuntime().freeMemory();
        long totalMemory = Runtime.getRuntime().totalMemory();

        //-Xms5m -Xmx20m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:+PrintCommandLineFlags
        //-Xms5m  程序初始化分配的堆内存大小是5m
        //-Xmx20m 程序能获得分配的最大内存是20M
        //-XX:+PrintGCDetails 控制台打印GC的详细日志  -XX:+PrintGC 控制台打印简单日志
        //-XX:+UseSerialGC  配置串行回收器
        //-XX:+PrintCommandLineFlags  打印传给虚拟机的配置参数
        /*eg:
            运行Demo,给定虚拟机参数如下
              -XX:InitialHeapSize=5242880 -XX:MaxHeapSize=20971520
              -XX:+PrintCommandLineFlags -XX:+PrintGCDetails 
              -XX:+UseCompressedClassPointers -XX:+UseCompressedOops 
              -XX:-UseLargePagesIndividualAllocation -XX:+UseSerialGC
         */ 

        System.out.println("最大分配的内存空间:"+maxMemory);
        System.out.println("空闲的内存空间:"+freeMemory);
        System.out.println("一共分配的内存空间:"+totalMemory);

        byte[] b1 = new byte[1*1024*1024];

        maxMemory = Runtime.getRuntime().maxMemory();
        freeMemory = Runtime.getRuntime().freeMemory();
        totalMemory = Runtime.getRuntime().totalMemory();

        System.out.println("分配了1M内存");
        System.out.println("最大分配的内存空间:"+maxMemory);
        System.out.println("空闲的内存空间:"+freeMemory);
        System.out.println("一共分配的内存空间:"+totalMemory);

        byte[] b2 = new byte[5*1024*1024];

        maxMemory = Runtime.getRuntime().maxMemory();
        freeMemory = Runtime.getRuntime().freeMemory();
        totalMemory = Runtime.getRuntime().totalMemory();

        System.out.println("分配了5M内存");
        System.out.println("最大分配的内存空间:"+maxMemory);
        System.out.println("空闲的内存空间:"+freeMemory);
        System.out.println("一共分配的内存空间:"+totalMemory);

        int b = 0x00000000fee10000;
        int a = 0x00000000fec00000;
        System.out.println("新生代内存空间大小为: "+ (b-a)/1024);
    }
}

运行结果

-XX:InitialHeapSize=5242880 -XX:MaxHeapSize=20971520 -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseSerialGC 
[GC (Allocation Failure) [DefNew: 1664K->191K(1856K), 0.0012625 secs] 1664K->601K(5952K), 0.0082026 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
最大分配的内存空间:20316160
空闲的内存空间:5402192
一共分配的内存空间:6094848
分配了1M内存
最大分配的内存空间:20316160
空闲的内存空间:4334600
一共分配的内存空间:6094848
[GC (Allocation Failure) [DefNew: 1339K->11K(1856K), 0.0058954 secs][Tenured: 1625K->1636K(4096K), 0.0014178 secs] 1749K->1636K(5952K), [Metaspace: 3266K->3266K(1056768K)], 0.0074605 secs] [Times: user=0.00 sys=0.02, real=0.01 secs] 
分配了5M内存
最大分配的内存空间:20316160
空闲的内存空间:4450208
一共分配的内存空间:11407360
新生代内存空间大小为: 2112
Heap
 def new generation   total 1920K, used 86K [0x00000000fec00000, 0x00000000fee10000, 0x00000000ff2a0000)
  eden space 1728K,   5% used [0x00000000fec00000, 0x00000000fec15b48, 0x00000000fedb0000)
  from space 192K,   0% used [0x00000000fedb0000, 0x00000000fedb0000, 0x00000000fede0000)
  to   space 192K,   0% used [0x00000000fede0000, 0x00000000fede0000, 0x00000000fee10000)
 tenured generation   total 9220K, used 6756K [0x00000000ff2a0000, 0x00000000ffba1000, 0x0000000100000000)
   the space 9220K,  73% used [0x00000000ff2a0000, 0x00000000ff9393c8, 0x00000000ff939400, 0x00000000ffba1000)
 Metaspace       used 3287K, capacity 4500K, committed 4864K, reserved 1056768K
  class space    used 359K, capacity 388K, committed 512K, reserved 1048576K

Process finished with exit code 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值