1.对象优先在Eden分配
大多数情况下, 对象在新生代Eden区中分配。 当Eden区没有足够空间进行分配时, 虚拟机将发起一次Minor GC。HotSpot虚拟机提供了-XX: +PrintGCDetails这个收集器日志参数, 告诉虚拟机在发生垃圾收集行为时打印内存回收日志, 并且在进程退出的时候输出当前的内存各区域分配情况。 在实际的问题排查中, 收集器日志常会打印到文件后通过工具进行分析 。
接下来在如下的代码片段testAllocation()方法中 ,我们尝试分配三个2MB大小和一个4MB大小的对象, 在运行
时通过-Xms20M、 -Xmx20M、 -Xmn10M这三个参数限制了Java堆大小为20MB, 不可扩展, 其中
10MB分配给新生代, 剩下的10MB分配给老年代。 -XX: Survivor-Ratio=8决定了新生代中Eden区与一
个Survivor区的空间比例是8∶ 1
/**
* VM参数: -verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:+UseSerialGC
* 这里我们先手动指定垃圾收集器为客户端模式下的Serial+Serial Old的收集器组合进行内存回收。
* 由于不同的收集器的收集机制不同,为了呈现出内存分配的担保效果,我们这里需要手动指定为Serial+Serial Old模式。
*/
public class Test {
private static final int _1MB = 1024 * 1024;
public static 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]; // 出现一次Minor GC
}
public static void main(