1,内存分配的位置
新的对象主要分配在java堆新生代上,极少数分配到老年代。
分配在eden区的内存进行回收的时候发生minor gc(只回收新生代,速度快)
大对象对java虚拟机来说是一个坏消息,容易导致gc提前触发。
因此程序中要避免大量朝生夕死的大对象,
jvm提供一个参数-XX:PretenureSizeThreshold,设置超过这个阈值的对象直接在老年代分配
2.长期存活的对象将进入老年代
jvm给对象提供一个age属性,在Eden区域分配了对象之后,在发生gc时候没有回收该对象,则移动到from survivor区域,设置age = 1,以后每发生一次gc,该对象仍然存活则age++,当年龄增加到一定程度后(默认为15),该对象进入老年代。
对于晋升老年代的阈值,可以通过参数-XX:MaxTenuringThredShold设置
jvm动态年龄判断
jvm并不是要求对象年龄一定到达设置的阈值才会进入老年代,当from survivor空间中同一代相同年龄的对象占到from 空间一半的时候,直接进入老年代。