翻译人员: 铁锚

翻译日期: 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

相关文章:

  1. What
    does a Java array look like in memory?
  2. Top
    5 Questions about C/C++ Pointers
  3. 简述Java内存泄露
  4. An
    example of C++ dot vs. arrow usage

最新文章

  1. typedef 函数指针 数组 std::function
  2. Android IOS WebRTC 音视频开发总结(八十三)-- 使用WebRTC广播网络摄像头视频(上)
  3. Android之sqlite的使用 (转载)
  4. [php入门] 3、WAMP中的集成MySQL相关基础操作
  5. webpack 教程 那些事儿02-从零开始
  6. Spring Aop实例
  7. hdu 4259 Double Dealing
  8. ST-Link 驱动安装
  9. Android性能优化之ViewStub
  10. totolink的n200r路由在卓越网和京东网的价钱
  11. UVa 11408 - Count DePrimes
  12. IOS小工具以及精彩的博客
  13. 谈谈分布式版本管理工具Git
  14. Luogu 3371【模板】单源最短路径
  15. Windows10 VS2017 C++ Json解析(使用jsoncpp库)
  16. WPFの获取屏幕分辨率并自适应
  17. java 转换流 打印流 数据流
  18. 利用babel-cli搭建支持ES6的node环境
  19. 对象.delegate=self的理解
  20. maven问题:如何启动maven项目

热门文章

  1. C++笔记007:易犯错误模型——类中为什么需要成员函数
  2. JavaScript switch 语句
  3. cassandra 3.x官方文档(3)---gossip通信协议及故障检测与恢复
  4. NLP系列(3)_用朴素贝叶斯进行文本分类(下)
  5. Android图表库MPAndroidChart(二)——线形图的方方面面,看完你会回来感谢我的
  6. ROS探索总结(十九)——如何配置机器人的导航功能
  7. 数组中的数分为两组,让给出一个算法,使得两个组的和的差的绝对值最小,数组中的数的取值范围是0<x<100,元素个数也是大于0, 小于100 。
  8. VMware 下的CentOS6.7 虚拟机与Windows7通信
  9. 基于BaseAdapter的Listview小Demo
  10. 开发人员需要熟知的常用Linux命令Version、Kernel查看