内存分配与回收策略

2017-12-08  本文已影响0人  cooolboy

声明:此篇文章是读《深入理解JAVA虚拟机》的笔记

/**
 *-Xmx20M -Xms20M -Xmn10M -XX:SurvivorRatio=8 -XX:+UseSerialGC -XX:+PrintGCDetails
 */
public class TestJVMGC{

    private static final int _1MB = 1024 * 1024;

    @Test
    public void testAllocation(){

        byte[] allocation1,allocation2,allocation3,allocation4;

        allocation1 = new byte[2 * _1MB];
        allocation2 = new byte[2 * _1MB];
        allocation3 = new byte[2 * _1MB];
        allocation4 = new byte[4 * _1MB];

    }

}

GC日志如下

[GC[DefNew: 7352K->1024K(9216K), 0.0058272 secs] 7352K->3226K(19456K), 0.0058685 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
[GC[DefNew: 5420K->0K(9216K), 0.0042320 secs] 7623K->7323K(19456K), 0.0042562 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heap
def new generation total 9216K, used 4270K [0x00000000f9a00000, 0x00000000fa400000, 0x00000000fa400000)
eden space 8192K, 52% used [0x00000000f9a00000, 0x00000000f9e2ba08, 0x00000000fa200000)
from space 1024K, 0% used [0x00000000fa200000, 0x00000000fa200060, 0x00000000fa300000)
to space 1024K, 0% used [0x00000000fa300000, 0x00000000fa300000, 0x00000000fa400000)
tenured generation total 10240K, used 7322K [0x00000000fa400000, 0x00000000fae00000, 0x00000000fae00000)
the space 10240K, 71% used [0x00000000fa400000, 0x00000000fab26bb0, 0x00000000fab26c00, 0x00000000fae00000)
compacting perm gen total 21248K, used 4613K [0x00000000fae00000, 0x00000000fc2c0000, 0x0000000100000000)
the space 21248K, 21% used [0x00000000fae00000, 0x00000000fb281758, 0x00000000fb281800, 0x00000000fc2c0000)

  可见,allocation1,allocation2,allocation3都被放到了Tenured(老年代)中,allocation4被放到了Eden中。这是因为虚拟机在给allocation4分配内在时,发现Eden区域的内存已经不够使用了,发生了一次Minor GC,但是GC期间虚拟机又发现已有的3个2M的大小对象全部无法放入Survivor空间(1M大小),所以只好通过分配担保机制提前转移到老年代去。
Tips:
  新生代GC(Minor GC):指发生在新生代的垃圾收集动作。因为Java对象大多具备朝生夕灭的特性,所以Minor GC非常频繁。
  老年代GC(Major GC/Full GC):指在老年代的GC。

/**
 * -Xmx20M -Xms20M -Xmn10M -XX:SurvivorRatio=8 -XX:+UseSerialGC -XX:+PrintGCDetails
 * -XX:PretenureSizeThreshold=3145728
 */
public class TestJVMPretenureSizeThreshold {

    private static final int _1MB = 1024 * 1024;

    public static void main(String[] args) {

        byte[] allocation;

        allocation = new byte[4 * _1MB];

    }


}

GC运行日志:

Heap
def new generation total 9216K, used 1331K [0x00000000f9a00000, 0x00000000fa400000, 0x00000000fa400000)
eden space 8192K, 16% used [0x00000000f9a00000, 0x00000000f9b4cc58, 0x00000000fa200000)
from space 1024K, 0% used [0x00000000fa200000, 0x00000000fa200000, 0x00000000fa300000)
to space 1024K, 0% used [0x00000000fa300000, 0x00000000fa300000, 0x00000000fa400000)
tenured generation total 10240K, used 4096K [0x00000000fa400000, 0x00000000fae00000, 0x00000000fae00000)
the space 10240K, 40% used [0x00000000fa400000, 0x00000000fa800010, 0x00000000fa800200, 0x00000000fae00000)
compacting perm gen total 21248K, used 2755K [0x00000000fae00000, 0x00000000fc2c0000, 0x0000000100000000)
the space 21248K, 12% used [0x00000000fae00000, 0x00000000fb0b0c28, 0x00000000fb0b0e00, 0x00000000fc2c0000)

上一篇 下一篇

猜你喜欢

热点阅读