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.mzph.cn/news/707948.shtml

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

相关文章

“智农”-农业一体化管控平台

大棚可视化|设施农业可视化|农业元宇宙|农业数字孪生|大棚物联网|大棚数字孪生|农业一体化管控平台|智慧农业可视化|智农|农业物联网可视化|农业物联网数字孪生|智慧农业|大棚三维可视化|智慧大棚可视化|智慧大棚|农业智慧园区|数字农业|数字大棚|农业大脑|智慧牧业数字孪生|智…

JS进阶——高级技巧

版权声明 本文章来源于B站上的某马课程,由本人整理,仅供学习交流使用。如涉及侵权问题,请立即与本人联系,本人将积极配合删除相关内容。感谢理解和支持,本人致力于维护原创作品的权益,共同营造一个尊重知识…

【饮食】如何有效的补充维生素,矿物质?学习笔记(附膳食营养素参考摄入量DRIs)

程序员养生指南之 【饮食】如何有效的补充维生素,矿物质?学习笔记(附膳食营养素参考摄入量DRIs) 文章目录 一、维生素补充1、需要补充维生素的情况2、食补:缺啥补啥3、补充剂(无脑吃) 二、膳食营…

Android 跨进程通信aidl及binder机制详解(一)

前言 上文中描述了,什么是绑定服务、以及创建一个绑定服务都可以通过哪些方式,同时说了通过扩展Binder类来创建一个绑定服务,并使用一个例子来说明了客户端与服务端的绑定过程,最后又总结了绑定服务的生命周期与调用过程。由于上…

(unity学习)一些效果的学习

一、学习视频 【Unity教程】零基础带你从小白到超神 二、效果实现 三、问题解决 Unity 点击UI与点击屏幕冲突的解决方案 关于unity UI界面操作与场景内操作不冲突问题

Unity安装与简单设置

安装网址:https://unity.cn 设置语言: 设置安装位置:否则C盘就会爆了 获取一个个人的资格证: 开始安装: 安装完毕。 添加模块:例如简体中文 新建项目: 布局2*3、单栏布局、 设置…

4. client-go 编程式交互

Kubernetes 系统使用 client-go 作为 Go 语言的官方编程式交互客户端库,提供对 Kubernetes API Server 服务的交互访问。Kubernetes 的源码中已经集成了 client-go 的源码,无须单独下载。client-go 源码路径为 vendor/k8s.io/client-go。 开发者经常使用…

前端架构: 脚手架之包管理工具的案例对比及workspace特性的基本使用

Npm WorkSpace 特性 1 )使用或不使用包管理工具的对比 vue-cli 这个脚手架使用 Lerna 管理,它的项目显得非常清晰在 vue-cli 中包含很多 package 点开进去,每一个包都有package.json它里面有很多项目,再没有 Lerna 之前去维护和管…

threehit二次注入案例

君衍. 一、环境搭建1、conn.php源码:2、register.php源码3、login.php源码4、index.php源码5、demo.php源码 二、数据库环境搭建1、注意点一2、注意点二报错原因 三、复现过程1、user12、user23、user34、user45、user56、user6-name7、user7-table8、user8-column9…

c++ 11: lock_guard/unique_lock详解

参考:C11 并发指南三(std::mutex 详解) - Haippy - 博客园 (cnblogs.com) c 11: lock_guard/unique_lock详解_c lock_guard-CSDN博客 C14 17共享超时互斥锁 shared_timed_mutex / 共享锁 shared_mutex-CSDN博客 概述 头文件介绍 Mutex 系列类(六种) …

Python编程实验五:文件的读写操作

目录 一、实验目的与要求 二、实验内容 三、主要程序清单和程序运行结果 第1题 第2题 四、实验结果分析与体会 一、实验目的与要求 (1)通过本次实验,学生应掌握与文件打开、关闭相关的函数,以及与读写操作相关的常用方法的…

vue中scss样式污染引发的思考

新做了一个项目,就是在登录后,就会产生左侧菜单的按钮颜色不一样。 然后发现样式是从这里传过来的 然后发现是登录页面的css给污染了 就是加了scope就把这个问题解决了 然后想总结一下这个思路:就是如何排查污染样式, 如果出现…

元素实现吸顶

1、position: sticky 直接设置元素需要吸顶的距离&#xff0c; <!-- App.vue --> <template><div id"app"><!-- <List:items"items":size"60":shownumber"10"/> --><div id"topHeight"&…

postman测试接口

1、postman测试接口 &#xff08;1&#xff09;首先安装postman 下载地址&#xff1a;Download Postman | Get Started for Free 选择对应版本下载&#xff0c;然后安装即可 &#xff08;2&#xff09;使用postman发送请求 比如以下这个请求例子&#xff1a; 使用postman发…

SpringBoot集成EasyExcel快速人们

目录 1.背景介绍 2.EasyExcel的使用 1.添加依赖 2.相关代码准备 1.实体类 2.ExcelUtil工具类 3.写入控制类 1.背景介绍 EasyExcel 是阿里巴巴开发的一款基于 Java 的专业化 Excel 操作工具&#xff0c;主要用于在 Java 应用程序中快速、高效地读写 Excel 文件。EasyExce…

Git 指令深入浅出【2】—— 分支管理

Git 指令深入浅出【2】—— 分支管理 分支管理1. 常用分支管理指令2. 合并分支合并冲突合并模式 3. 实战演习 分支管理 1. 常用分支管理指令 # 查看本地分支 git branch# 查看远程分支 git branch -r# 查看全部分支 git branch -aHEAD 指向的才是当前的工作分支 # 查看当前分…

开源的 Python 数据分析库Pandas 简介

阅读本文之前请参阅-----如何系统的自学python Pandas 是一个开源的 Python 数据分析库&#xff0c;它提供了高性能、易用的数据结构和数据分析工具。Pandas 特别适合处理表格数据&#xff0c;例如时间序列数据、异构数据等。以下是对 Pandas 的简明扼要的介绍&#xff0c;包括…

基于springboot实现旅游路线规划系统项目【项目源码+论文说明】

基于springboot实现旅游路线规划系统演示 摘要 随着互联网的飞速发展以及旅游产业的逐渐升温&#xff0c;越来越多人通过互联网获取更多的旅游信息&#xff0c;包括参考旅游文纪等内容。通过参考旅游博主推荐的旅游景点和规划线路&#xff0c;参考计划着自己的旅行&#xff0c…

【《高性能 MySQL》摘录】第 8 章 优化服务器设置

文章目录 8.1 MySQL 配置的工作原理8.1.1 语法、作用域和动态性8.1.2 设置变量的副作用8.1.3 入门8.1.4 通过基准测试迭代优化 8.2 什么不该做8.3 创建MySQL配置文件8.3.1 检查 MySQL 服务器状态变量 8.4 配置内存使用8.4.1 MySQL 可以使用多少内存8.4.2 每个连接需要的内存8.4…

STL常见容器(list容器)---C++

STL常见容器目录&#xff1a; 6.list容器6.1 list基本概念6.2 list构造函数6.3 list 赋值和交换6.4 list 大小操作6.5 list 插入和删除6.6 list 数据存取6.7 list 反转和排序6.8自定义排序案例 6.list容器 6.1 list基本概念 功能&#xff1a; 将数据进行链式存储&#xff1b; …