运行时java对象在内存中是什么样子的?
2015-11-19 18:00
281 查看
我们知道函数在内存中作为一条栈的激活记录被实现,我们也知道java方法作为栈的一片被实现,java对象在堆中被分配。
java对象在堆中是什么样的呢,一旦一个对象被放入内存中,那么它就是一连串的byte。那么我们怎么去找特定的区域呢,在编译器内存保存一个内部表包含每一个区域的位移量。下边是一个类“Base”对象的例子,这个类没有任何方法,方法在内存中是如何铺放的,我们下一节会讲到。
如果我们有另一个类Derived,继承自Base类,内存中的样子如下:
子对象有和父对象相同的内存分布,另外它需要额外的空间安放新增加的字段。这种分布的好处是,在开始的时候类B的指针A指向D对象依旧可以看到B对象的内容。因此,通过B的引用在D上的操作是安全的,没有必要检查B动态的指向什么。这就解释了多态的实现的原理
但是这种方法没有效率,如果一个类有很多的方法,那么每一个对象必须有相应的指针集合,另外每一个对象需要为这些指针分配空间,这样对象的创建变的很慢并且导致对象很大。优化的方法是创建一个虚拟的函数表,包含了为特定的类的函数分配的指针的数组。
原文链接:http://www.programcreek.com/2011/11/what-do-java-objects-look-like-in-memory/
java对象在堆中是什么样的呢,一旦一个对象被放入内存中,那么它就是一连串的byte。那么我们怎么去找特定的区域呢,在编译器内存保存一个内部表包含每一个区域的位移量。下边是一个类“Base”对象的例子,这个类没有任何方法,方法在内存中是如何铺放的,我们下一节会讲到。
如果我们有另一个类Derived,继承自Base类,内存中的样子如下:
子对象有和父对象相同的内存分布,另外它需要额外的空间安放新增加的字段。这种分布的好处是,在开始的时候类B的指针A指向D对象依旧可以看到B对象的内容。因此,通过B的引用在D上的操作是安全的,没有必要检查B动态的指向什么。这就解释了多态的实现的原理
但是这种方法没有效率,如果一个类有很多的方法,那么每一个对象必须有相应的指针集合,另外每一个对象需要为这些指针分配空间,这样对象的创建变的很慢并且导致对象很大。优化的方法是创建一个虚拟的函数表,包含了为特定的类的函数分配的指针的数组。
原文链接:http://www.programcreek.com/2011/11/what-do-java-objects-look-like-in-memory/
相关文章推荐
- eclipse和myeclipse下main方法找不到主类的一种情况
- JAVA NIO:Path ,File
- 简单的安卓手势处理类
- java 选择排序法
- struts2 ajax一个很经典的小例子
- java读取文件大全
- Eclipse+GIMP 揪出占用内存的那个图片
- [eclipse技巧]设置eclipse中jsp/html文件好看的自动排版
- java 设计作业——简单计算器
- java 项目 添加 log4j
- java数字转换成字符串
- 深入理解Java:类加载机制及反射
- 深入研究Java类加载机制
- 解析 Java 类和对象的初始化过程 由一个单态模式引出的问题谈起
- 用spring annotation声明的bean,当打包在jar中时,无法被扫描到的问题
- java.sql.SQLIntegrityConstraintViolationException: ORA-01400: 无法将 NULL 插入 (表)
- Java 类和对象的初始化过程及初始化顺序
- myeclipse或eclipse工作空间发生异常
- Java实现POI导出Excel
- Java实现POI导出Excel