JVM学习笔记二:运行时数据区概述及JVM线程

Posted 算不出来没办法

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM学习笔记二:运行时数据区概述及JVM线程相关的知识,希望对你有一定的参考价值。

目录

概述

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,在它内部通过调用适当的方法进行处理。

以上是关于JVM学习笔记二:运行时数据区概述及JVM线程的主要内容,如果未能解决你的问题,请参考以下文章

JVM学习笔记三:运行时数据区之程序计数器

JVM学习笔记四:运行时数据区之虚拟机栈

JVM学习--JVM运行时数据区图文详解

JVM学习笔记六:运行时数据区之堆

JVM虚拟机详解运行时数据区概述及线程

JVM虚拟机详解运行时数据区概述及线程