java对象内存结构-java开发java经验技巧

java对象内存结构-java开发java经验技巧

ID:30776004

大小:109.05 KB

页数:7页

时间:2019-01-03

java对象内存结构-java开发java经验技巧_第1页
java对象内存结构-java开发java经验技巧_第2页
java对象内存结构-java开发java经验技巧_第3页
java对象内存结构-java开发java经验技巧_第4页
java对象内存结构-java开发java经验技巧_第5页
资源描述:

《java对象内存结构-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、Java对象内存结构-Java开发Java经验技巧Java对象内存结构木文由ImportNew・郑雯翻译自codeinstructionso欢迎加入翻译小组。转载请见文末要求。原文于2008年11月13F1发表,2008年12月18F1更新:这里还有一篇关于Java的Sizcof运算符的实用库的文章。学C/C++岀身的我,对Java^j一点非常困惑,那就是缺乏计算对象占用内存大小的机制。而在C++中就可以通过sizeof运算符來获得基木类型以及类实例的大小。C和C++中的这个操作符对于指针运算、内存

2、拷贝和10操作都非常有用。Java中并没有一个类似的运算符。事实上,Jova也不需要这种运算符。Java中基本类型的大小在语言规范中已经定义了,而C/C++中基本类型大小则跟平台相关。Java冇自己的通过序列化构建的10框架。再者,由于Java中没冇指针,因此指针运算和内存块拷贝之类的操作也不存在。但是,Java程序员有吋还是希望能知道一个Java对象到底用了多少内存的。不过这个问题的答案并不简单。首先要区分清楚的是shallowsize和deepsize。Shallowsize是指对象自身占用的内

3、存大小,其引用对象的大小不算在内。而deepsize,则是自身所占内存大小和其递归引用的所有对象所占内存大小的总和。大多数情况卞,你会希望获得一个对象的deepsize,但是为了知道这个值,首先耍知道怎么算shallowsize,下面我來介绍一下。有人抱怨JVM规范中没有针对运行时Java对象的内存结构的说明,这也就是说JVM供应商可以按照自己的需要来实现这一点。后果就是,同一个类在不同的JVM上运行的实例对彖占用的内存大小会有差别。好在是世界上大部分人(包括我在内)都使用SunHotSpot虚拟机

4、,这就大大简化了这个问题。我们接下来的讨论也会基于32位的Sun公司的JVM。下面我介绍一•些规则來辅助解释JVM如何组织对象在内存中的布局的。没有实例属性的类的内存布局在SunJVM中,(除了数组Z外的)对象都有两个机器字(words)的头部。第一个字中包含这个对象的标示哈希码以及其他一些类似锁状态和等标识信息,第二个字中包含一个指向对象的类的引用。另外,任何对象都是8个字节为粒度进行对齐的。这就是对彖内存布局的第一个规则:规则1:任何对彖都是8个字节为粒度进行对齐的。比如,如果调用newObje

5、ct(),由Object类并没有其他没冇其他可存储的成员,那么仅仅使用堆中的8个字节来保存两个字的头部即可。继承了Object的类的内存布局除了上面所说的8个字节的头部,类属性紧随其后。属性通常根据其人小來排列。例如,整型(int)以4个字节为单位对齐,长整型(long)以8个字节为单位对齐。这里是出丁•性能考虑而这么设计的:通常情况下,如呆数据以4字节为单位对齐,那么从内存中读4字节的数据并写入到处理器的4字节寄存器是性价比更高的。为了节省内存,SunVM并没有按照属性声明时的顺序来进行内存布局。

6、实际上,厲性在内存中按照下面的顺序来组织:1.双精度型(doubles)和长整型(longs)2.整型(ints)和浮点型(floats)3.短整型(shorts)和字符型(chars)4.布尔型(booleans)和字节型(bytes)5.引用类型(references)内存使用率会通过这个机制得到优化。例如,如下声明一个类:classMyClass{bytea;intc;booleand;longe;Objectf;}如果JVM并没冇打乱屈性的声明顺序,其对象内存布局将会是下而这个样子:[HEA

7、DER:8bytes]8[a:1byte]9[padding:[c:[d:[padding:[e:[f:[padding:3bytes]124bytes]161byte]177bytes]248bytes]324bytes]364bytes]40[HEADER:[e:[c:[a:[d:[padding:[f:[padding:8bytes]8bytes]4bytes]1byte]1byte]2bytes]4bytes]4bytes]816202122242832此吋,用丁•山位的14个字节是浪费的,

8、这个对象一共使用了40个字节的内存空间。但是,如果用上面的规则对这些对象重新排序,其内存结果会变成下面这个样子:这次,用于占位的只有6个字节,这个对象使用了32个字节的内存空间。因此,对彖内存布局的第二个规则是:规则2:类属性按照如卜•优先级进行排列:长整型和双粋度类型;整型和浮点型;字符和短整型;字节类世和布尔类黑,最后是引用类型,这些屈性都按照各自的单位对齐。现在我们知道如何计算一个继承了Object的类的实例的内存大小了。下面这个例子用來做下练习:java.la

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。