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

时间:2022-12-23 18:42:29

对象内存分配,大方向是分配在新生代的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。