少年帮|JVM内幕:Java虚拟机详解
这篇文章解释了Java 虚拟机(JVM)的内部架构 。 下图显示了遵守 Java SE 7 规范的典型的 JVM 核心内部组件 。
上图显示的组件分两个章节解释 。 第一章讨论针对每个线程创建的组件 , 第二章节讨论了线程无关组件 。
- 线程
- JVM 系统线程
- 每个线程相关的
- 程序计数器
- 栈
- 本地栈
- 栈限制
- 栈帧
- 局部变量数组
- 操作数栈
- 动态链接
- 线程共享
- 堆
- 内存管理
- 非堆内存
- 即时编译
- 方法区
- 类文件结构
- 类加载器
- 更快的类加载
- 方法区在哪里
- 类加载器参考
- 运行时常量池
- 异常表
- 符号表
- Interned 字符串
JVM 系统线程如果使用 jconsole 或者其它调试器 , 你会看到很多线程在后台运行 。 这些后台线程与触发 public static void main(String[]) 函数的主线程以及主线程创建的其他线程一起运行 。 Hotspot JVM 后台运行的系统线程主要有下面几个:
虚拟机线程(VM thread)这个线程等待 JVM 到达安全点操作出现 。 这些操作必须要在独立的线程里执行 , 因为当堆修改无法进行时 , 线程都需要 JVM 位于安全点 。 这些操作的类型有:stop-the-world 垃圾回收、线程栈 dump、线程暂停、线程偏向锁(biased locking)解除 。 周期性任务线程这线程负责定时器事件(也就是中断) , 用来调度周期性操作的执行 。 GC 线程这些线程支持 JVM 中不同的垃圾回收活动 。 编译器线程这些线程在运行时将字节码动态编译成本地平台相关的机器码 。 信号分发线程这个线程接收发送到 JVM 的信号并调用适当的 JVM 方法处理 。
线程相关组件每个运行的线程都包含下面这些组件:
程序计数器(PC)PC 指当前指令(或操作码)的地址 , 本地指令除外 。 如果当前方法是 native 方法 , 那么PC 的值为 undefined 。 所有的 CPU 都有一个 PC , 典型状态下 , 每执行一条指令 PC 都会自增 , 因此 PC 存储了指向下一条要被执行的指令地址 。 JVM 用 PC 来跟踪指令执行的位置 , PC 将实际上是指向方法区(Method Area)的一个内存地址 。
栈(Stack)每个线程拥有自己的栈 , 栈包含每个方法执行的栈帧 。 栈是一个后进先出(LIFO)的数据结构 , 因此当前执行的方法在栈的顶部 。 每次方法调用时 , 一个新的栈帧创建并压栈到栈顶 。 当方法正常返回或抛出未捕获的异常时 , 栈帧就会出栈 。 除了栈帧的压栈和出栈 , 栈不能被直接操作 。 所以可以在堆上分配栈帧 , 并且不需要连续内存 。
Native栈并非所有的 JVM 实现都支持本地(native)方法 , 那些提供支持的 JVM 一般都会为每个线程创建本地方法栈 。 如果 JVM 用 C-linkage 模型实现 JNI(Java Native Invocation) , 那么本地栈就是一个 C 的栈 。 在这种情况下 , 本地方法栈的参数顺序、返回值和典型的 C 程序相同 。 本地方法一般来说可以(依赖 JVM 的实现)反过来调用 JVM 中的 Java 方法 。 这种 native 方法调用 Java 会发生在栈(一般是 Java 栈)上;线程将离开本地方法栈 , 并在 Java 栈上开辟一个新的栈帧 。
推荐阅读
- 金戈鐵馬|特朗普力挺铁杆支持者,枪杀两人的少年没错?抗议活动不断发酵
- 开封于七一|育迎宾尚法好少年,借温柔秋风多送法
- 少年|央视要搞选秀,热搜沸了!网友提名他当导师,点赞数第一
- 暖夏少年|2020电脑硬盘销量排行榜:七彩虹加入战局,硬是打倒了金士顿
- 少年一梦|2020畅销手机排行,iPhone无人超越,安卓旗舰全线溃败
- 少年帮|进入倒计时,华为突然宣布,供应链将迎来“洗牌”?
- 少年帮|纯国产“龙芯”即将来临,正式确认?中科院宣布决定
- 上线|原创央视也搞成团选秀!《上线吧!华彩少年》有哪些优势?粉丝放心了
- 海报|央视首档少年成团选秀节目《上线吧!华彩少年》开始全球招募
- 少年帮|正式确认?中科院宣布决定,纯国产“龙芯”即将来临