这是个棘手的话题,到目前为止,我也没有看得太明白。先记录下我现在的一些理解。
先看几个主要的class
Thread、VMThread、JavaThread、OSThread
VMThread和JavaThread都是Thread的子类,而OSThread的父类是CHeapObj。所以,OSThread是一个Helper。
VMThread是JVM内部用的Thread,例如GC Thread。
JavaThread则是对应java.lang.Thread
通过Thread::set_osthread(OSThread *thread)把OSThread和Thread关联起来。
下面看看在Win32下,OSThread是如何与真正的OS的Thread关联起来的。
\hotspot\src\os\win32\vm\os_win32.cpp
os::create_thread方法就是创建操作系统的Thread,并把它和OSThread、Thread关联起来的关键方法。
在这个方法里面,可以看到它调用_beginthreadex创建了操作系统的Thread,并把操作系统中的Thread的Handle与
OSThread关联起来。
关于_beginthreadex
MSDN中这样写的:
A thread in an executable that calls the C run-time library (CRT) should use the _beginthreadex and _endthreadex functions for thread management rather than CreateThread and ExitThread; this requires the use of the multi-threaded version of the CRT. If a thread created using CreateThread calls the CRT, the CRT may terminate the process in low-memory conditions.
在调用_beginthreadex的时候,第三个参数是一个函数指针,现在指向的是java_start这个函数。
这样所有的Thread创建后,都会去执行java_start这个回调函数。
java_start中又调用了thread->run()方法。
thread->run()的设计应用了设计模式:模板方法。VMThread、JavaThread各自实现了自己的run方法。
主线程在哪里?
很显然,main thread在JVM被初始化的时候就已经存在了,只需要在适当的地方把它保存在某个变量中。
回到 os::init()方法
main_process = GetCurrentProcess(); // Remember main_process is a pseudo handle
if (!DuplicateHandle(main_process, GetCurrentThread(), main_process,
&main_thread, THREAD_ALL_ACCESS, false, 0)) {
fatal("DuplicateHandle failed\n");
}
main_thread_id = (int) GetCurrentThreadId();
os::init()被调用后,全局变量main_thread, main_thread_id就被赋了正确的值。
Threads::create_vm
|
|--> Thread::set_as_starting_thread
|
|--> os::create_main_thread
|
|-->create_os_thread
这是主线程被创建的过程
分享到:
相关推荐
本文将深入探讨Java Thread的语法特性以及其在JVM内部的编译结果,帮助开发者更好地理解和使用线程。 1. **synchronized方法的Java语言规范** `synchronized`关键字用于控制多线程对共享资源的访问,以确保线程...
通过以上内容的学习和实践,开发者能够更好地理解和掌握JVM内部机制,并能够针对具体的应用场景进行有效的性能调优,提升系统的稳定性和响应速度。这不仅对企业级应用的开发维护至关重要,也能够帮助企业节省大量的...
#### 一、JVM的内部构造 JVM(Java虚拟机)是Java程序运行的基础环境,它为Java程序提供了一个独立于硬件平台的抽象计算机模型。JVM的设计使得Java程序可以跨平台运行,即编写一次代码可以在多个平台上运行。 - **...
总的来说,这本书对于Java开发者来说是一份宝贵的资源,它不仅讲解了JVM的内部工作原理,还提供了实用的故障诊断工具和性能优化策略,有助于提升开发者解决复杂问题的能力。通过深入学习,读者可以更好地管理Java...
文档主要探讨了JVM内部的工作流程、性能调优以及编译优化等方面的问题。作者Douglas Q. Hawkins是一位资深的虚拟机工程师,通过一系列实例解释了JVM中的关键概念和技术细节。 #### JVM的核心工作流程 JVM的核心...
总结,HotSpot线程的创建是一个从Java API调用,经过JVM内部处理,最终由Linux内核实现的过程。理解这一过程有助于优化线程使用,避免不必要的性能损耗。在实际开发中,合理创建和管理线程,能有效提升程序的并发...
《深入JVM内核—原理、诊断与优化》是一...通过学习这本书,读者不仅可以提升对JVM内部运作的理解,还能掌握在实际开发中解决性能问题和优化应用的实用技巧。无论是Java开发新手还是经验丰富的专家,都能从中受益匪浅。
在Java编程语言中,创建多线程有两种主要的方法:继承`Thread`类和实现`Runnable`接口。这两种方法都是为了使程序能够同时执行多个任务,从而提高效率和响应性。 **1. 继承Thread类** 当一个类直接继承自`Thread`类...
- Java支持多线程编程,可以使用`Thread`类或实现`Runnable`接口创建线程。 9. **面向对象**: - 面向对象编程强调对象的封装、继承和多态。 - 面向过程编程更关注步骤和函数。 10. **构造器**: - 构造器用于...
《Java高并发编程与JVM性能调优实战》是一门深度探讨Java开发中高...通过这门课程的学习,开发者不仅可以了解Java并发编程的高级技术,还能掌握JVM内部机制,从而更好地优化应用程序的性能,应对高并发场景下的挑战。
- **线程创建**:可通过继承Thread类、实现Runnable接口或使用匿名内部类创建线程。 - **线程常用的方法**:如sleep()使线程休眠,join()等待线程结束,setPriority()设置优先级,yield()让出CPU,setDaemon()将线程...
2. **验证**:确保输入的字节流包含的信息符合当前虚拟机的要求,且能够正确地处理这些信息,防止有害的类进入JVM内部。 3. **准备**:为类的静态变量分配内存并设置类变量的初始值,这里不包括final类型的变量,...
Java提供了一些线程安全的类,如`AtomicInteger`、`ConcurrentHashMap`等,它们内部实现了线程同步,可以在多线程环境中安全地使用。 以上就是关于Java中`Thread`类及多线程编程的核心知识点。在实际开发中,理解...
关于为什么使用`start()`而不是直接调用`run()`,原因是`start()`方法内部会调用`start0()`,这是一个原生方法(native method),它由Java Native Interface (JNI)实现,与Java虚拟机(JVM)直接交互。当调用`start...
### JVM技术精华——架构师必备知识点详解 #### 一、HotSpot VM介绍及发展历程 **HotSpot VM**作为Sun JDK和OpenJDK的核心组件之一,是当前应用最为广泛的Java虚拟机。HotSpot VM最初并不是由Sun公司开发,而是...
1. **创建Thread实例**:首先,你需要创建一个Thread类的实例,这通常是通过继承Thread类并重写其run()方法,或者实现Runnable接口并在创建Thread对象时传递Runnable实例。 2. **线程状态**:线程有多种状态,包括...
最后,JVM是Java程序运行的基石,理解其内部工作机制对于优化性能、排查问题至关重要。JVM主要包括类加载子系统、运行时数据区(堆、栈、方法区、PC寄存器、本地方法栈)、垃圾收集和内存管理、字节码执行引擎等部分...
Java线程转储(Thread Dump)是诊断Java应用程序性能问题和异常情况的重要工具。它提供了一个运行中的Java应用中所有线程的快照,详细显示每个线程的状态、堆栈跟踪以及线程名称。线程状态包括RUNNABLE、BLOCKED、...
ThreadGroup自身实现了`Thread.UncaughtExceptionHandler`接口,因此它可以处理其内部线程和子ThreadGroup中的未捕获异常。当一个线程在其所属的ThreadGroup中抛出未捕获异常时,ThreadGroup会接收到这个异常并进行...