10、JVM实战:内存分配策略:大对象直接进入老年代

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直接进老年代。