堆被划分为新生代和老年代,新生代又分为eden区和s0、s1区。
新创建的对象存放在eden区,当eden区满时,执行gc,将eden中的存活对象存放到s0区中。当eden区再一次满时,执行gc,同时执行复制算法,将eden区和s0区存活对象存放到s1区中,同时交换s0和s1的角色。当对象复制达到16次时,对象被存放在老年代。
为什么新生代需要两个survivor区?
如果只有一个survivor区的话,每次执行gc后,存活的对象都被放在这个survivor区中,会导致内存使用的不连续,即产生碎片。而使用两个survivor区的话,每次执行gc后,eden区和s0区的存活对象就被存放在s1区中,避免了碎片的产生。
堆的新生代和老年代的理解
最新推荐文章于 2022-10-09 15:23:13 发布