JVM设计与实现-底层原理

本文探讨了JVM中的线程层级,Linux内核线程与用户线程的映射方式,以及栈展开在异常处理和垃圾回收中的作用。此外,还详细阐述了JVM如何调用Java方法,特别是CallStub在C/C++与Java之间的桥梁角色,以及内存分配和常量池的实现。最后,提到了内存对齐在JVM中的考虑。

摘自虚拟机设计与实现 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块,否则他就是未捕获异常,可能需要操作系统来处理,然后控制

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值