深入理解 Java 虚拟机读书笔记4

2021-01-16  本文已影响0人  jkwen

对象内存分配与回收

对象内存分配.jpg

根据之前说的回收算法,Java 堆会被分为新生代和老年代,并且新生代中又分为 Eden 和 Survivor,HotSpot 虚拟机的比例是 8 :1,大致如上图所示。

对象优先分配在 Eden

即申请内存空间时,优先考虑 Eden + Survivor 区(图中蓝色区域),如果空间不足,会触发 Minor GC 来获取足够的空间分配。

Minor GC 是指发生在新生代的垃圾回收操作,其特点是频繁,速度快,那么回收后仍存活的对象会被放入 Survivor 区(图中红色区域),如果空间不足才会进入老年代。

老年代如果也不够的话,会进行 Full GC(或者叫 Major GC),相比 Minor GC 会慢很多,所以尽量不要触发 Full GC。

图中文字描述就是一次简单对象内存分配的过程。

大对象直接分配在老年代

大对象是指需要大量连续的内存空间的对象,例如字符串,数组。这种对象其实虚拟机并不喜欢,所以要尽量避免创建大对象。

年龄计数器

对象一开始是在新生代区的,但随着一次一次的 Minor GC 还存活着的对象,就可能进入老年代(一种就像图中所描述的情况,一种就是年龄增长到了一定值,就像我们到了18岁就算成人了),这里一次 Minor GC 就算一年,存活的对象就增长一岁,默认初始为 1 岁,最大 15 岁就会进入老年代,当然也可通过 -XX:MaxTenuringThreshold 进行设置。

不过,实际情况并非一定要到了年龄才进入老年代,就像图中所描述的,发现条件不满足继续待在新生代时,也就进入了老年代。

上一篇下一篇

猜你喜欢

热点阅读