空间占用计算

编程入门 行业动态 更新时间:2024-10-26 08:35:06

<a href=https://www.elefans.com/category/jswz/34/1771407.html style=空间占用计算"/>

空间占用计算

空间占用计算

  • 背景
  • 研究
  • 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、内存使用大小计算

更多推荐

空间占用计算

本文发布于:2023-12-06 00:06:11,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1665824.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:空间

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!