运行时数据区概述及线程

前言

本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段

当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化 这几个阶段完成后,就会用到执行引擎对我们的类进行使用,同时执行引擎将会使用到我们的运行时数据区

也就是大厨做饭,我们把大厨后面的东西(切好的菜,刀,调料),比作是运行时数据区。而厨师可以类比于执行引擎,将通过准备的东西进行制作成精美的菜品

内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的JVM对于内存的划分方式和管理机制存在着部分差异。结合JVM虚拟机规范,来探讨一下经典的JVM内存布局。

我们通过磁盘或者网络IO得到的数据,都需要先加载到内存中,然后CPU从内存中获取数据进行读取,也就是说内存充当了CPU和磁盘之间的桥梁

运行时数据区的完整图

Java虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程对应的数据区域会随着线程开始和结束而创建和销毁。

灰色的为单独线程私有的,红色的为多个线程共享的。即:

  • 每个线程:独立包括程序计数器、栈、本地栈。
  • 线程间共享:堆、堆外内存(永久代或元空间、代码缓存)(即方法区)



其中,我们主要考虑的垃圾回收问题在于堆空间(占绝大部分)和方法区。在JDK8以后,方法区换为元空间,使用本地内存,本地内存虽然大,但也可能存在溢出问题,因此也会考虑回收问题。

关于线程间共享的说明

线程

  • 线程是一个程序里的运行单元。JVM允许一个应用有多个线程并行的执行。

  • 在Hotspot JVM里,每个线程都与操作系统的本地线程直接映射。

    • 当一个Java线程准备好执行以后,此时一个操作系统的本地线程也同时创建。Java线程执行终止后,本地线程也会回收。
  • 操作系统负责所有线程的安排调度到任何一个可用的CPU上。一旦本地线程初始化成功,它就会调用Java线程中的run()方法。当run()方法执行出现异常,Java线程必然终止,此外,cpu还需考虑是否终止JVM虚拟机,若上述终止的是最后一个非守护线程,那么此时,虚拟机就可以退出了。

    • 线程分为守护线程和普通线程,当程序中只剩下守护线程时,虚拟机就可以退出了。

JVM系统线程

如果你使用jconsole或者是任何一个调试工具,都能看到在后台有许多线程在运行。这些后台线程不包括调用public static void main(String[])的main线程以及所有这个main线程自己创建的线程。|
这些主要的后台系统线程在Hotspot JVM里主要是以下几个:

  • 虚拟机线程:这种线程的操作是需要JVM达到安全点才会出现。这些操作必须在不同的线程中发生的原因是他们都需要JVM达到安全点,这样堆才不会变化。这种线程的执行类型包括"stop-the-world"的垃圾收集,线程栈收集,线程挂起以及偏向锁撤销。
  • 周期任务线程:这种线程是时间周期事件的体现(比如中断),他们一般用于周期性操作的调度执行。
  • GC线程:这种线程对在JVM里不同种类的垃圾收集行为提供了支持。
  • 编译线程:这种线程在运行时会将字节码编译成到本地代码。
  • 信号调度线程:这种线程接收信号并发送给JVM,在它内部通过调用适当的方法进行处理。

03-运行时数据区概述及线程相关推荐

  1. JVM学习笔记之-运行时数据区概述及线程概述,程序计数器(PC寄存器),虚拟机栈(栈,局部变量表,操作数栈,动态连接,方法调用,方法返回地址等),本地方法接口,本地方法栈

    运行时数据区概述及线程概述 内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了Java在运行过程中内存申请.分配.管理的策略,保证了JV ...

  2. jconsole 里的线程编号一直在增加_第三章_运行时数据区概述及线程

    运行时数据区概述及线程 概述 本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段 当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化 ...

  3. 第 3 章 运行时数据区概述及线程

    第 3 章 运行时数据区概述及线程 1.前言 本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段 当我们通过前面的:类的加载 --> 验证 --> 准备 --> ...

  4. Java8 JVM运行时数据区概述 (极其详细长文)

    文章目录 运行时数据区概述 JVM中的线程说明 PC寄存器(PC Register) PC寄存器介绍 使用举例 问题:使用PC寄存器存储字节码指令地址有什么用?为什么使用PC寄存器存储? 问题:为什么 ...

  5. 【JVM】运行时数据区概述(程序计数器、虚拟机栈、本地方法栈)

    前言 本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段 当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化 这几个阶段完成后,就会 ...

  6. 深入理解JVM底层原理——运行时数据区

    运行时数据区概述和线程 1.运行时数据区概述 !     内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了Java在运行过程中内存申请 ...

  7. 一篇文章带你快速理解JVM运行时数据区 、程序计数器详解 (手画详图)值得收藏!!!

    受多种情况的影响,又开始看JVM 方面的知识. 1.Java 实在过于内卷,没法不往深了学. 2.面试题问的多,被迫学习. 3.纯粹的好奇. 很喜欢一句话:"八小时内谋生活,八小时外谋发展. ...

  8. Java程序员必知必会之JVM运行时数据区

    JVM类加载概述 JVM垃圾回收概述 运行时数据区概述 程序计数器(Program Counter Register) 是一块较小的内存空间,可以看作是当前线程所执行字节码的行号指示器,指向下一个将要 ...

  9. JVM学习(七):运行时数据区(精讲)

    目录 一.运行时数据区概述 1.1 概述 1.2 运行时数据区中的GC和OOM 二.程序计数器(PC寄存器,Program Counter Register) 2.1 介绍 2.2 作用 2.3 特点 ...

最新文章

  1. side menu待研究
  2. oracle数据库的高可用r,Oracle高可用之dataguard
  3. Hibernate 中集合对象的抓取策略(Fetching strategies)
  4. 学习响应式BootStrap来写融职教育网站,Bootsrtap第七天PC端轮播图
  5. 如何使用Kubernetes官网的免费测试集群学习Kubernetes操作
  6. 在MySQL数据库上使用Quartz Scheduler入门
  7. jupyter问题: failed to create cublas handle: CUBLAS_STATUS_ALLOC_FAILED
  8. 《Photoshop CS3专家讲堂视频教程》(个人收集)
  9. LightOJ 1224 DNA Prefix
  10. 通过GitHub和GoDaddy搭建静态个人博客
  11. gitlab 配https_gitlab容器--带https配置
  12. [cocos2d-iphone]ios6截图问题
  13. 用浏览器轻松录制音频、视频—— MediaRecorder API
  14. 回顾 Firefox 历史
  15. WR | 西湖大学鞠峰组微纳塑料污染对人工湿地菌群与脱氮功能的影响
  16. ROS18.04 解决:[gazebo_gui-3] process has died
  17. 关于“校外”小饭桌就餐安全致全区学生家长的一封信
  18. 左耳听风ARTS第1周
  19. Emlog主题:DJ音乐主题
  20. android rar文件怎么打开方式,android开发如何打开rar压缩文件

热门文章

  1. tablib把数据导出为Excel、JSON、CSV等格式的Py库(写入数据并导出exl)
  2. [C程序设计语言]第一部分
  3. 推荐六款帮助你实现惊艳视差滚动效果的 jQuery 插件
  4. 做靠谱的程序员--《程序员修炼之道》读书报告
  5. 新增数据时遇到特殊字符
  6. 基于灰度变换的图像增强
  7. 剑指offer-二叉搜索树的后序遍历序列
  8. mysql数据库切换
  9. iOS wkwebview https 加载不受信用的站点
  10. css不常用重要属性