Java学习之路--JVM篇

JVM (Java虚拟机)是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、
一个垃圾回收,堆 和 一个存储方法域。 JVM 是运行在操作系统之上的,它与硬件没有直接
的交互。深入理解JVM的工作原理有助于更好地学习Java这门语言。

线程

Hotspot JVM 中的 Java 线程与原生操作系统线程有直接的映射关系。 当线程本地存储、缓冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建一个操作系统原生线程。Java 线程结束,原生线程随之被回收。操作系统负责调度所有线程,并把它们分配到任何可用的 CPU 上。当原生线程初始化完毕,就会调用 Java 线程的 run() 方法。当线程结束时,会释放原生线程和 Java 线程的所有资源。

HotSpot JVM后台运行的系统线程

线程 描述
虚拟机线程 该线程等待JVM到达安全点操作出现。这些操作必须要在独立的线程里执行,因为当堆修改无法进行时,线程都需要JVM位于安全点。这些操作的类型有:stop-the-word垃圾回收、线程dump、线程暂停、线程偏向锁
周期性任务线程 该线程负责定时器事件(中断),用来调度周期性操作的执行
GC线程 支持JVM中不同的垃圾回收活动
编译器线程 这些线程在运行时将字节码动态编译成本地平台相关的机器码
信号分发线程 接收发送到JVM的信号并调用适当的JVM方法处理

JVM内存区域

JVM 内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区
域【JAVA 堆、方法区】、直接内存。

线程私有数据区域生命周期与线程相同, 依赖用户线程的启动/结束 而 创建/销毁(在 Hotspot
JVM 内。线程共享区域随虚拟机的启动/关闭而创建/销毁

程序计数器(线程私有)

一块比较小的内存空间,是当前线程所执行的字节码的行号指示器(如果是Native方法,则为空),每条线程都有一个独立的程序计数器,这类内存也成为“线程私有内存”。

该区域没有规定任何OutOfMemoryError情况

虚拟机栈(线程私有)

是描述Java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧(Stack Frame)
用于存储局部变量表、操作数栈、动态链接、方法出口等信息。 每一个方法从调用直至执行完成
的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。

本地方法区(线程私有)

本地方法区与Java Stack作用类似,区别是虚拟机栈为执行Java方法服务,本地方法栈为Native方法服务,如果虚拟机实现使用C-linkage模型来支持Native调用,那么该栈将会是C栈,但HotSpot VM直接就吧本地方法栈和虚拟机栈合二为一。

堆区(线程共享)-运行时的数据区

创建的对象和数组都保存在Java堆内存中,也是垃圾回收器进行垃圾收集的最重要的内存区域。由于现代VM采用分代收集算法,因此Java堆从垃圾回收的角度可以分为:新生代(Eden区、From Survivor区和To Survivor区)和老年代。


Java学习之路--JVM篇
https://chujian521.github.io/blog/2023/02/26/Java学习之路-JVM篇/
作者
Encounter
发布于
2023年2月26日
许可协议