JVM运行时数据区——运行时数据区及线程概述

news2025/4/24 5:10:49

文章目录

  • 1、运行时数据区概述
  • 2、线程
  • 3、小结

内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM在程序执行期间把它所管理的内存分为若干个不同的数据区域。这些不同的数据区域可以分为两种类型:一种是在JVM启动时创建,仅在JVM退出时才被销毁,这种可以理解为线程共享的,另外一种数据区是针对每个线程的,是在创建线程时创建的,并在线程退出时销毁,这种可以理解为线程私有的。本贴将从线程的角度出发讲述JVM内存区域的划分。

1、运行时数据区概述

JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的JVM在内存的划分方式和管理机制方面存在着部分差异。下文将结合Java虚拟机规范,来探讨一下经典的JVM内存布局。

如下图所示:
在这里插入图片描述
运行时数据区可简单分为Native Method Stack(本地方法栈)、Program Counter Register(程序计数器)、Java Virtual Machine Stack(虚拟机栈)、Heap(堆区)和Method Area(方法区)。

JVM内存详细布局如下图所示:
在这里插入图片描述
,其中虚拟机栈是以栈帧为基本单位构成的,栈帧包括局部变量表、操作数栈、动态链接、方法返回地址和一些附加信息。堆区分为Young区(新生代)、Old区(老年代),这里讲解的是基于“经典分代”的HotSpot虚拟机内存布局。方法区分为常量池、方法元信息、klass类元信息。

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

如下图所示:
在这里插入图片描述

黄色的区域为单个线程私有,红色的区域为多个线程共享。

  • (1)线程私有的区域包括程序计数器(Program Counter Register,PC Register)、虚拟机栈(Virtual Machine Stack,VMS)和本地方法栈(Native Method Stack,NMS)。
  • (2)线程间共享的区域包括堆区(Heap)、方法区(Method Area)。

我们来举例说明一下什么是线程共享。在Java中存在一个类Runtime,这个类的详细介绍如下图所示:
在这里插入图片描述
该类采用了单例设计模式,每一个Java应用程序都有当前类Runtime的唯一实例。当前Runtime对象可以通过类的getRuntime()方法获取,一个JVM实例就对应着一个Runtime实例,Runtime对象就相当于运行时环境。通过这个实例可以允许在应用程序中进行一些交互操作,比如获得虚拟机的内存信息等。当多个线程访问该对象时,只有一个实例供线程访问,这就是线程共享。

2、线程

线程是一个程序里的运行单元。JVM允许一个应用有多个线程并行执行。在HotSpot虚拟机中,每个线程都与操作系统的本地线程直接映射。当一个Java线程准备好执行以后,此时这个操作系统的本地线程也会同时创建。Java线程执行终止后,本地线程也会回收。

操作系统负责将线程调度到任何一个可用的中央处理器(Central Processing Unit,CPU)上。一旦本地线程初始化成功,它就会调用Java线程中的run()方法。run()方法正常执行完成包含两种情况。一种是执行过程中未出现异常,方法正常执行结束。另一种是执行过程中出现了异常但是触发了相应的异常处理机制。方法正常执行完成之后,Java线程和本地线程都会被回收,并释放相应的资源。

需要强调的一点,如果执行run()方法的过程中出现了一些未捕获的异常或者有些异常没有及时处理,这时就会导致Java线程终止,本地线程再决定JVM是否要终止。JVM是否要终止取决于当前线程是不是最后一个非守护线程,非守护线程也称为用户线程,用户线程可以认为是系统的工作线程,它会完成这个程序要完成的业务操作,当一个Java应用内只有守护线程时,JVM自动退出。

守护线程是一种特殊的线程,就和它的名字一样,它是系统的守护者,在后台默默完成一些系统性的服务。在HotSpot虚拟机中,常见的守护线程主要包括以下3种:

  • (1)垃圾回收线程:这种线程对在JVM里不同种类的垃圾收集行为提供了支持。
  • (2)编译线程:这种线程在运行时会将字节码编译成本地代码。
  • (3)手动创建守护线程:在调用start()方法前调用setDaemon(true)可以将线程标记为守护线程。

