摘要:前言本文从类的方法的内部实现入手,分析多线程相关的数据结构类和原理类方法类的方法用于启动线程,方法内部调用了方法在源代码中搜索,可以看到对应函数在源代码中搜索函数核心代码计算线程堆栈大小创建对象初始化启动线程在创建时传入了一个函数指针,
前言
本文从 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
摘要:准备工作假设源代码目录为编译时启用了解释器参考编译和调试调用栈先在函数参考虚拟机入口中设断点,然后在的方法中设置断点通过宏获取当前,然后创建第个栈帧,然后进入解释执行字节码 准备工作 假设 openjdk 源代码目录为 jdk9dev 编译 openjdk 时启用了 zero 解释器(参考 OpenJDK9 Hotspot Mac OSX 编译和调试) 调用栈 先在 JavaMai...
摘要:前言方法是早期提供的一种基于的线程同步方法,本文先介绍相关的数据结构类,然后从方法的内部实现入手,简单分析相关的原理和实现类用于实现的定待和唤醒,不同平台操作系统平台对应的定义在文件类的分配和释放使用了对象缓存,静态字段用于缓存当前 前言 Object wait/notify 方法是早期 JVM 提供的一种基于 Object Monitor 的线程同步方法,本文先介绍相关的数据结构(类...
摘要:前言语言可以精确控制对象内存分配,出于性能考虑框架系统程序基本都会自己造轮子开发各种内存管理模块也不例外,它通过和方法的访问级别以及重载和方法来管理虚拟机内部对象的内存内存管理相关的基类定义了几个基类来作为大部分对象的基类顾名思义,它们只能 前言 C++ 语言可以精确控制对象内存分配,出于性能考虑 C++ 框架 or 系统程序基本都会自己 造轮子 开发各种内存管理模块. hotspot...
摘要:前言网上各路大神总结过各种关于内部实现,看别人的文章总觉得不过瘾,所以有了这篇文章,尝试再扒一次的底裤数据结构在分析源代码之前需要了解相关概念,比如等,参考网络上各种解说或者之前系列文章,这里重点介绍一下,,每个在内部都有一个的对象与之对应 前言 网上各路大神总结过各种关于 hotspot jvm synchronized 内部实现,看别人的文章总觉得不过瘾,所以有了这篇文章,尝试再扒...
摘要:占用率太高,还出各种奇怪问题,转投调试安装下载源代码漫长等待,中间无数次中断安装安装可选如果要使用解释器,需要安装设置调试级别,设成可以提供更多的调试信息设置路径 Intellij CLion CPU 占用率太高,还出各种奇怪问题,转投 Xcode 调试 hotspot 安装 hg # brew install hg 下载 open jdk 9 源代码 # hg clone http...
阅读 2718·2021-11-16 11:45
阅读 1583·2021-09-26 10:19
阅读 1992·2021-09-13 10:28
阅读 2765·2021-09-08 10:46
阅读 1506·2021-09-07 10:13
阅读 1490·2019-08-30 13:50
阅读 1358·2019-08-30 11:17
阅读 1414·2019-08-29 13:18