03-运行时数据区概述及线程
运行时数据区概述及线程
前言
本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段
当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化 这几个阶段完成后,就会用到执行引擎对我们的类进行使用,同时执行引擎将会使用到我们的运行时数据区
也就是大厨做饭,我们把大厨后面的东西(切好的菜,刀,调料),比作是运行时数据区。而厨师可以类比于执行引擎,将通过准备的东西进行制作成精美的菜品
内存是非常重要的系统资源,是硬盘和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-运行时数据区概述及线程相关推荐
- JVM学习笔记之-运行时数据区概述及线程概述,程序计数器(PC寄存器),虚拟机栈(栈,局部变量表,操作数栈,动态连接,方法调用,方法返回地址等),本地方法接口,本地方法栈
运行时数据区概述及线程概述 内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了Java在运行过程中内存申请.分配.管理的策略,保证了JV ...
- jconsole 里的线程编号一直在增加_第三章_运行时数据区概述及线程
运行时数据区概述及线程 概述 本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段 当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化 ...
- 第 3 章 运行时数据区概述及线程
第 3 章 运行时数据区概述及线程 1.前言 本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段 当我们通过前面的:类的加载 --> 验证 --> 准备 --> ...
- Java8 JVM运行时数据区概述 (极其详细长文)
文章目录 运行时数据区概述 JVM中的线程说明 PC寄存器(PC Register) PC寄存器介绍 使用举例 问题:使用PC寄存器存储字节码指令地址有什么用?为什么使用PC寄存器存储? 问题:为什么 ...
- 【JVM】运行时数据区概述(程序计数器、虚拟机栈、本地方法栈)
前言 本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段 当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化 这几个阶段完成后,就会 ...
- 深入理解JVM底层原理——运行时数据区
运行时数据区概述和线程 1.运行时数据区概述 ! 内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了Java在运行过程中内存申请 ...
- 一篇文章带你快速理解JVM运行时数据区 、程序计数器详解 (手画详图)值得收藏!!!
受多种情况的影响,又开始看JVM 方面的知识. 1.Java 实在过于内卷,没法不往深了学. 2.面试题问的多,被迫学习. 3.纯粹的好奇. 很喜欢一句话:"八小时内谋生活,八小时外谋发展. ...
- Java程序员必知必会之JVM运行时数据区
JVM类加载概述 JVM垃圾回收概述 运行时数据区概述 程序计数器(Program Counter Register) 是一块较小的内存空间,可以看作是当前线程所执行字节码的行号指示器,指向下一个将要 ...
- JVM学习(七):运行时数据区(精讲)
目录 一.运行时数据区概述 1.1 概述 1.2 运行时数据区中的GC和OOM 二.程序计数器(PC寄存器,Program Counter Register) 2.1 介绍 2.2 作用 2.3 特点 ...
最新文章
- side menu待研究
- oracle数据库的高可用r,Oracle高可用之dataguard
- Hibernate 中集合对象的抓取策略(Fetching strategies)
- 学习响应式BootStrap来写融职教育网站,Bootsrtap第七天PC端轮播图
- 如何使用Kubernetes官网的免费测试集群学习Kubernetes操作
- 在MySQL数据库上使用Quartz Scheduler入门
- jupyter问题: failed to create cublas handle: CUBLAS_STATUS_ALLOC_FAILED
- 《Photoshop CS3专家讲堂视频教程》(个人收集)
- LightOJ 1224 DNA Prefix
- 通过GitHub和GoDaddy搭建静态个人博客
- gitlab 配https_gitlab容器--带https配置
- [cocos2d-iphone]ios6截图问题
- 用浏览器轻松录制音频、视频—— MediaRecorder API
- 回顾 Firefox 历史
- WR | 西湖大学鞠峰组微纳塑料污染对人工湿地菌群与脱氮功能的影响
- ROS18.04 解决:[gazebo_gui-3] process has died
- 关于“校外”小饭桌就餐安全致全区学生家长的一封信
- 左耳听风ARTS第1周
- Emlog主题:DJ音乐主题
- android rar文件怎么打开方式,android开发如何打开rar压缩文件