对象在 JVM 中存在的形态
Book 对象在 JVM 运行时中的状态是怎样的呢?
![](https://img.haomeiwen.com/i5638694/b3f34faddce9e3fb.png)
Book 类对象存储在 JVM 里,总共由 3 个部分组成,分别是对象头、实例数据和对齐填充。
![](https://img.haomeiwen.com/i5638694/4b72f28899afab2a.png)
对象头部分
通常情况下对象头包含两部分,一部分是 mark word,默认为 8 字节,另一部分是类元数据指针 Klass Pointer,4 字节或 8 字节,这取决于 JVM 启动参数 UseCompressedOops 的设置,我们下面假设起始值为 4 字节,所以对象头部的大小默认是 12 字节。
实例数据部分
Book 类有四个字段,分别为 Long 型的 no、String 型的 name、String 型的 desc 以及 Long 型的 readedCnt。因为这四个字段的类型都是引用类型,占用的内存取决于平台,64 位 JVM 下默认开启压缩指针压缩 Oops 的占 4 字节,未开启则占 8 字节。所以实例数据部分的大小是 16 字节或 32 字节。
对齐填充部分
由于 JVM 自动内存管理系统要求对象起始地址必须是 8 字节的整数倍,也就是说一个对象的总大小必须是 8 的倍数,所以可能存在对齐填充。在已经开启压缩 Oops 的情况下,对象头部占 12 字节,实例数据占 16 字节,共 28 字节。由于必须是 8 字节的整数倍,所以需要填充 4 个字节,变成 32 字节。而在未开启压缩 Oops 的情况下,对象头部 12 字节,实例数据 32 字节,一共 44 字节,需要填充 4 字节,变成 48 字节。因此,Book 类的对象在 JVM 里占用的大小是 32 字节或者 48 字节。
对象的大小是我们平时很容易忽视的内容,但你设想一下百万级 TPS 的系统,如果每秒都需要创建百万级的 Book 大小,那么仅仅一个指针压缩都能给我们带来巨大的收益,不仅可以降低成本、提升性能,还能有效避免 FULL GC,也许这就是我们需要了解 JVM 底层实现的意义。
创建型设计模式
建造者模式
Book 类有四个属性,它的构造函数的参数也是四个,如果 Book 类有更多的参数呢,如果有的参数是必填,有些是选填,构造函数应该如何设计呢?当参数超过 10 个或者更多的时候,按照之前的方式,显然构建的难度会越来越大,可维护性越来越差,参数传错以及排错的难度也会同步增加。好在业界的前辈们已经为我们想好了解决方案,针对这种复杂对象的构建我们可以使用建造者模式。
建造者模式(Builder Pattern)又名生成器模式,它是一种对象构建模式,用于将复杂对象的建造过程抽象出来, 使这个抽象过程的不同实现方法可以构造出不同属性的对象。
此文章为9月Day18学习笔记,内容来源于极客时间《云时代JVM实战 》,强烈推荐该课程
网友评论