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

文章目录

  • 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.mfbz.cn/a/424717.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

吴恩达机器学习全课程笔记第六篇

目录 前言 P96-P100 使用多个决策树 随机森林算法 XGBoost 什么时候使用决策树 P101-P107 聚类 K-means 初始化K-means 选择聚类的个数 P108-P113 异常检测算法 开发和评估异常检测系统 异常检测vs监督学习 选择要使用的特征 前言 这是吴恩达机器学习笔记的第…

【嵌入式实践】【芝麻】【设计篇-2】从0到1给电动车添加指纹锁:项目可行性分析

0. 前言 该项目是基于stm32F103和指纹模块做了一个通过指纹锁控制电动车的小工具。支持添加指纹、删除指纹,电动车进入P档等待时计时,计时超过5min则自动锁车,计时过程中按刹车可中断P档状态,同时中断锁车计时。改项目我称之为“芝…

基于反光柱特征的激光定位算法思路

目录 1. 识别反光柱2. 数据关联2.1 基于几何形状寻找匹配2.2 暴力寻找匹配 3. 位姿估计(最小二乘求解)4. 问题4.1 精度问题4.2 快速旋转时定位较差 1. 识别反光柱 反光柱是特殊材料制成,根据激光雷达对反光材料扫描得到的反射值来提取特征。…

如何解决微服务的数据一致性分发问题?

介绍 系统架构微服务化以后,根据微服务独立数据源的思想,每个微服务一般具有各自独立的数据源,但是不同微服务之间难免需要通过数据分发来共享一些数据,这个就是微服务的数据分发问题。Netflix/Airbnb等一线互联网公司的实践[参考附录1/2/3]表明,数据一致性分发能力,是构…

京东云硬钢阿里云:承诺再低10%

关注卢松松,会经常给你分享一些我的经验和观点。 阿里云刚刚宣布史上最大规模的全线产品降价20%,这热度还没过,京东云当晚就喊话:“随便降、比到底!,全网比价,击穿低价,再低10%”,并…

求最短路径之BF算法

介绍 全称Bellman-Ford算法,目的是求解有负权边的最短路径问题。 考虑环,根据环中边的边权之和的正负,将环分为零环、正环、负环。其中零环、正环不会影响最短路径的求解,而负环会影响最短路径的求解。 可用BF算法返回一个bool值…

Redis之十:Spring Data Redis --- CrudRepository方式

SpringData Redis CrudRepository方式 Spring Data Redis 的 CrudRepository 是 Spring Data 框架中用于提供基础 CRUD(创建、读取、更新和删除)操作的一个接口。在与 Redis 集成时,尽管 Redis 是一个键值存储系统,并没有像关系型…

【达梦数据库】如何使用idea antrl4插件方式dm sql

使用idea中的antrl插件进行分析 1.打开IDEA,在File—Settings—Plugins中,安装ANTLR v4 grammar plugin插件。 2.加载达梦的语法文件 3.配置生成路径和目录(可采用默认) 4.编译DmSqlParser.g4 DmSqlLexer.g4 5.输入SQL/输入文件 …

用Flutter开发App:助力您的移动业务腾飞

一、Flutter简介 Flutter是Google推出的用于构建多平台应用程序的开源UI框架。它使用Dart语言编写,可以编译为原生机器代码,从而提供卓越的性能和流畅的用户体验。 二、Flutter的优势 一套代码,多平台部署:Flutter可以使用一套代…

electron安装最后一部卡住了?

控制台如下错误 不是的话基本可以划走了 这个很可能是镜像出现问题了,不一定是npm镜像 打开npm的配置文件添加下述 electron_mirrorhttps://cdn.npmmirror.com/binaries/electron/ electron_builder_binaries_mirrorhttps://npmmirror.com/mirrors/electron-build…

将本地的镜像上传到私有仓库

使用register镜像创建私有仓库 [rootopenEuler-node1 ~]# docker run --restartalways -d -p 5000:5000 -v /opt/data/regostry:/var/lib/registry registry:2[rootopenEuler-node1 ~]# docker images REPOSITORY TAG IMAGE…

JAVAEE初阶 JVM(二)

垃圾回收和双亲委派模型 1.双亲委派模型2.垃圾回收机制(1) 识别垃圾1.引用计数2.可达性分析 (2) 销毁垃圾1.标记清除2.复制算法3.标记整理 3.分代回收 1.双亲委派模型 描述了如何查找.class文件的策略. 同时JVM中有专门进行类加载的操作,有一个模块,叫做类加载器. 上述就是为了…

Linux(CentOS为例)环境下 Git提交代码加速,使用FastGithub,运行报错解决

当你的在服务器上使用Git进行推送时,时常会出现超时错误。这里使用FastGithub 首先下载FastGithub 这个软件作者不是为什么删除了GithUb的仓库,这个链接还有。下载Linux版本的 FastGithub Linux,Windows版本 下载完毕后解压 ./fastgithu…

Stable Diffusion WebUI API http://127.0.0.1:7860/docs空白

在尝试调用Stable Diffusion WebUI API的时候,打开http://127.0.0.1:7860/docs遇到了以下页面 网络诊断是这样的原因: 修bug,改来改去遇到了以下两种页面: 此时http://127.0.0.1:7860可以如下正常显示: 查资料的时候找…

重学SpringBoot3-@EnableConfigurationProperties注解

重学SpringBoot3-EnableConfigurationProperties注解 1. 引言2. EnableConfigurationProperties 的作用3. 使用示例4. 总结 1. 引言 Spring Boot 提供了一种便捷的方式来管理和校验应用程序的配置,即通过类型安全的配置属性。EnableConfigurationProperties 注解在…

【详识JAVA语言】数组的定义与使用

数组的基本概念 为什么要使用数组 假设现在要存5个学生的javaSE考试成绩,并对其进行输出,按照之前掌握的知识点,我么会写出如下代码: public class TestStudent{public static void main(String[] args){int score1 70;int sc…

【AI绘画】免费GPU Tesla A100 32G算力部署Stable Diffusion

免责声明 在阅读和实践本文提供的内容之前,请注意以下免责声明: 侵权问题: 本文提供的信息仅供学习参考,不用做任何商业用途,如造成侵权,请私信我,我会立即删除,作者不对读者因使用本文所述方法…

简单的shell 脚本练习

编写函数,实现打印绿色OK和红色FAILED,判断是否有参数,存在为Ok,不存在为FAILED (1)编写脚本 (2)更改权限测试 编写函数,实现判断是否无位置参数,如无参数&a…

wordpress外贸独立站

WordPress外贸电商主题 简洁实用的wordpress外贸电商主题,适合做外贸跨境的电商公司官网使用。 https://www.jianzhanpress.com/?p5025 华强北面3C数码WordPress外贸模板 电脑周边、3C数码产品行业的官方网站使用,用WordPress外贸模板快速搭建外贸网…

【机器学习】实验5,AAAI 会议论文聚类分析

本次实验以AAAI 2014会议论文数据为基础,要求实现或调用无监督聚类算法,了解聚类方法。 任务介绍 每年国际上召开的大大小小学术会议不计其数,发表了非常多的论文。在计算机领域的一些大型学术会议上,一次就可以发表涉及各个方向…
最新文章