目录
概述
JVM各区域划分
JVM线程
线程的内存空间
JVM系统线程
概述
运行时数据区是JVM非常重要的组成部分,这一篇主要介绍运行时数据区各个区域的划分,以及JVM中的线程。
JVM各区域划分
学习JVM,必须牢记下图各个区域的分类,这很重要。
注意,上图的元数据区在JDK8以前常被称作“永久代”,本质上两者并不等价,仅仅是因为HotSpot虚拟机的设计团队选择把GC分代收集至方法区,或者说用永久代来实现方法区而已。这样HotSpot的垃圾收集器可以像管理Java堆一样管理这部分内存,能省去专门为方法区编写内存管理代码的工作。但是这种设计方式以现在的眼光来看并不明智,所以在JDK8中移除了永久代,使用本地内存来实现这一区域,称作元空间。(出自《深入理解Java虚拟机》)
JVM线程
- 线程是一个程序里的运行单元。JVM允许一个应用有多个线程并行的执行
- 在Hotspot JVM里,每个线程都与操作系统的本地线程直接映射,当一个Java线程准备好执行以后,此时一个操作系统的本地线程也同时创建。Java线程执行终止后,本地线程也会回收。
- 操作系统负责将线程安排调度到任何一个可用的CPU上。一旦本地线程初始化成功,它就会调用Java线程中的run( )方法。
- 如果一个线程抛异常,并且该线程是进程中最后一个守护线程,那么进程将停止。
线程的内存空间
其中的方法区和堆是所有线程共享的区域,而虚拟机栈、本地方法栈、程序计数器则是每个线程都具有的,线程私有的部分。其关系可用如下所示的图来表示:
JVM系统线程
- 虚拟机线程:这种线程的操作是需要JVM达到安全点才会出现(这里所说的安全点要到后面的垃圾回收才会提及)。这些操作必须在不同的线程中发生的原因是他们都需要JVM达到安全点,这样堆才不会变化。这种线程的执行类型括"stop-the-world"的垃圾收集,线程栈收集,线程挂起以及偏向锁撤销。
- 周期任务线程:这种线程是时间周期事件的体现(比如中断),他们一般用于周期性操作的调度执行。
- GC线程:这种线程对在JVM里不同种类的垃圾收集行为提供了支持(重点,同样也是垃圾收集章节的内容)。
- 编译线程:这种线程在运行时会将字节码编译成本地代码。
- 信号调度线程:这种线程接收信号并发送给JVM,在它内部通过调用适当的方法进行处理。