内存分配主要遵循以下策略:
优先分配到eden区域
大对象直接分配到老年代
长期存活的对象分配到老年代
空间分配担保
动态对象年龄判断
*****************************************************************************************************************************
大对象直接分配到老年代:
一般大的对象是:字符串,或者是数组,虚拟机会自己算一个大对象大小值,大于这个值直接放老年代,大对象的大小临界值可以自己指定。
空间分配担保:
我是一个普通的Java对象,我出生在Eden区,在Eden区我还看到和我长的很像的小兄弟,我们在Eden区中玩了挺长时间。有一天Eden区中的人实在是太多了,我就被迫去了Survivor区的“From”区,自从去了Survivor区,我就开始漂了,有时候在Survivor的“From”区,有时候在Survivor的“To”区,居无定所。直到我18岁的时候,爸爸说我成人了,该去社会上闯闯了。于是我就去了年老代那边,年老代里,人很多,并且年龄都挺大的,我在这里也认识了很多人。在年老代里,我生活了20年(每次GC加一岁),然后被回收。
动态对象年龄判断:
为了能更好地适应不同程序的内存状况,虚拟机并不是永远地要求对象的年龄必须达到了MaxTenuringThreshold才能晋升老年代,如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄。