空间占用计算

空间占用计算

  • 背景
  • 研究
  • agent测试对象占用空间大小
  • 疑问
  • 参考

背景

1、最近同事有提出一个性能优化场景,就是异步定时发送数据埋点时,每次都会触发GC,然后他分析了之后,说是数据类型选择不当导致的,String应该改为char,能更省空间一些,然后说了一下开销,听得我一愣一愣的。。。
2、在内网也有看到一些功能案例里的性能优化,就是对数据结构的调整。例如不适用HashMap,而是改用Netty中的IntObjectHashMap,其中说到的原因是HashMap存在基本类型到包装类型的拆箱装箱开销。。

研究

基本类型占用指定的空间大小,例如int占用4个字节
类对象构成:
对象头(housekeeping):早期的JVM是8个字节,之后一般对象头为12个字节,数组的话多4个字节,用来存储长度
类字段:
1、基本类型字段,固定大小
2、引用字段,4个字节
填充对其字段:8字节向上取整

例如Integer, 一种解释是12字节对象头,4字节基本类型字段;另一种是8字节对象头,4字节基本类型,然后4字节对齐。。

agent测试对象占用空间大小

参考文档
示例demo

在这个目录下运行run.sh即可
Person中一个int属性执行后为16,一个Integer执行后也为16。因为后者是引用,也是4个字节。。String也类似。。

疑问

String最小空间计算公式为(jdk6)
Minimum String memory usage (bytes) = 8 * (int) ((((no chars) * 2) + 45) / 8)
这个45是怎么出来的呢,
其中有一个7 用来向上取整的
char[] 数组头 12字节,填充4字节对齐,那么16字节
string头 8个字节 3个int属性 12字节
这里如果不对齐,那么就是 36+7=42 如果对其,那么就是 40+7=47。如果char[]数组也不对其,那么就是38或者43,怎么都不会是45。。。

参考

1、stackOverFlow类型问题回答
2、对象内存使用介绍
3、常见java对象内存使用大小
4、内存使用大小计算

你可能感兴趣的:(java,研究,problems,java,jdk)