对象的内存分配主要是在堆上分配。根据具体的java虚拟机和相关的配置的不同,可能会存在一定的差异,不过大体上主要如下的几个规则:
1、对象会优先在Eden上分配
对象在一般情况上大多数会在新生代的Eden上分配内存,当内存不足时,虚拟机会发起一次MinorGC。
2、大对象会直接进入老年代
这里的大对象是指那些需要大量连接的内存空间的对象,例如:那些很长的字符串和数组。
3、长时间存活的对象会进入到老年代
一般来说,对象在Eden出生并且经历一次MinorGC,而已能survivor空间中,就对象年龄+ 1,当年龄大于阈值时,就会进入到老年代。其中阈值有一个默认值,也可以通过配置来设定。