Java堆中到底存放些什么?

百度网友f624755
推荐于2017-09-07 · TA获得超过4301个赞
知道小有建树答主
回答量:918
采纳率:0%
帮助的人:2153万
展开全部
当Java程序创建一个类的实例或者数组时,都在堆中为新的对象分配内存。虚拟机中只有一个堆,所有的线程都共享他。Java中所有的对象都存放在堆中,包括class对象和异常对象。 那么这些对象中有存放些什么呢?实例数据是肯定的,还有就是当通过对象访问类信息时就必须有一个指针将对象和方法区中的类信息关联起来,关联的方法有多种。一个可能的堆的设计是将堆分为两个部分:引用池和对象池。一个对象的引用就是指向引用池的本地指针。每一个引用池中的条目都包含两个部分:指向对象池中对 象数据的指针和方法区中对象类数据的指针。这种设计能够方便Java虚拟机堆碎片的整理。当虚拟机在对象池中移动一个对象的时候,只需要修改对应引用池中 的指针地址。但是每次访问对象的数据都需要处理两次指针。下图演示了这种堆的设计。 另一种堆的设计是:一个对象的引用就是一个指向一堆数据和指向相应对象的偏移指针。这种设计方便了对象的访问,可是对象的移动要变的异常复杂。下图演示了这种设计 无论虚拟机实现者使用哪一种设计,他都可能为每一个对象保存一个类似方法列表的信息。因为他可以提升对象方法调用的速度,对提升虚拟机的性能非常重要,但 是虚拟机的规范中比没有要求必须实现类似的数据结构。下图描述了这种结构。图中显示了一个对象引用相关联的所有的数据结构,包括: 1)、一个指向类型数据的指针 2)、一个对象的方法列表。方法列表是一个指向所有可能被调用对象方法的指针数组。方法数据包括三个部分:操作码堆栈的大小和方法堆栈的本地变量区;方法的字节码;异常列表。 除此之外,堆上的对象数据还有一种逻辑部分,那就是对象锁,这是一个互斥对象。虚拟机中的每个对象都有一个对象锁,它被用于协调多个线程访问同一个对象时的同步。只有当第一次需要加锁的时候才分配对应的锁数据,但这时虚拟机需要用某种间接方法来联系对象数据和对应的锁数据。这也是为什么很多对象在其整个生命周期内都没有被任何线程加锁。除了实现锁所需要的数据外,每个Java对象逻辑上还与实现等待集合(wait set)相关联。 最后一种数据类型-是与垃圾收集器有关的数据。垃圾收集器必须以某种方式跟踪程序引用的每个对象,这个任务不可避免的要附加一些数据给这些对象。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式