资讯专栏INFORMATION COLUMN

OpenJDK9 Hotspot : Thread

roundstones / 1657人阅读

摘要:前言本文从类的方法的内部实现入手,分析多线程相关的数据结构类和原理类方法类的方法用于启动线程,方法内部调用了方法在源代码中搜索,可以看到对应函数在源代码中搜索函数核心代码计算线程堆栈大小创建对象初始化启动线程在创建时传入了一个函数指针,

前言

本文从 Java Thread 类的 start 方法的内部实现入手,分析 Hotspot JVM 多线程相关的数据结构(类)和原理

Thread 类 start 方法

Thread 类的 start 方法用于启动线程,方法内部调用了 native 方法 start0

public synchronized void start() {
    ...
    try {
        start0();
        started = true;
    } finally {
    ...}
}

private native void start0();

在 openjdk 源代码中搜索 start0,可以看到 start0 对应 JVM_StartThread native 函数

jdk/src/java.base/share/native/libjava/Thread.c:44:
{"start0",           "()V",        (void *)&JVM_StartThread},

在 openjdk 源代码中搜索 JVM_StartThread

hotspot/src/share/vm/prims/jvm.cpp:2785:
JVM_ENTRY(void, JVM_StartThread(JNIEnv* env, jobject jthread))

JVM_StartThread 函数核心代码

JVM_ENTRY(void, JVM_StartThread(JNIEnv* env, jobject jthread)) {
    JVMWrapper("JVM_StartThread");
    JavaThread *native_thread = NULL;
    ...
    JavaThread *native_thread;
    ...
    if (...) {
    } else {
        jlong size = janga_lang_Thread::stackSize(
        JNIHandles::resolve_non_null(jthread));
        size_t sz = size > 0 ? (size_t) size : 0;
        native_thread = new JavaThread(&thread_entry, sz);
        if (native_thread->osthread() != NULL) {
            native_thread->prepare(jthread);
        }
    }
    ...
    Thread::start(native_thread);
}
JVM_END

计算 线程堆栈 大小

创建 JavaThread 对象

初始化 osthread ?

启动线程

在创建 JavaThread 时传入了一个函数指针 thread_entry,它是 os thread 的入口函数

static void thread_entry(JavaThread* thread, TRAPS) {
    HandleMark hm(THREAD);
    Handle obj(THREAD, thread->threadObj());
    JavaValue result(T_VOID);
    JavaCalls::call_virtual(&result,
        obj,
        KlassHandle(THREAD, SystemDictionary::Thread_klass()),
        vmSymbols::run_method_name(),
        vmSymbols::void_method_signature(),
        THREAD);
    }

JavaCalls::call_virtual 函数用于从 native(C/C++)代码调用 Java 代码,从变量和函数命名很容易看出,thread_entry 函数将调用 Java Thread 对象的 run 方法,将控制逻辑从 native 环境转向 Java 环境

JavaThread

从上文分析 Java Thread 类的 start 方法可以得知 每个 Java Threard 对象在 JVM 内部都有一个 native 对象 JavaThread 与之对应. 我们从构造函数入手分析 JavaThread. thread.cpp 文件中有一段注释描述了 Hotspot 线程类的层次结构:

Class hierarchy
 - Thread
   - NamedThread
     - VMThread
     - ConcurrentGCThread
     - WorkerThread
       - GangWorker
       - GCTaskThread
   - JavaThread
     - various subclasses eg CompilerThread, ServiceThread
   - WatcherThread
构造函数
JavaThread::JavaThread(ThreadFunction entry_point, size_t stack_sz) :
                       Thread() {
  initialize();
  _jni_attach_state = _not_attaching_via_jni;
  set_entry_point(entry_point);
  // Create the native thread itself.
  // %note runtime_23
  os::ThreadType thr_type = os::java_thread;
  thr_type = entry_point == &compiler_thread_entry ? os::compiler_thread :
                                                     os::java_thread;
  os::create_thread(this, thr_type, stack_sz);
}

根据 entry_point(线程入口函数指针)确定线程线程 thr_type

调用 os::create_thread 创建 os thread(pthread)

OSThread 总结

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66705.html

相关文章

  • OpenJDK9 Hotspot:Zero 解释器 初探

    摘要:准备工作假设源代码目录为编译时启用了解释器参考编译和调试调用栈先在函数参考虚拟机入口中设断点,然后在的方法中设置断点通过宏获取当前,然后创建第个栈帧,然后进入解释执行字节码 准备工作 假设 openjdk 源代码目录为 jdk9dev 编译 openjdk 时启用了 zero 解释器(参考 OpenJDK9 Hotspot Mac OSX 编译和调试) 调用栈 先在 JavaMai...

    zhangqh 评论0 收藏0
  • OpenJDK9 Hotspot : Object wait/notify 方法浅析

    摘要:前言方法是早期提供的一种基于的线程同步方法,本文先介绍相关的数据结构类,然后从方法的内部实现入手,简单分析相关的原理和实现类用于实现的定待和唤醒,不同平台操作系统平台对应的定义在文件类的分配和释放使用了对象缓存,静态字段用于缓存当前 前言 Object wait/notify 方法是早期 JVM 提供的一种基于 Object Monitor 的线程同步方法,本文先介绍相关的数据结构(类...

    fancyLuo 评论0 收藏0
  • OpenJDK9 Hotspot 虚拟机内部对象内存管理

    摘要:前言语言可以精确控制对象内存分配,出于性能考虑框架系统程序基本都会自己造轮子开发各种内存管理模块也不例外,它通过和方法的访问级别以及重载和方法来管理虚拟机内部对象的内存内存管理相关的基类定义了几个基类来作为大部分对象的基类顾名思义,它们只能 前言 C++ 语言可以精确控制对象内存分配,出于性能考虑 C++ 框架 or 系统程序基本都会自己 造轮子 开发各种内存管理模块. hotspot...

    W_BinaryTree 评论0 收藏0
  • OpenJDK9 Hotspot : synchronized 浅析

    摘要:前言网上各路大神总结过各种关于内部实现,看别人的文章总觉得不过瘾,所以有了这篇文章,尝试再扒一次的底裤数据结构在分析源代码之前需要了解相关概念,比如等,参考网络上各种解说或者之前系列文章,这里重点介绍一下,,每个在内部都有一个的对象与之对应 前言 网上各路大神总结过各种关于 hotspot jvm synchronized 内部实现,看别人的文章总觉得不过瘾,所以有了这篇文章,尝试再扒...

    Amio 评论0 收藏0
  • OpenJDK9 Hotspot Mac OSX 编译和调试

    摘要:占用率太高,还出各种奇怪问题,转投调试安装下载源代码漫长等待,中间无数次中断安装安装可选如果要使用解释器,需要安装设置调试级别,设成可以提供更多的调试信息设置路径 Intellij CLion CPU 占用率太高,还出各种奇怪问题,转投 Xcode 调试 hotspot 安装 hg # brew install hg 下载 open jdk 9 源代码 # hg clone http...

    zhichangterry 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<