3、小结

对运行时数据区的内部结构进行了简单介绍,运行时数据区包括方法区、程序计数器、本地方法栈、堆区以及虚拟机栈。从线程的角度可以把运行时数据区分为线程私有和线程共享两部分,最后介绍了HotSpot虚拟机中后台线程的分类。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1477176.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

接口测试报错“REQUEST JSON PARSING FAILED”

经验分享:json文本通过微信发送会自动添加空格,复制粘贴的之后需要注意,先把空格去掉再请求。 1.问题现象:接口测试的时候请求响应提示json格式错误 2.问题排查:JSON在线解析及格式化验证 - JSON.cn 利用第三方json解…

Flutter Dio进阶:使用Flutter Dio拦截器实现高效的API请求管理和身份验证刷新

Flutter笔记 使用Flutter Dio拦截器实现高效的API请求管理和身份验证刷新 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article…

pclpy 拉格朗日乘子法拟合平面

pclpy 拉格朗日乘子法拟合平面 一、算法原理1.算法步骤 二、代码三、结果1.左边原点云数据,右边将点云拉格朗日乘子法拟合平面投影在该平面 四、相关数据 一、算法原理 1.算法步骤 对k一近邻点拟合平面,最小二乘法(平面过重心)&…

金三银四面试必问:Redis真的是单线程吗?

文章目录 01 Redis中的多线程1)redis-server:2)jemalloc_bg_thd3)bio_xxx: 02 I/O多线程03 Redis中的多进程04 结论▼延伸阅读 由面试题“Redis是否为单线程”引发的思考 作者:李乐 来源:IT阅读…

【MySQL】数据管理——DML操作数据

目录 DML(数据操作语言)添加数据插入单行语法插入多行语法SQL示例将查询结果插入到新表中语法1:语法2: 修改数据语法示例关于SQL的运算符算术运算符比较运算符逻辑运算符 案例 删除数据DELETE命令语法 TRUNCATE TABLE 命令语法代码…

数据卷(Data Volumes)自定义镜像(Dockerfile)

目录 一.数据卷(Data Volumes) 二.自定义镜像(Dockerfile) 自定义centos 一.数据卷(Data Volumes) 数据卷(Data Volumes)是一个可供一个或多个容器使用的特殊目录,它将主机操作系统目录直接映射进容器,它可以提供很多有用的特性: 1.数据卷…

[DEBUG] spring boot-如何处理链接中的空格等特殊字符

问题&#xff1a; get或者post中提交的内容可能有空格、#等特殊字符&#xff0c;不做处理的话可能解析错误。 解决&#xff1a; html中&#xff1a; <a th:href"{/listSgrna(id${item.getGeneId()},geneName${item.getGeneName()},genome${genome},sgrnaNum${sgrnaN…

Java开发的核心模式 - MVC

文章目录 1、MVC设计模式2、Web开发本质3、服务器的性能瓶颈 1、MVC设计模式 MVC设计模式示意图 在整个Java学习之旅中&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;设计模式无疑占据着极其重要的地位&#xff0c;堪称理解和掌握Java项目开发精髓的钥匙。如…

2024最新Android面试题目,【设计思想解读开源框架】

前言 从18年毕业至今&#xff0c;就职过两家公司&#xff0c;大大小小项目做了几个&#xff0c;非常感谢我的两位老大&#xff0c;在我的android成长路上给予我很多指导&#xff0c;亦师亦友的关系。 从年前至今参加面试了很多公司&#xff0c;也收到了几家巨头的offer&#…

【React架构 - Scheduler中的MessageChannel】

