有关JVM中一些基本数据结构的疑问

yuyinyang 2013-04-22
在看Hotspot代码的时候经常会看到klass,oop,handle这些类型的对象,一直没有很好的理解,望解惑。
还有有关锁机制,monitor,mutex,mutexlocker,mutexLockerEx这些锁的用法和区别是什么?
RednaxelaFX 2013-04-22
oop、klass、handle都可以参考HotSpot的wiki: https://wiki.openjdk.java.net/display/HotSpot/CompressedOops
里面引用到Strongtalk的oop的文档非常值得一读(http://code.google.com/p/strongtalk/wiki/VMTypesForSmalltalkObjects),可以了解“oop”的历史。

简单来说oop在这里指ordinary object pointer。与其相对的是“看起来像指针但实际上是藏在指针里的对象”。参考上面说的Strongtalk那个文档就明了了。

HotSpot VM里,所有由GC管理的对象都继承自oopDesc。klass系对象是用来描述GC管理的对象的元数据的。

handle是实现引用的一种方式,比普通的直接指针要多一层间接。
直接指针是:指针 -> 目标对象
handle是:handle -> handle table里的一项,存有指针 -> 目标对象
这主要是为了便于:
1、让GC能知道native code什么地方持有了GC管理的对象的引用——只要扫描handle table即可,不用管native code什么地方持有着引用;
2、假如GC移动了对象,native code里对这些对象的引用可以得到更新——只要修改handle table对应的项里存的指针即可。

HotSpot VM里的Monitor和Mutex都是用于实现锁的。前者用于实现Java对象的重量级锁,后者用于实现VM内部对象的锁。MutexLocker、MutexLockerEx这些是一种RAII对象,用于方便的在某个作用域里保证配对的加锁和解锁。有没有Ex的版本看注释就知道区别是什么了,不赘述…
panggezi 2013-04-23
oop就是一个普通的指针,oopsHierarchy.hpp里面就是个typedef的定义
typedef class oopDesc*  oop;
复杂的在于class oopDesc,Handle在hotspot里主要是为了JNI的调用。native的code里面访问java对象都只能通过对象的handle去操纵,java code访问可以直接用oop访问。
yuyinyang 2013-04-28
谢谢两位的回答~
还想顺便问一下R大,我在make all的时候,编到jaxp那,可能由于网速的原因有个文件它一直get不下来,于是导致编译失败,这种情况应该怎么办?或者说我能不能在编译的时候跳过我不需要的比如说corba、jaxp这些呢?
RednaxelaFX 2013-04-28
yuyinyang 写道
谢谢两位的回答~
还想顺便问一下R大,我在make all的时候,编到jaxp那,可能由于网速的原因有个文件它一直get不下来,于是导致编译失败,这种情况应该怎么办?或者说我能不能在编译的时候跳过我不需要的比如说corba、jaxp这些呢?

我是只在hotspot目录里make,只make出HotSpot VM来,就没那么多麻烦的依赖。方法在HLLVM群组里已经有很多人问过也回答过几次了。先搜搜看?

jaxp有文件下载不下来可能是文件的路径变了的缘故。没必要的话尽量别build很老版本的OpenJDK,各种麻烦。

这帖里有些内容是跟build OpenJDK相关的,看看有没有用:http://rednaxelafx.iteye.com/blog/875957
Global site tag (gtag.js) - Google Analytics