对象内存布局和分配过程

对象内存布局

对象内存分配过程

  1. 对象新建优先分配在 Eden 区(大对象会直接分配到老年代,多大的对象是大对象可以配置)

  2. 当 Eden 满了,还有对象进来,触发 minor GC

  3. minor GC 过程

    如果是垃圾(引用计数法、可达性法确定是否是垃圾)就删除,如果不是垃圾,就把对象移动到幸存1区,存活对象年龄+1,此时伊甸园为空,s0 有对象,s1 为空

    如果还有对象创建,再次放不下,继续触发 minior GC

    1. 幸存区也要 GC,先 GC 幸存区,把 s0 的垃圾回收,然后把 Eden 存活的对象移动到 s0

    2. 把 s0 的对象复制到 s1

      原来 s1 是空,现在 s0 是空,两个幸存区总有一个是空的,也就是会浪费一半的空间,所以幸存区不要设置过大,至于为什么要这样,因为每个区有不同的垃圾回收算法,后面 GC 的时候说

      幸存区的两个区也有说成 from 和 to 区,哪个为空,哪个就是 to 区

  4. 只要新生代空间够,就不停发生 minor GC,幸存区的 from 和 to 就不停交换复制,当对象年龄达到 15(默认,可以改)时,对象放入老年代

  5. 老年代空间不够的时候,发生 full GC,老老年代内存不足时,发生 OOM

posted @ 2023-04-14 11:44  CyrusHuang  阅读(16)  评论(0编辑  收藏  举报