java虚拟机(五)--内存分配回收策略

来源:互联网 发布:山东省农产品出口数据 编辑:程序博客网 时间:2024/05/22 14:54

对象内存分配,大方向是分配在新生代的Eden区,如果启动了本地线程分配缓冲,就分配在TLAB上,少数时候直接分配在老年代中,分配规则与虚拟机选择的内存参数和垃圾收集器有关。

在jdk 1.8的环境下:

虚拟机参数:-Xms20M-Xmx20M-Xmn10M-XX:+PrintGCDetails-XX:SurvivorRatio=8
    public static int _1mb=1024*1024;    public static void main(String[] args) {        byte[] a1,a2,a3,a4;        a1=new byte[2*_1mb];        a2=new byte[2*_1mb];        a3=new byte[2*_1mb];        a4=new byte[4*_1mb];    }

GC日志信息

[GC (Allocation Failure) [PSYoungGen: 6428K->728K(9216K)] 6428K->4832K(19456K), 0.0073317 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] Heap PSYoungGen      total 9216K, used 7193K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)  eden space 8192K, 78% used [0x00000000ff600000,0x00000000ffc50710,0x00000000ffe00000)  from space 1024K, 71% used [0x00000000ffe00000,0x00000000ffeb6030,0x00000000fff00000)  to   space 1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000) ParOldGen       total 10240K, used 4104K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)  object space 10240K, 40% used [0x00000000fec00000,0x00000000ff002020,0x00000000ff600000) Metaspace       used 3487K, capacity 4496K, committed 4864K, reserved 1056768K  class space    used 386K, capacity 388K, committed 512K, reserved 1048576K

给a3分配内存时,eden space(有2.4M的空间不知道是什么占用的,此时占用了2.4+2+2=6.4,剩余1.6)空间不足,所以触发GC。把对象a1,a2(幸存代放不下)移到老年代,然后剩余的一些对象(不清楚是什么)迁移到新生代中的幸存代。a3放到新生到EDEN区,a4也是
最终新生代用了(6+2.4)M,老年代用了4M。