推荐资源汇总
自由只存在于束缚之中,没有堤岸,哪里来江河? —— 金斯伯格
目前主流的垃圾收集器都会采用分代回收算法,因此,新创建的对象都会优先分派在新生代的Eden区内,在新生代中为了防止内存碎片问题,因此垃圾收集器一般都选用"复制"算法。
堆内存的新生代分为:Eden区+Survior1区+Survior2区
在对象的对象头信息中存储着对象的迭代年龄(MaxTenuringThreshold),迭代年龄会在每次 YoungGC之后对象的移区操作中增加, 每执行一次MiniorGC。当这个年龄大于到 15(默认) 之后, 这个对象将会被移入老年代.
可以通过这个参数设置这个年龄值:
- XX:MaxTenuringThreshold
我们可以通过这个参数设置大对象,这个限额的大小:
- XX:PretenureSizeThreshold
注意:此参数只对Serial及ParNew两款收集器有效
*若Survior(to)区剩余内存太少,导致对象无法放入该区域时,就会启用"分配担保",将多出的数据对象直接存转移到老年代/或者直接放入老年代,然后清空Eden区和Survior(from)区
虚拟机并不总是要求对象的年龄必须达到MaxTenuringThreshold才能晋升到老年代, 如果在Survivor区中相同年龄(设年龄为age)的对象的所有大小之和超过Survivor空间的一半,年龄大于或等于该年龄(age)的对象就可以直接进入老年代,无需等到 MaxTenuringThreshold中要求的年龄。
平常的代码创建对象都属于强引用,之后当对象变为垃圾对象才会被回收。
被SoftReference这个类包裹起来的对象,在进行垃圾收集发现剩余空间不够的时候,全部已创建软引用对象会被一次性回收,这种引用类型常用于对内存比较敏感的缓存中
被WeakReference这个类包裹起来的对象,每次进行垃圾收集操作的时候都会将弱引用对象一次性回收,基本不使用
plantomReference又称幽灵引用,随时都会被回收
此策略发生在Survivor区,当Survivor区中的一批对象的总大小大于Survivor区空间大小的一半,在这个区域中,对象年龄大于这批对象的最大年龄的所有对象会被移入老年代.
观察这几条策略并结合GC区别我们可以发现一些端倪。
因此在程序运行过程中,合理设置参数,使一些可能长期存活的框架对象与缓存对象,一些大对象应放入老年代。