摘自虚拟机设计与实现 6.1 什么是线程
由于线程支持多个层级,当讨论到一个线程时,应该指出它位于哪个层级上,一个层级上的单个线程可能包含更高级上的多个线程
现实中没有必要构造太多层级的线程,通常不超过3级。第二级共享第1级的硬件上下文,第3级共享第二级的软件上下文
在Linux设计中,内核线程(软件线程)以M:N映射复用硬件上下文,glibc的用户线程以1:1映射使用内核线程上下文。有些系统在用户线程和内核线程之间使用M:N或者M:1映射,比如GNU Portable Threads 和Windows Fiber。但是这些特性要么不常用,要么只用于特殊情况
注意,在这里进程是一个无关紧要的概念,尽管进程常常和线程相混淆。线程主要是关于执行的控制流,而进程主要是关于内存空间隔离。如果两个先成运行在隔离的内存空间中,可以认为他们是运行在不同的进程中。在Linux内核中,因为所有的任务共享内核内存空间,所以在严格意义上说,在内核级别没有进程,只有内核线程。进程只存在于用户空间,用户空间为每个进程建立了隔离的虚拟内存你空间。在内核上下文中讨论进程也不是错误的,但这里进程实际上是指1:1映射到用户进程的内核线程。
摘自虚拟机设计与实现 8.1 栈展开
栈展开是指虚拟机枚举目标线程的栈内容的过程,通常涉及识别栈上方法帧的栈帧枚举过程,以及识别每个方法帧内容的栈槽枚举过程。这个过程从栈顶开始,因为这是当前栈指针指向的位置。我们知道栈指针是线程上下文的一部分,而线程上下文可以被线程直接访问。
异常处理需要栈展开,他需要运行时递归的展开栈帧,知道在某个方法内找到catch块,否则他就是未捕获异常,可能需要操作系统来处理,然后控制
本文探讨了JVM中的线程层级,Linux内核线程与用户线程的映射方式,以及栈展开在异常处理和垃圾回收中的作用。此外,还详细阐述了JVM如何调用Java方法,特别是CallStub在C/C++与Java之间的桥梁角色,以及内存分配和常量池的实现。最后,提到了内存对齐在JVM中的考虑。
订阅专栏 解锁全文
632

被折叠的 条评论
为什么被折叠?



