对象内存布局和分配过程
对象内存布局
![](https://img2024.cnblogs.com/blog/3095527/202408/3095527-20240818094247451-686794220.png)
对象内存分配过程
-
对象新建优先分配在 Eden 区(大对象会直接分配到老年代,多大的对象是大对象可以配置)
-
当 Eden 满了,还有对象进来,触发 minor GC
-
minor GC 过程
如果是垃圾(引用计数法、可达性法确定是否是垃圾)就删除,如果不是垃圾,就把对象移动到幸存1区,存活对象年龄+1,此时伊甸园为空,s0 有对象,s1 为空
如果还有对象创建,再次放不下,继续触发 minior GC
-
幸存区也要 GC,先 GC 幸存区,把 s0 的垃圾回收,然后把 Eden 存活的对象移动到 s0
-
把 s0 的对象复制到 s1
原来 s1 是空,现在 s0 是空,两个幸存区总有一个是空的,也就是会浪费一半的空间,所以幸存区不要设置过大,至于为什么要这样,因为每个区有不同的垃圾回收算法,后面 GC 的时候说
幸存区的两个区也有说成 from 和 to 区,哪个为空,哪个就是 to 区
-
-
只要新生代空间够,就不停发生 minor GC,幸存区的 from 和 to 就不停交换复制,当对象年龄达到 15(默认,可以改)时,对象放入老年代
-
老年代空间不够的时候,发生 full GC,老老年代内存不足时,发生 OOM