网站首页 > java教程 正文
1.前言
分析之前,简单回顾一下对象的内存分布。
在HotSpot虚拟机中,对象在堆内存中的存储布局可以划分为三部分:对象头、实例数据和对齐填充。
- 对象头包含两部分内容:MarkWord和类型指针。
- 实例数据是对象真正存储的有效信息,即类型定义的各种类型的字段内容。
- 对齐填充不是必须的。HotSpot虚拟机要求对象大小必须是8字节的整数倍,不足8的倍数才需要进行填充。
2.分析Java8的String内存占用
我们的分析过程暂且忽略对齐填充的。
/** The value is used for character storage. */
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
如上代码,Java8中String类定义了两个成员变量:
- char数组类型的value
- int类型的hash
因此不难看出String对象所占用内存空间包含3部分:
- String对象本身占用空间
- char数组对象占用空间
- char数组元素占用空间
2.1.String对象本身空间占用分析
- 对象头MarkWord占用8个字节。
- 对象头类型引用占用4个字节。
- char数组引用占用4个字节。
- int类型的hash占用4个字节。
String字符串本身占用空间:
24字节 = 字符串头MarkWord(8字节)
+ 字符串头类型引用(4字节)
+ char数组引用(4字节)
+ int类型hash(4字节)
2.2.char数组对应占用空间分析
- 对象头MarkWord占用8个字节。
- 对象头类型引用占用4个字节。
- 数组长度int类型占用4个字节。
char数组占用空间:
16字节 = 字符串头MarkWord(8字节)
+ 字符串头类型引用(4字节)
+ int类型数组长度(4字节)
2.3.char数组元素占用空间分析
每个char元素占用2字节,设数组长度为n,则char数组元素占用空间为2*n。
char数组元素占用空间=2*n
3.结论
忽略对齐填充,定义1个字符串对象,所占内存计算空间计算公式为:
24+16+2n=40+2n
String对象占用空间
=String对象本身占用空间 + char数组对象本身占用空间 + char数组元素占用空间
=24+16+2n=40+2n
以 new String("Hello World")为例:??
"Hello World"的长度为11,则占用空间为: 40B + 2B * 11 = 42B。
猜你喜欢
- 2024-11-21 期末了还没复习JAVA?莫慌,重点难点知识点都在这。字符串基础
- 2024-11-21 字符串去符号转化为数组 #php
- 2024-11-21 JavaScript 数组常用操作
- 2024-11-21 610、springboot输出数组
- 2024-11-21 Java入门到高级学习-C3 Java基本数据类型变量运算和字符串运算
- 2024-11-21 Axure RP 9 学习笔记 - 字符串函数(3)- 转数组及其他
- 2024-11-21 前端 传来的json数组字符串 后台如何转换
你 发表评论:
欢迎- 最近发表
-
- 五,网络安全IDA Pro反汇编工具初识及逆向工程解密实战
- 「JAVA8」- Lambda 表达式(java lambda表达式原理)
- 深入探讨Java代码保护:虚拟机保护技术的新时代
- Nginx反向代理原理详解(图文全面总结)
- 逆向拆解日本IT,哪些Java技术栈薪资溢价高
- mybatis 逆向工程使用姿势不对,把表清空了,心里慌的一比
- Spring Boot集成ProGuard轻松实现Java 代码混淆, Java 应用固若金汤
- 从 Java 代码逆向工程生成 UML 类图和序列图
- 人与人相处:尊重是标配,靠谱是高配,厚道是顶配
- Windows系统安装日期如何修改(windows10怎么修改安装日期)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)