黑马程序员技术交流社区

标题: 声明 一个类变量需要占用多少内存 [打印本页]

作者: xiaochongbojue    时间: 2014-10-21 17:46
标题: 声明 一个类变量需要占用多少内存
当我们声明一个基本变量的时候,我们知道他所占用的内存是固定的,比如int是4字节,char是2字节,那么加入我声明一个Object 对象呢,他所占用的内存是多少呢
作者: 紫缘ぶ逸影    时间: 2014-10-21 19:22

Java的自动内存管理机制(automatic storage management system known as a garbage collector)省却了很多编码工作,大大地提高了Java的生产力,而且JVM的性能也越来越好,特别是G1的出现,改善了垃圾回收中stop the world的状况。

也许很多人都没有考虑过这个问题,new一个Object对象到底占用多少内存呢( Object obj = new Object() )?

这里很明确的是obj是一个指向对象的引用(reference - there are three kinds of reference types: class types,array types, and interface types),引用的长度决定了Java的寻址能力,32位的JDK是4字节,64位的JDK是8字节(指针未被压缩的情况下)。

因为obj对象没有任何数据(field),会在堆上为它分配空间吗?如果分配空间,里面存储了什么内容?

以面向对象的思维来分析,对象封装了数据和行为,是一个统一的整体,虽然obj对象没有数据,但是有行为(Object类定义了12个方法)。当我们执行完new操作后,obj的值为堆内存的地址,既然obj都指向一块内存了,说明是会在堆上为其分配空间的。

那么分配的空间有多大,存储了什么内容呢?在The Java Virtual Machine Specification Java SE 7 Edition和The Java Language Specification Java SE 7 Edition里面没有找到相关的描述,这很可能是属于JVM实现自由控制的范畴了。我们可以利用JDK自带的工具jvisualvm.exe来查看分配的空间有多大。为了方便在jvisualvm中查看对象占多少内存,这里使用一个私有的静态内部类EmptyObject来替代Object,因为类定义为空,所以可以等同对待EmptyObject和Object。
作者: xiaochongbojue    时间: 2014-10-21 20:05
紫缘ぶ逸影 发表于 2014-10-21 19:22
Java的自动内存管理机制(automatic storage management system known as a garbage collector)省却了很 ...

恩恩,很有道理学习了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2