我很好奇Object类是如何实现的。例如:
根据我的理解,methods[]数组定义了Object方法本地实现之间的映射关系。例如,Object的hashCode()被映射到JVM_IHashCode函数。JVM_IHashCode在\openjdksrc\hotspot\src\share\vm\prims\jvm.cpp中被实现。这里是我的第一个问题。为什么它已经成为VM本身的一部分(已经在\openjdksrc\hotspot\src\share\vm中定义了)? 但是让我们转向JVM_IHashCode的代码:
所以,oop类/结构体(?)有一个markOop类/结构体(?),其中存储了哈希值。有趣的是,我找不到这些类/结构体。我能找到的只有:
在\ openjdksrc \ hotspot \ src \ share \ vm \ oops \ oop.hpp中,似乎在私有字段中具有markOop。但是在代码的其余部分中引用了什么“oop”? markOop定义在哪里? 我已经找到了一个对应的:
- 一个方法
hashCode()
或wait()
- 内部状态是如何表示的。
例如,内在锁定或存储调用对象的wait()
的线程的数据结构。
static JNINativeMethod methods[] = {
{"hashCode", "()I", (void *)&JVM_IHashCode},
{"wait", "(J)V", (void *)&JVM_MonitorWait},
{"notify", "()V", (void *)&JVM_MonitorNotify},
{"notifyAll", "()V", (void *)&JVM_MonitorNotifyAll},
{"clone", "()Ljava/lang/Object;", (void *)&JVM_Clone},
};
JNIEXPORT void JNICALL
Java_java_lang_Object_registerNatives(JNIEnv *env, jclass cls)
{
(*env)->RegisterNatives(env, cls,
methods, sizeof(methods)/sizeof(methods[0]));
}
JNIEXPORT jclass JNICALL
Java_java_lang_Object_getClass(JNIEnv *env, jobject this)
{
if (this == NULL) {
JNU_ThrowNullPointerException(env, NULL);
return 0;
} else {
return (*env)->GetObjectClass(env, this);
}
}
根据我的理解,methods[]数组定义了Object方法本地实现之间的映射关系。例如,Object的hashCode()被映射到JVM_IHashCode函数。JVM_IHashCode在\openjdksrc\hotspot\src\share\vm\prims\jvm.cpp中被实现。这里是我的第一个问题。为什么它已经成为VM本身的一部分(已经在\openjdksrc\hotspot\src\share\vm中定义了)? 但是让我们转向JVM_IHashCode的代码:
JVM_ENTRY(jint, JVM_IHashCode(JNIEnv* env, jobject handle))
JVMWrapper("JVM_IHashCode");
// as implemented in the classic virtual machine; return 0 if object is NULL
return handle == NULL ? 0 : ObjectSynchronizer::FastHashCode (THREAD, JNIHandles::resolve_non_null(handle)) ;
JVM_END
如果对象为null,为什么我们在此处返回0? 我想应该抛出NPE。否则,FastHashCode将从\ openjdksrc \ hotspot \ src \ share \ vm \ runtime \ synchronizer.cpp调用,并且最终在某个时间点上,将调用get_next_hash来计算实际值。一旦计算完成,问题是它存储在哪里?
intptr_t ObjectSynchronizer::FastHashCode (Thread * Self, oop obj) {
...CUT...
ObjectMonitor* monitor = NULL;
markOop temp, test;
intptr_t hash;
markOop mark = ReadStableMark (obj);
...CUT...
if (mark->is_neutral()) {
hash = mark->hash(); // this is a normal header
if (hash) { // if it has hash, just return it
return hash;
}
hash = get_next_hash(Self, obj); // allocate a new hash code
temp = mark->copy_set_hash(hash); // merge the hash code into header
// use (machine word version) atomic operation to install the hash
test = (markOop) Atomic::cmpxchg_ptr(temp, obj->mark_addr(), mark);
if (test == mark) {
return hash;
}
// If atomic operation failed, we must inflate the header
// into heavy weight monitor. We could add more code here
// for fast path, but it does not worth the complexity.
}
...CUT...
return hash;
}
所以,oop类/结构体(?)有一个markOop类/结构体(?),其中存储了哈希值。有趣的是,我找不到这些类/结构体。我能找到的只有:
class oopDesc {
friend class VMStructs;
private:
volatile markOop _mark;
...CUT...
在\ openjdksrc \ hotspot \ src \ share \ vm \ oops \ oop.hpp中,似乎在私有字段中具有markOop。但是在代码的其余部分中引用了什么“oop”? markOop定义在哪里? 我已经找到了一个对应的:
class markOopDesc: public oopDesc
...CUT...
在\openjdksrc\hotspot\src\share\vm\oops\markOop.hpp中,但它只充满了枚举,找不到可以存储哈希值的字段。
如果有人能回答我问题的一部分,我将非常感激。谢谢!
null
的hashCode确实应该是零:http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/System.html#identityHashCode(java.lang.Object) - int3