A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xiaochongbojue 中级黑马   /  2014-10-21 17:46  /  1064 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

当我们声明一个基本变量的时候,我们知道他所占用的内存是固定的,比如int是4字节,char是2字节,那么加入我声明一个Object 对象呢,他所占用的内存是多少呢

2 个回复

倒序浏览

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。
回复 使用道具 举报 1 0
紫缘ぶ逸影 发表于 2014-10-21 19:22
Java的自动内存管理机制(automatic storage management system known as a garbage collector)省却了很 ...

恩恩,很有道理学习了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马