`
李静波
  • 浏览: 53801 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Threads::create_vm

阅读更多
代码位于\hotspot\src\share\vm\runtime\Thread.cpp  Line 2891~Line 3226
这个方法是JVM初始化的主要方法,300多行代码,代码虽然很多,但是思路很清晰,比较容易阅读。
 
JVM初始化无外乎:解析参数、分配内存、创建内部数据结构、创建主线程、加载系统class等步骤。
这些代码均是相当好地被放在各个函数中,代码写的相对直白。
 
下面讲讲初次看这个方法,比较难理解的一个地方
Thread.cpp Line 3138
  SystemDictionary::compute_java_system_loader(THREAD);
这里面突然出现一个THREAD,很是突兀。
 
JVM是C++写成的,自然也继承了C的光荣传统:宏。
 
THREAD是宏,和它相关的宏还有:EXCEPTION_MARK、TRAPS、CHECK_0等。
它们均定义在:\hotspot\src\share\vm\utilities\exceptions.hpp
正如文件名exceptions.hpp所暗示的,这些宏和Exception处理有关系。这里的异常是指JVM代码中的异常,不是指Java程序的异常。
 
exceptions.hpp Line 270
#define EXCEPTION_MARK Thread* THREAD; ExceptionMark __em(THREAD);
 
exceptions.hpp Line 155
#define THREAD __the_thread__
 
所以THREAD实际上是 Thread* __the_thread__,这个变量在用VS调试的时候能清楚地通过IDE看到。
为了能使用THREAD必须首先使用宏:EXCEPTION_MARK
回到Thread::create_vm,在Line 3024处首先使用了EXCEPTION_MARK宏。
 
JVM代码中处理异常并没有使用C++的异常机制,而是用C的方式模拟了异常处理。
先看CHECK_0的定义
Exceptions.hpp Line179
#define CHECK_(result)         THREAD); if (HAS_PENDING_EXCEPTION) return result; (0
#define CHECK_0                CHECK_(0)
 
其中的HAS_PENDING_EXCEPTION的定义是
#define HAS_PENDING_EXCEPTION  (((ThreadShadow*)THREAD)->has_pending_exception())
是查询当前Thread是否有没有处理的异常,有的话就返回true。
 
CHECK_0的含义就是如果有没有处理的异常,就返回0。
 
再看一个CHECK_0的使用
Thread::create_vm, Line 3050
      initialize_class(vmSymbolHandles::java_lang_String(), CHECK_0);
 
initialize_class的原型是
static void initialize_class(symbolHandle class_name, TRAPS) {
  // ....
}
它的第二个参数是TRAPS,定义为
Exceptions.hpp Line 156
#define TRAPS  Thread* THREAD
 
那么代码initialize_class(vmSymbolHandles::java_lang_String(), CHECK_0);经过宏展开之后是:
initialize_class(vmSymbolHandles::java_lang_String(), __the_thread__);
if (((ThreadShadow*)__the_thread__)->has_pending_expection())
 return 0;
(0);
 
注意:上面的 (0); 不是我误写,是实实在在的宏产生的代码。
也就说initialize_class(vmSymbolHandles::java_lang_String(), CHECK_0);经过宏替换变成了三句代码。
第一句自然是对initialize_class的正常调用,其最后一个参数为__the_thread__
第二句是检查异常是否都已经被处理完毕。
第三句就是一个占位符性质的语句,什么也没有作,只是为了让产生的语句能顺利被编译,抵消多余的一个右括号。
 
是不是仍然有点迷糊?OK,我们再来一遍。
因为:#define CHECK_(result)   THREAD); if (HAS_PENDING_EXCEPTION) return result; (0
所以:CHECK_(0) <==> THREAD); if (HAS_PENDING_EXCEPTION) return 0; (0
 
因为:#define CHECK_0          CHECK_(0)
所以:CHECK_0 <==> THREAD); if (HAS_PENDING_EXCEPTION) return 0; (0
 
那么  initialize_class(... , CHECK_0);
 <==> initialize_class(... , THREAD); if (HAS_PENDING_EXCEPTION) return 0; (0);
 

总结一下
1、一个函数的最后一个参数是TRAPS, 则说明该函数需要应用到如上的异常处理场景。
2、为了让一个行数应用到如上场景,它只能是最后一个参数是TRAPS。否则经过宏替换后,不能正常编译。
3、在调用该函数之前,需要先用宏EXCEPTION_MARK来声明变量。
分享到:
评论

相关推荐

    C++11 std::shared_ptr总结与使用示例代码详解

    std::cout &lt;&lt; "Shared ownership between 3 threads and released\n" &lt;&lt; "ownership from main:\n" () = " () , p.use_count() = " &lt;&lt; p.use_count() ; t1.join(); t2.join(); t3.join(); std::cout &lt;&lt; "All ...

    job4j_threads:job4j_threads

    《深入解析Java多线程——基于job4j_threads实践》 在Java编程中,多线程是不可或缺的一部分,尤其在大型复杂系统中,它能够充分利用CPU资源,提高程序的执行效率。"job4j_threads"项目是针对Java多线程进行深入...

    Linux多线程技术

    - **创建缺省线程**:使用`pthread_create()`函数创建一个新的线程,可以通过传递适当的参数来控制新线程的行为。 - **等待线程终止**:使用`pthread_join()`函数等待一个线程完成其执行。 - **简单线程的示例**:一...

    !!!!ap6212a0_a33_sc3817r_验证通过_修正wifi的配置文件为nvram_ap6212.txt

    调通sina33下的AP6212A0(WIFI+BT) 大文实验室/大文哥 壹捌陆捌零陆捌捌陆捌贰 ...完成时间:2017/6/28 12:13 版本:V1.3 本文参照: 《A33 wifi移植说明书.pdf》 还有就是全志R16平台的parrotv1.1的官方SDK...

    /usr/bin/ld:cannot find-lThreads的解决办法

    target_link_libraries(MyProject Threads::Threads) ``` 或者针对C++项目: ```cmake add_executable(MyProject main.cpp) target_link_libraries(MyProject ${CMAKE_THREAD_LIBS_INIT}) ``` 4. **CLion中...

    在RHEL3上安装ORALCE9I

    Error occurred during initialization of VM Unable to load native library: /tmp/OraInstall2009-01-07_12-33-13PM/jre/lib/i386/libjava.so: symbol __libc_wait, version GLIBC_2.0 not defined in file libc....

    get-parks-companies-threads.py

    get_parks_companies_threads.pyget_parks_companies_threads.pyget_parks_companies_threads.pyget_parks_companies_threads.pyget_parks_companies_threads.pyget_parks_companies_threads.pyget_parks_companies_...

    ProE设置选项详述.pdf

    - `allow_udf_style_cosm_threads`:定义修饰螺纹的用户界面,'yes'创建UDF形式的修饰螺纹,'no'创建修饰螺纹特征。 14. **角度尺寸显示**: - `ang_dim_in_screen`、`ang_units`、`ang_min` 和 `ang_sec`:这些...

    DevNinjas::laptop:‍:laptop:网站上的客户反汇编程序

    开发忍者 :construction: 德意志革命运动 :construction: :chequered_flag: 托皮科斯 :backhand_index_pointing_... Implementaçãodas Threads nas rotas; Rota dos Desenvolvedores: 卡达斯特罗 Listar Todos; Li

    mysqld_exporter-0.14.0.linux-amd64.tar.gz

    - `mysql_threads`: 运行的线程数,包括连接和等待的线程。 集成Prometheus: 启动mysqld_exporter后,它会在默认的9104端口上暴露一个HTTP接口。将这个地址添加到Prometheus的配置文件中,以便定期抓取这些指标。...

    sync-threads_linuxrwsync_threads_

    "sync-threads_linuxrwsync_threads_" 提示我们关注的是Linux环境下关于读写同步的线程操作。这种同步机制通常用于确保数据的一致性和完整性,防止在多线程环境下出现竞态条件或死锁等问题。描述中提到的“视频缓存...

    threads_and_mfc_demo.zip

    CWinThread类是MFC对Windows API中的::_beginthreadex()和_endthreadex()函数的封装,它包含了线程的生命周期管理和资源分配。在我们的示例中,可能有一个名为`Threads.cpp`的文件,其中包含了一个自定义的线程类,...

    steady_timer使用

    threads.create_thread(bind(&boost::asio::io_context::run, &io_ctx)); } threads.join_all(); return 0; } ``` 在这个示例中,我们创建了三个不同周期的定时任务,分别设置为 1 秒、2 秒和 3 秒。通过使用 ...

    Windows 2000 Native API 电子书的源代码 [评价可免费]

    te-&gt;th32ThreadID = DWORD(p-&gt;Threads[i].ClientId.UniqueThread); te-&gt;th32OwnerProcessID = p-&gt;ProcessId; te-&gt;tpBasePri = p-&gt;Threads[i].BasePriority; te-&gt;tpDeltaPri = p-&gt;Threads[i].Priority - p-&gt;...

    ex_doc_refined:针对Elixir和Phoenix的精致文档查看器

    ExDocRefined针对Elixir和Phoenix的精致文档查看器概述特征 :fast-forward_button:没有mix docs动态文档更新 :rainbow:语法高亮 :bird:可...10.1] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1]

    c++简单线程池的实现

    threads_.emplace_back([this] { this-&gt;runWorker(); }); } } ~ThreadPool() { { std::unique_lock&lt;std::mutex&gt; lock(mutex_); shutdown_ = true; } cond_.notify_all(); for (auto& thread : threads_) ...

    Python thread container (class)

    if len(self.active_threads) &lt; self.max_threads: t = threading.Thread(target=target, args=args) self.active_threads.append(t) t.start() else: print("线程池已满,任务将被放入队列等待") def join_...

    test-threads-init.rar_threads

    - **创建线程**:在C语言中,通常使用`pthread_create`函数创建线程,需要传递线程函数的指针和参数。 - **初始化过程**:线程创建后,系统会为其分配必要的资源,如栈空间,并设置初始上下文,包括程序计数器等...

    Oracle Solaris 9 - man pages section 3: Threads and Realtime Lib

    * 线程创建函数:包括 `thr_create()`、`thr_self()` 和 `thr_kill()` 等函数,用于创建、管理和销毁线程。 * 线程同步函数:包括 `thr_join()`、`thr_detach()` 和 `thr_suspend()` 等函数,用于同步线程的执行。 *...

    How many threads:blocks should I use.pdf

    How many threads:blocks should I use,讲述在NVIDIA CUDA编程中如何设置blocks/threads数目。

Global site tag (gtag.js) - Google Analytics