Java 对象在堆中的内存结构
来源:互联网 发布:单片机设计师 编辑:程序博客网 时间:2024/05/17 05:15
翻译人员: 铁锚
翻译日期: 2013年11月8日
原文链接: What do Java objects look like in memory during run-time?
我们知道,函数每次被调用时,在内存中都有自己的活动记录(activation record),称为栈空间(stack). Java 的方法在调用时在 JVM 栈中为其分配一个栈帧(Java栈空间的一个片段),可以称之为方法栈. 原则上,所有对象都在堆空间(Heap)中分配.
java对象在内存中是怎样分配的呢? 一旦对象在堆中分配了空间,那本质上就是一系列的字节. 那么如何找到对象中某个特定的属性域呢? 编译器通过一个内部表来保存每个域的偏移量.
下图是 Base 类的一个对象内存分布图,Base(基类)没有定义任何方法,关于方法在内存中的分布请看接下来的内容.
这种分配方式的好处在于 Base类型的指针 如果指向了子类Derived的对象, 依然在开头的地方"看见"Base对象.
因此, 子类对象(Derived)采用 父类引用(Base) 来进行的操作 保证是安全的,因此在运行时不需要动态地检查 Base 引用的实际类型.
用样的道理,方法也可以放到object空间的开始处,如下图所示.
然而这种实现方式是没有效率的.假若一个类有很多方法(例如20个),那么每个对象就要持有20个指针,相应的,每个对象都需要20个指针的内存空间,这会导致创建对象变慢,所占空间更大。
优化手段是创建一个 虚拟函数表(vtable,虚表),虚表是一个指向特定类的成员函数的指针数组. 如下图所示:
* 以上是我对斯坦福大学编译器讲座所做的笔记,该讲座非常生动有趣。
参考文献:
1. Stanford Compilers Lectures
2. JVM
相关文章:
翻译日期: 2013年11月8日
原文链接: What do Java objects look like in memory during run-time?
我们知道,函数每次被调用时,在内存中都有自己的活动记录(activation record),称为栈空间(stack). Java 的方法在调用时在 JVM 栈中为其分配一个栈帧(Java栈空间的一个片段),可以称之为方法栈. 原则上,所有对象都在堆空间(Heap)中分配.
java对象在内存中是怎样分配的呢? 一旦对象在堆中分配了空间,那本质上就是一系列的字节. 那么如何找到对象中某个特定的属性域呢? 编译器通过一个内部表来保存每个域的偏移量.
下图是 Base 类的一个对象内存分布图,Base(基类)没有定义任何方法,关于方法在内存中的分布请看接下来的内容.
图1
如果还有另一个派生类 "Derived" 继承了基类"Base".那么内存分布将如下图所示:图2
子类对象和父类对象拥有同样的内存分布,当然,子类对象需要更多的空间来存放新的属性域.这种分配方式的好处在于 Base类型的指针 如果指向了子类Derived的对象, 依然在开头的地方"看见"Base对象.
因此, 子类对象(Derived)采用 父类引用(Base) 来进行的操作 保证是安全的,因此在运行时不需要动态地检查 Base 引用的实际类型.
用样的道理,方法也可以放到object空间的开始处,如下图所示.
图3
然而这种实现方式是没有效率的.假若一个类有很多方法(例如20个),那么每个对象就要持有20个指针,相应的,每个对象都需要20个指针的内存空间,这会导致创建对象变慢,所占空间更大。
优化手段是创建一个 虚拟函数表(vtable,虚表),虚表是一个指向特定类的成员函数的指针数组. 如下图所示:
图4
* 以上是我对斯坦福大学编译器讲座所做的笔记,该讲座非常生动有趣。
参考文献:
1. Stanford Compilers Lectures
2. JVM
相关文章:
- What does a Java array look like in memory?
- Top 5 Questions about C/C++ Pointers
- 简述Java内存泄露
- An example of C++ dot vs. arrow usage
- Java 对象在堆中的内存结构
- Java 对象在堆中的内存结构
- java 对象在堆中的内存结构
- Java 对象在堆中的内存结构
- java对象在堆内存中的分配原则
- Java 对象在堆中的内存结构 -- 斯坦福大学编译器讲座笔记
- Java 中的堆内存
- Java对象内存结构
- Java对象内存结构
- Java对象内存结构
- Java对象内存结构
- Java对象内存结构
- Java对象内存结构
- java 对象内存结构
- java对象内存结构
- Java对象内存结构
- Java对象内存结构
- Java对象内存结构
- NOIP2013 Day1第二题 POJ2299
- POJ1753(枚举+位运算)
- Oracle中add_months()函数的用法
- 筛法求素数
- Linux下PCI设备驱动程序开发
- Java 对象在堆中的内存结构
- linux编写驱动常使用的头文件
- Compile gcc4.8 on Ubuntu 12.04 LTS X64
- maven编译时出现读取XXX时出错invalid LOC header (bad signature)
- python使用MySQLdb向mySQL批量插入数据的方法
- python多线程,限制线程数
- windows窗体控件的学习
- 明天我该不该休假呢
- 黑马程序员_交通灯管理系统原理分析