前序 我们都知道JS代码是在浏览器5个进程(下面有介绍)中渲染进程中的Js引擎线程执行的&#xff0c;其他还有GUI渲染线程、定时器线程等&#xff0c;而页面的布局和绘制是在GUI线程中完成的&#xff0c;这些线程之间是互斥的&#xff0c;所以在执行Js的同时会阻塞页面的渲染绘制…

Python实现向量自回归模型(VAR算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 向量自回归模型&#xff08;Vector Autoregression&#xff0c;简称VAR&#xff09;是一种多元时间序列…

国内 永远不会倒闭的四个行业

据教育部公布的数据&#xff0c;2024届高校毕业生人数预计将达到1187万人&#xff0c;较2023年增加29万&#xff0c;再创历史新高。 同时&#xff0c;受全球经济形势的影响&#xff0c;一些行业和领域的就业形势并不乐观&#xff0c;比如房地产、传统零售业、传统金融业、低技能…

Python 从文件中读取JSON 数据并解析转存

文章目录 文章开篇Json简介Json数据类型Json硬性规则Json数据转化网站Json和Dict类型转换json模块的使用Python数据和Json数据的类型映射json.dumps1.字典数据中含有**存在中文**2.json数据通过缩进符**美观输出**3.对Python数据类型中键进行**排序输出**4.json数据**分隔符的控…

Rocky Linux 运维工具 tar

一、tar的简介 tar​命令是Linux操作系统中用于打包和解压文件的工具。通过 ​tar​可以将多个文件或目录打包成一个归档文件&#xff0c;也可以解压这些归档文件。 二、tar的参数说明 -c 用于将指定的文件或目录打包成一个归档文件&#xff0c;即压缩归档文件 -f 用于指定归档…

Kubernetes activemq系列| k8s 部署activemq artemis

一、ActiveMQ Artemis介绍 Apache ActiveMQ Artemis 是一个高性能的开源消息代理,它完全符合 Java Message Service (JMS) 2.0 规范,并支持多种通信协议,包括 AMQP、MQTT、STOMP 和 OpenWire 等。ActiveMQ Artemis 由 Apache Software Foundation 开发和维护,旨在提供可靠…

select * from 表 c=‘1‘ and b=‘2‘ and a=‘3‘; abc是联合索引,这样查询会命中索引吗?

倒叙也会命中索引 但是要注意&#xff0c;倒叙的时候必须要有a存在&#xff0c;否则就会索引失效 因为mysql底层会有优化器去进行优化&#xff0c;但是如果没有a的话&#xff0c;那么优化器就不知道要优化那个索引了&#xff0c;所以他走了全表&#xff0c;导致索引失效

小程序实现定位城市切换且城市根据首字母A-Z排序后端数据实现逻辑

场景&#xff1a; 话不多说后端提供数据实现步骤&#xff1a; 1.controller层 Api(tags {"[地区]-城市相关接口"}) RestController RequestMapping("region") Slf4j public class RegionController extends BaseController {Resourceprivate RegionServ…

车载电子电器架构 —— 基础技术开发概述

车载电子电器架构 —— 基础技术开发概述 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗…

【数据结构】单链表解析+完整代码(插入、删除、尾插法、头插法、按值和按位查找、前插和后插)带头结点和不带两种实现

文章目录 3.1 单链表3.1.1 单链表的定义3.1.2 单链表的插入A.按位序插入&#xff08;带头结点&#xff09;B.按位序插入&#xff08;不带头结点&#xff09;C.指定结点的后插操作D.指定结点的前插操作 3.1.3 单链表的删除A.按位序删除B.删除指定结点 3.1.4 单链表的查找A.按位查…

jetson nano——编译安装opencv-python==4.3.0.38

目录 1.下载源码&#xff0c;我提供的链接如下&#xff1a;2.解压文件3.安装依赖scikit4.安装opencv-python5.查看opencv-python版本 系统&#xff1a;jetson-nano-jp451-sd-card-image ubuntu 18.04 1.下载源码&#xff0c;我提供的链接如下&#xff1a; 链接&#xff1a;http…