美文网首页
深入理解 Java 虚拟机读书笔记4

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

作者: jkwen | 来源:发表于2021-01-16 16:11 被阅读0次

    对象内存分配与回收

    对象内存分配.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 进行设置。

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

    相关文章

      网友评论

          本文标题:深入理解 Java 虚拟机读书笔记4

          本文链接:https://www.haomeiwen.com/subject/rgfeaktx.html