为新对象分配内存是一个非常严谨和复杂的任务。JVM的设计者们不仅需要考虑内存如何分配、在哪里分配等问题,并且由于内存分配空间算法与内存回收算法密切相关,所以还需要考虑GC执行完内存回收是否会在内存空间中产生内存碎片。
Java对象的分配和回收过程:
- 创建的对象首先被放在Eden区。(此区有大小限制)
- Eden区空间填满时,程序又需要创建对象,JVM的垃圾收集器将会对Eden区进行YoungGC(Minor GC),将Eden区中的不再被其它对象所引用的对象进行销毁。后边再加载进来的新对象依然首选放到Eden区。
- 然后将Eden区中剩余对象移动到Survivor0区
- 如果再次触发YoungGC,此时上次幸存下来的对象将被S0区,如果没有回收,就会放到S1区。
- 如果再次经历垃圾回收,此时会重新放回S0区,接着再去S1区。
- 何时将对象转移到老年代区?可以设置对象的存活周期阈值。默认是15次。