`

openjdk jvm线程启动

    博客分类:
  • jvm
阅读更多
java/lang/Thread.java看起
       public synchronized void start() {
              .....
              start0(); //   start0为本地方法 private native void start0();
              .....
}
    

       start0的实现是jvm.cpp中的JVM_StartThread。

       ......

       native_thread = new JavaThread(&thread_entry, sz);

       if (native_thread->osthread() != NULL) {
              native_thread->prepare(jthread);
       }

       .....

       Thread::start(native_thread);

      

       函数指针thread_entry,thread_entry调用Thread.java中的run方法
       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()),
                                      vmSymbolHandles::run_method_name(), //调用用户编写thread类run方法
                                      vmSymbolHandles::void_method_signature(),
                                      THREAD);
        }

        new JavaThread(...)

        JavaThread::JavaThread(ThreadFunction entry_point, size_t stack_sz) : Thread() {

                 .........

                 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);

        }
        os::create_thread

        bool os::create_thread(Thread* thread, ThreadType thr_type, size_t stack_size) {

               OSThread* osthread = new OSThread(NULL, NULL);

               thread->set_osthread(osthread);

               HANDLE thread_handle =
               (HANDLE)_beginthreadex(NULL,
                           (unsigned)stack_size,
                           (unsigned (__stdcall *)(void*)) java_start,
                           thread,
                           CREATE_SUSPENDED | STACK_SIZE_PARAM_IS_A_RESERVATION,
                           &thread_id);

               //堵塞,直到上面的Thread::start(native_thread)才开始运行

               .............
        }

        启动函数java_start。

        static unsigned __stdcall java_start(Thread* thread) {

                   __try {
                          thread->run();  //注意:传入的是javaThread,所以在这调用javaThread::run
                   } __except(topLevelExceptionFilter(
                       (_EXCEPTION_POINTERS*)_exception_info())) {
                   }

        }

       

        void JavaThread::run() {

                  .......

                  thread_main_inner();//在里面真正调用用户写的java类run方法

        }

        void JavaThread::thread_main_inner() {

                 this->entry_point()(this, this); //调用传入thread_entry

                 //退出

                 this->exit(false);
                 delete this;

        }

        最后

        void Thread::start(Thread* thread) {

                ........

                os::start_thread(thread); //运行创建时堵塞的线程

        }

       void os::start_thread(Thread* thread) {

                .........

                OSThread* osthread = thread->osthread();
                osthread->set_state(RUNNABLE);
                pd_start_thread(thread);

       }

       void os::pd_start_thread(Thread* thread) {

               //真正恢复操作系统线程运行的代码

               DWORD ret = ResumeThread(thread->osthread()->thread_handle());

       }

       由上面可以看到每个继承java.lang.Thread的类,调用start之后,都和一个操作系统的线程进行绑定。

分享到:
评论

相关推荐

    openjdk8u60+jvm jdk源码+jvm源码

    HotSpot 是 Oracle JDK 和 OpenJDK 使用的默认 JVM 实现,它的名字来源于其“热点代码”检测技术,能够识别并优化经常执行的代码段。 在 OpenJDK 8u60 中,我们可以找到以下关键知识点: 1. **类加载器(Class ...

    jvm8源码, openjdk8

    Java虚拟机(JVM)是Java程序运行的基础,OpenJDK是JVM的一个开源实现,而OpenJDK 8则是其在Java 8版本上的具体体现。OpenJDK 8的源码对于开发者来说,是一个深入理解Java语言、JVM工作原理以及相关库函数的重要资源...

    推荐一些JVM原理,JVM调优,JVM内存模型,JAVA并发 电子书1

    2. JVM内存模型:JVM内存模型定义了内存中各个部分的关系,以及在多线程环境下如何共享和分配内存。Java内存模型(JMM)规定了线程对共享变量的可见性和有序性,它通过主内存和工作内存的概念来实现多线程之间的协作...

    ubuntu下openjdk7 openjdk8

    在Ubuntu操作系统中,OpenJDK(Open Source Java Development Kit)是Oracle JDK的开源替代品,提供了Java编程语言的实现和Java虚拟机(JVM)。OpenJDK7和OpenJDK8是两个不同的版本,分别对应Java 7和Java 8。这两个...

    openjdk 19 linux版本 解压安装包

    首先,选择一个合适的系统目录来存放OpenJDK,例如 `/usr/lib/jvm` 或 `/opt`: ```bash sudo mkdir -p /usr/lib/jvm sudo mv jdk-19 /usr/lib/jvm/ ``` 然后,编辑系统的环境变量配置文件,例如 `~/.bashrc` 或 `...

    openjdk1.6

    OpenJDK是由Sun Microsystems启动的项目,后来被甲骨文(Oracle)接手。OpenJDK 1.6版本基于Java SE 6,包含了JVM(Java虚拟机)、类库和开发工具等核心组件。它遵循GPLv2许可证,允许自由分发和修改源代码。 2. *...

    openjdk-17.0.2(openjdk-17.0.2_windows-x64_bin.zip)

    OpenJDK 包含了多个组件,例如Java虚拟机(JVM)、Java类库、编译器(javac)、Java运行时环境(JRE)以及其他工具。在"openjdk-17.0.2_windows-x64_bin.zip"压缩包内,用户可以找到以下关键组件: 1. **JRE**: ...

    jdk,jvm源码

    在研究JVM源码时,可以参考OpenJDK项目,它是JDK的开源实现,提供了完整的JVM源代码。通过阅读源码,我们可以学习到更多关于类加载、内存管理、线程调度等底层细节,并且能够针对具体问题进行定制化开发。 个人网站...

    openjdk 1.7 windows 32位

    OpenJDK作为Oracle JDK的替代品,提供了Java平台标准版(Java SE)的核心功能,包括Java虚拟机(JVM)、类库以及开发者工具。 Java虚拟机是OpenJDK的核心部分,它是Java平台的基石,负责执行字节码并提供平台无关的...

    openjdk-19(openjdk-19-ea+24_macos-aarch64_bin.tar.gz)

    5. **Class Data Sharing(类数据共享)**:这个功能允许JVM在启动时分享类的数据,减少了启动时间和内存占用,特别是对于有大量预加载类的应用。 6. **增强的JShell(JShell增强)**:Java内置的REPL(Read-Eval-...

    BiSheng JDK 21 是 OpenJDK 21 的高性能生产就绪发行版

    OpenJDK是Java虚拟机(JVM)和相关工具的开源实现,它遵循GNU General Public License(GPLv2)协议。OpenJDK不仅包括JVM,还包括编译器、类库和其他必要的组件,是Java开发和运行的基础。OpenJDK 21是一个特定的...

    OpenJdk-7.zip

    10. **jstack**:线程堆栈跟踪工具,用于查看Java应用程序的线程状态。 OpenJDK-7与Oracle JDK在功能上基本一致,但OpenJDK是开放源代码的,对于那些希望查看源码或者对Java技术进行研究的开发者来说,OpenJDK具有...

    openjdk-18 GA (openjdk-18_linux-x64_bin.tar.gz)

    OpenJDK 18继续致力于性能提升,包括更快的启动时间、更好的内存管理以及对多线程和并发的优化。这些改进对大规模的服务器端应用尤其重要。 7. **社区与更新** OpenJDK项目是一个活跃的开源社区,开发者可以参与...

    java-7-openjdk-arm64-aarch64.tar.gz

    这个压缩包包含了OpenJDK 7的实现,OpenJDK是一个开源版本的Java开发工具包,它提供了Java虚拟机(JVM)以及Java编程语言的编译器和其他基础工具。ARM64,也被称为AArch64,是ARM架构的一个64位变体,广泛应用于...

    JVM Hotspot实现源码

    《OpenJDK中的JVM Hotspot实现源码解析》 在Java世界中,JVM(Java Virtual Machine)是运行Java程序的关键组件,它负责将字节码解释执行或即时编译为机器码,使得Java具备跨平台的能力。Hotspot是Oracle JDK和...

    OpenJDK 8_322 windows 解压安装版

    开发者在使用OpenJDK 8_322时,可以利用Java 8的新特性来改进代码质量,例如使用Lambda表达式简化多线程编程,使用Stream API处理集合数据,或利用新的日期/时间API来处理日期和时间。此外,OpenJDK 8的JVM也支持...

    openjdk-17 GA(openjdk-17_linux-aarch64_bin.tar.gz)

    OpenJDK 17 GA适用于开发和部署Java应用程序,它提供了强大的JVM(Java虚拟机)和JDK工具,如javac编译器、javadoc文档生成工具、jshell交互式REPL(Read-Eval-Print Loop)等。开发者可以利用这些工具构建、测试和...

    openjdk-19(openjdk-19-ea+24_macos-x64_bin.tar.gz)

    6. **Class Data Sharing(类数据共享)**:这是一种优化技术,允许JVM在启动时分享已经解析和初始化的类数据,从而加快启动速度。 7. **Memory Segments(内存段)**:这是JEP 416的一部分,旨在改进低级别的内存...

    OpenJDK源码

    通过研究OpenJDK源码,开发者可以学习到诸如垃圾回收、内存管理、多线程、网络编程、并发控制等高级主题。 首先,让我们深入了解JVM。JVM是Java程序运行的平台,它负责将字节码转换为机器码执行。在OpenJDK源码中,...

    openjdk8完整源码

    2. 系统调用:OpenJDK与操作系统进行交互,如文件操作、线程管理等,都涉及C语言的系统调用。 3. 性能优化:C++的底层特性使得OpenJDK能进行性能优化,如使用模板、内联函数等来提高运行效率。 通过深入研究...

Global site tag (gtag.js) - Google Analytics