JVM内存分配与回收策略
对象优先在Eden分配
SurvivorRatio:将新生代中Eden区域与Survivor区域的容量比值,默认为8,代表Eden:Survivor=8:1
1 public class TestObjectForEden { 2 3 private static final int _1MB=1024*1024; 4 5 public static void testAllocation(){ 6 byte[] allocation1,allocation2,allocation3,allocation4; 7 allocation1=new byte[2*_1MB]; 8 allocation2=new byte[2*_1MB]; 9 allocation3=new byte[2*_1MB]; 10 allocation4=new byte[2*_1MB];//出现一次Minor GC 11 } 12 13 public static void main(String[] args) { 14 testAllocation(); 15 } 16 17 }
运行结果为:
虚拟机参数为:-verbose:gc -Xms20M -Xmx20M -Xmn20M -XX:+PrintGCDetails -XX:SurvivorRatio=8
Heap
def new generation total 18432K, used 12838K [0x03c00000, 0x04ff0000, 0x04ff0000)
eden space 16448K, 78% used [0x03c00000, 0x04889b68, 0x04c10000)
from space 1984K, 0% used [0x04c10000, 0x04c10000, 0x04e00000)
to space 1984K, 0% used [0x04e00000, 0x04e00000, 0x04ff0000)
tenured generation total 64K, used 0K [0x04ff0000, 0x05000000, 0x05000000)
the space 64K, 0% used [0x04ff0000, 0x04ff0000, 0x04ff0200, 0x05000000)
Metaspace used 2109K, capacity 2312K, committed 2368K, reserved 4480K
虚拟机参数为:-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8
[GC (Allocation Failure) [DefNew: 8093K->1016K(9216K), 0.0158618 secs] 8093K->5135K(19456K), 0.0289222 secs] [Times: user=0.00 sys=0.01, real=0.03 secs]
Disconnected from the target VM, address: '127.0.0.1:57678', transport: 'socket'
Heap
def new generation total 9216K, used 5354K [0x04000000, 0x04a00000, 0x04a00000)
eden space 8192K, 52% used [0x04000000, 0x0443ca98, 0x04800000)
from space 1024K, 99% used [0x04900000, 0x049fe0d8, 0x04a00000)
to space 1024K, 0% used [0x04800000, 0x04800000, 0x04900000)
tenured generation total 10240K, used 4119K [0x04a00000, 0x05400000, 0x05400000)
the space 10240K, 40% used [0x04a00000, 0x04e05cb0, 0x04e05e00, 0x05400000)
Metaspace used 2109K, capacity 2312K, committed 2368K, reserved 4480K
在通过运行时通过设置虚拟机参数-Xms20M -Xmx20M -Xmn10M限制Java堆大小为20MB,不可扩展,10MB分配给新生代,剩下10MB分给老年代。
1 public class TestObjectForEden { 2 3 private static final int _1MB=1024*1024; 4 5 public static void testAllocation(){ 6 byte[] allocation1,allocation2,allocation3,allocation4; 7 allocation1=new byte[2*_1MB]; 8 allocation2=new byte[2*_1MB]; 9 allocation3=new byte[2*_1MB]; 10 allocation4=new byte[4*_1MB];//出现一次Minor GC 11 } 12 13 public static void main(String[] args) { 14 testAllocation(); 15 } 16 17 }
[GC (Allocation Failure) [DefNew: 8093K->1016K(9216K), 0.0168326 secs] 8093K->5135K(19456K), 0.0169262 secs] [Times: user=0.00 sys=0.01, real=0.02 secs]
Heap
def new generation total 9216K, used 7402K [0x03e00000, 0x04800000, 0x04800000)
eden space 8192K, 77% used [0x03e00000, 0x0443ca98, 0x04600000)
from space 1024K, 99% used [0x04700000, 0x047fe0d8, 0x04800000)
to space 1024K, 0% used [0x04600000, 0x04600000, 0x04700000)
tenured generation total 10240K, used 4119K [0x04800000, 0x05200000, 0x05200000)
the space 10240K, 40% used [0x04800000, 0x04c05cb0, 0x04c05e00, 0x05200000)
Metaspace used 2109K, capacity 2312K, committed 2368K, reserved 4480K
1 public class TestObjectForEden { 2 3 private static final int _1MB=1024*1024; 4 5 public static void testAllocation(){ 6 byte[] allocation1,allocation2,allocation3,allocation4; 7 allocation1=new byte[2*_1MB]; 8 allocation2=new byte[2*_1MB]; 9 allocation3=new byte[2*_1MB]; 10 allocation4=new byte[6*_1MB];//出现一次Minor GC 11 } 12 13 public static void main(String[] args) { 14 testAllocation(); 15 } 16 17 }
[GC (Allocation Failure) [DefNew: 8093K->1016K(9216K), 0.0159405 secs] 8093K->5135K(19456K), 0.0160188 secs] [Times: user=0.00 sys=0.02, real=0.02 secs]
[GC (Allocation Failure) [DefNew: 3064K->0K(9216K), 0.0097685 secs] 7183K->7000K(19456K), 0.0098040 secs] [Times: user=0.00 sys=0.02, real=0.01 secs]
Heap
def new generation total 9216K, used 6226K [0x04800000, 0x05200000, 0x05200000)
eden space 8192K, 76% used [0x04800000, 0x04e14938, 0x05000000)
from space 1024K, 0% used [0x05000000, 0x05000000, 0x05100000)
to space 1024K, 0% used [0x05100000, 0x05100000, 0x05200000)
tenured generation total 10240K, used 7000K [0x05200000, 0x05c00000, 0x05c00000)
the space 10240K, 68% used [0x05200000, 0x058d6088, 0x058d6200, 0x05c00000)
Metaspace used 2109K, capacity 2312K, committed 2368K, reserved 4480K