本文主要是针对Jvm相关资料的收集整理,待完善
1:对象定位
对象定位技术有2种
第一种:通过句柄访问
原文写道
1:如果使用句柄访问的话,Java堆中将会划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据的具体各自的地址信息。如图1所示
图片出处:
第二种,直接通过指针访问
图片出处:
2中定位方法的优缺点对比
原文写道
这两种对象访问方式各有优势,使用句柄来访问的最大好处就是reference中存储的是稳定句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而reference本身不需要被修改。
使用直接指针来访问最大的好处就是速度更快,它节省了一次指针定位的时间开销,由于对象访问的在Java中非常频繁,因此这类开销积小成多也是一项非常可观的执行成本。从上一部分讲解的对象内存布局可以看出,就虚拟机HotSpot而言,它是使用第二种方式进行对象访问,但在整个软件开发的范围来看,各种语言、框架中使用句柄来访问的情况也十分常见。
垃圾回收技术是如何跟这些对象关联的呢,如何标记的呢?
2:垃圾回收
在C++中对象的创建(New)和销毁(Delete)由程序员自己判定。当然这2个操作都依赖于指针,有很高的灵活性,但是也很容易出问题,出现野指针引发内存泄露的几率很高。而且指针,引用等比较难于理解和应用。
在java、.Net等基于虚拟机的语言中摈弃了这些概念,而由虚拟机来回收我们不用的对象(堆上的)。
虚拟机是怎么知道这个对象我们不在使用了呢?常用的对象存活判定有2种方式。
方法一:
引用原文
引用计数(Reference Counting)
引用计数算法的大致思想是给每个对象一个计数器,每当引用它是计数器+1,引用失效时-1.我们看这个算法还是比较高效的。(计数器的操作是如何做到的呢?)
主要缺点:
其中最主要原因是它没有一个优雅的方案去对象之间相互循环引用的问题:当两个对象互相引用,即使它们都无法被外界使用时,它们的引用计数器也不会为0。
方法二:
写道
可达性分析(Reachability Analysis)
参考文档:
The Java Virtual Specification http://java.sun.com/docs/books/jvms/second_edition/html/VMSpecTOC.doc.html
Hotspot虚拟机对象探秘
Jvm内存回收与实现
Garbage Collection http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)