Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OpenJDK源代码上的JVM_条目_Java_C++_Jvm_Openjdk - Fatal编程技术网

Java OpenJDK源代码上的JVM_条目

Java OpenJDK源代码上的JVM_条目,java,c++,jvm,openjdk,Java,C++,Jvm,Openjdk,我阅读在热点OpenJDK 7中引发异常的代码,并跟踪使用它们的类。它们以实现JVM\u条目(result\u type,header)的类结束,例如JVM.cpp,java.cpp等。我的问题是JVM\u条目的功能是什么,它是如何工作的 下面是jvm.cpp JVM_ENTRY(jobject, JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass currClass, jclass initClass)) JVMWrapp

我阅读在热点OpenJDK 7中引发异常的代码,并跟踪使用它们的类。它们以实现
JVM\u条目(result\u type,header)
的类结束,例如
JVM.cpp
java.cpp
等。我的问题是
JVM\u条目的功能是什么,它是如何工作的

下面是
jvm.cpp

JVM_ENTRY(jobject, JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass currClass, jclass initClass))
  JVMWrapper("JVM_AllocateNewObject");
  JvmtiVMObjectAllocEventCollector oam;
  // Receiver is not used
  oop curr_mirror = JNIHandles::resolve_non_null(currClass);
  oop init_mirror = JNIHandles::resolve_non_null(initClass);

  // Cannot instantiate primitive types
  if (java_lang_Class::is_primitive(curr_mirror) || java_lang_Class::is_primitive(init_mirror)) {
    ResourceMark rm(THREAD);
    THROW_0(vmSymbols::java_lang_InvalidClassException());
  }

  // Arrays not allowed here, must use JVM_AllocateNewArray
  if (Klass::cast(java_lang_Class::as_klassOop(curr_mirror))->oop_is_javaArray() ||
      Klass::cast(java_lang_Class::as_klassOop(init_mirror))->oop_is_javaArray()) {
    ResourceMark rm(THREAD);
    THROW_0(vmSymbols::java_lang_InvalidClassException());
  }

  instanceKlassHandle curr_klass (THREAD, java_lang_Class::as_klassOop(curr_mirror));
  instanceKlassHandle init_klass (THREAD, java_lang_Class::as_klassOop(init_mirror));

  assert(curr_klass->is_subclass_of(init_klass()), "just checking");

  // Interfaces, abstract classes, and java.lang.Class classes cannot be instantiated directly.
  curr_klass->check_valid_for_instantiation(false, CHECK_NULL);

  // Make sure klass is initialized, since we are about to instantiate one of them.
  curr_klass->initialize(CHECK_NULL);

 methodHandle m (THREAD,
                 init_klass->find_method(vmSymbols::object_initializer_name(),
                                         vmSymbols::void_method_signature()));
  if (m.is_null()) {
    ResourceMark rm(THREAD);
    THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(),
                methodOopDesc::name_and_sig_as_C_string(Klass::cast(init_klass()),
                                          vmSymbols::object_initializer_name(),
                                          vmSymbols::void_method_signature()));
  }

  if (curr_klass ==  init_klass && !m->is_public()) {
    // Calling the constructor for class 'curr_klass'.
    // Only allow calls to a public no-arg constructor.
    // This path corresponds to creating an Externalizable object.
    THROW_0(vmSymbols::java_lang_IllegalAccessException());
  }

  if (!force_verify_field_access(curr_klass(), init_klass(), m->access_flags(), false)) {
    // subclass 'curr_klass' does not have access to no-arg constructor of 'initcb'
    THROW_0(vmSymbols::java_lang_IllegalAccessException());
  }

  Handle obj = curr_klass->allocate_instance_handle(CHECK_NULL);
  // Call constructor m. This might call a constructor higher up in the hierachy
  JavaCalls::call_default_constructor(thread, m, obj, CHECK_NULL);

  return JNIHandles::make_local(obj());
JVM_END
我在
hotspot/src/share/vm/runtime/interfaceSupport.hpp

#define JVM_ENTRY(result_type, header)                               \
extern "C" {                                                         \
  result_type JNICALL header {                                       \
    JavaThread* thread=JavaThread::thread_from_jni_environment(env); \
    ThreadInVMfromNative __tiv(thread);                              \
    debug_only(VMNativeEntryWrapper __vew;)                          \
    VM_ENTRY_BASE(result_type, header, thread)

JVM_ENTRY是一个预处理器宏,它添加了一些样板代码,这些代码对于HotSpot JVM API的所有函数都是通用的。这个API是JDK类库的本机代码和JVM之间的连接层

JVM_ENTRY宏的作用是:

  • JNIEnv*
    参数获取指向当前
    JavaThread
    的指针
  • 执行从\u native
  • 中的
    \u thread\u到\u vm中的
    \u thread\u的线程状态转换,必要时在安全点阻塞
    
  • 清除函数出口上的JNI本地引用
  • 负责JVM调试构建中的调试跟踪和验证

  • JVM_ENTRY是一个预处理器宏,它添加了一些样板代码,这些代码对于HotSpot JVM API的所有函数都是通用的。这个API是JDK类库的本机代码和JVM之间的连接层

    JVM_ENTRY宏的作用是:

  • JNIEnv*
    参数获取指向当前
    JavaThread
    的指针
  • 执行从\u native
  • 中的
    \u thread\u到\u vm中的
    \u thread\u的线程状态转换,必要时在安全点阻塞
    
  • 清除函数出口上的JNI本地引用
  • 负责JVM调试构建中的调试跟踪和验证