10–内存分配策略–大对象直接进入老年代
1、大对象介绍
1、 需要大量连续内存空间的Java对象;
2、 最典型的大对象就是那种很长的字符串以及数组;
3、 大对象对虚拟机的内存分配来说就是一个坏消息,经常出现大对象容易导致内存还有不少空间时就提前触发GC以获取足够的连续空间来"安置"它们;
1、 比大对象更加坏的消息就是遇到一群"朝生夕灭"的"短命大对象";
4、 -XX:PretenureSizeThreshold:大于这个设置值的对象直接在老年代分配,避免在Eden区及两个Survivor区之间发生大量的内存复制;
2、测试
2.1、代码
package com.fei.zhou.day1;
/**
*
* @描述:大对象分配
* @author feiZhou
* @date 2018年11月21日上午9:17:12
* @version 1.0
*/
public class PretenureSizeAllocation {
private static final int _1MB = 1024*1024;
/**
* VM参数:-XX:+UseSerialGC -XX:+PrintGCDetails -verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:SurvivorRatio=8
* -XX:+PretenureSizeThreshold=3145728//对象大于3M,就进入老年代
*/
@SuppressWarnings("unused")
public static void main(String[] args) {
byte[] allocation1;
# 设置对象4M大小
allocation1 = new byte[4 * _1MB];
}
}
2.2、日志
Heap
def new generation total 9216K, used 1010K [0x00000000f9a00000, 0x00000000fa400000, 0x00000000fa400000)
eden space 8192K, 12% used [0x00000000f9a00000, 0x00000000f9afc938, 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 2538K [0x00000000fae00000, 0x00000000fc2c0000, 0x0000000100000000)
the space 21248K, 11% used [0x00000000fae00000, 0x00000000fb07aac0, 0x00000000fb07ac00, 0x00000000fc2c0000)
No shared spaces configured.
3、分析
eden区没有被使用,老年代使用了4M,内存分配的时候直接给老年代,因为我们配置参数,大于3M直接进老年代。