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区)和老年代。