首页 > 其他分享 >JVM运行时数据区

JVM运行时数据区

时间:2023-07-19 15:56:18浏览次数:28  
标签:Java 方法 虚拟机 线程 内存 JVM 数据 运行

JVM运行时数据区

1.概述

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

下图是经典的JVM内存布局

下图是ali的布局图

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

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

  • 每个线程:独立包括程序计数器、栈、本地栈。

  • 线程间共享:堆、堆外内存(永久代或元空间、代码缓存)

每个JVM只有一个Runtime实例。即为运行时环境,相当于内存结构的中间的那个框框:运行时环境。

1.1程序计数器

  程序计数器也叫pc寄存器 可以看作是当前线程所执行字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来选取下一条要执行的字节码指令。需要注意的是,每条线程都需要有一个独立的程序计数器,这样在程序多线程执行时才不会出错。

1.2虚拟机栈

  与程序计数器一样,Java虚拟机栈也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。

  经常有人把Java内存区分成堆内存和栈内存,这是一种很粗糙的分法,其中栈内存就是现在讲的虚拟机栈,或者说是虚拟机栈中局部变量表部分。局部变量表存放了编译器克制的各种基本数据类型(如boolean、char等)、对象引用(reference类型,它不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)和returnAddress类型(指向了一条字节码指令的地址)。

  局部变量表所需的内存空间在编译器间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。

1.3本地方法栈

  它的作用和虚拟机栈十分相似,不同在于,虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务。有的虚拟机直接把本地方法栈和虚拟机栈合二为一。

1.4堆

  堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存(所有的对象实例以及数组都要在堆上分配内存)。

  堆是垃圾收集器管理的主要区域,很多时候也被称为GC堆。Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。

1.5方法区

  方法区也是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即使编译器编译后的代码等数据。运行时常量池也是方法区的一部分。

2.线程

  • 线程是一个程序里的运行单元。JVM允许一个应用有多个执行。
  • 线程并行的
  • 在Hotspot JVM里,每个线程都与操作系统的本地线程直接映射。当一个Java线程准备好执行以后,此时一个操作系统的本地线程也同时创建。Java线程执行终止后,本地线程也会回收。
  • 操作系统负责所有线程的安排调度到任何一个可用的CPU上。一旦本地线程初始化成功,它就会调用Java线程中的run()方法。

2.1JVM系统线程

这些主要的后台系统线程在Hotspot JVM里主要是以下几个:

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

本文并未详细介绍运行时数据区的每个区域,由于内容过多,下文逐个介绍每个区域的功能以及作用

标签:Java,方法,虚拟机,线程,内存,JVM,数据,运行
From: https://www.cnblogs.com/dupengpeng/p/17565662.html

相关文章

  • JVM程序计数器
    JVM程序计数器1.介绍JVM中的程序计数寄存器(ProqramCounterRegister)中,Reqister的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序......
  • MySQL数据库没有hive数据库
    如何实现MySQL数据库没有hive数据库概述在这篇文章中,我们将介绍如何在MySQL数据库中创建一个没有hive数据库的实例。我们将通过一系列步骤来实现这个目标,包括创建数据库、创建表和插入数据等。我将为你提供每一步所需的代码,并解释每个代码的含义。步骤下面是实现这个目标的步骤......
  • MySQL查询两个表差异数据
    MySQL查询两个表差异数据在使用MySQL进行数据处理和分析时,有时需要比较两个表之间的差异数据。比如,我们可能需要找出在两个表中都存在的数据,或者找出只在其中一个表中存在的数据。本文将介绍如何使用MySQL进行这些差异数据查询,并提供相应的代码示例。创建示例表首先,我们需要创建......
  • MySQL把choose表中的report改名为score,数据类型改为float; 将choose表的score默
    MySQL把choose表中的report改名为score,数据类型改为float;将choose表的score默认值设为0流程步骤步骤操作1.连接至MySQL数据库2.切换至对应数据库3.修改表结构,将report改名为score并更改数据类型4.设定score字段的默认值为0具体步骤与代码示例步骤......
  • C/C++数据结构课程设计题目[2023-07-19]
    C/C++数据结构课程设计题目[2023-07-19]数据结构课程设计题目基本要求:1、每人1题,如果系统具有界面以及功能复杂,可以2人合作一题。2、可以自拟题目,难度不低于给定题目,且自拟的题目需要经过老师审核通过。3、要求实现一个界面美观、功能完整、具有实用性的系统。4、不限制......
  • K8S-Pod挂载数据卷权限问题
    场景:需要将同一个服务的多个Pod副本的日志持久化到本地,为方便根据Pod的名称快速查看日志,在Pod挂载数据卷时,可以通过subPathExpr和env变量配合使用为每个Pod副本自动创建以Pod名称命名的文件夹故障:自动创建的文件夹属主属组为root,业务进程使用appuser启动,导致程序无法进行写操作......
  • 5分钟教你从爬虫到数据处理到图形化一个界面实现山西理科分数查学校-Python
    5分钟教你从爬虫到数据处理到图形化一个界面实现山西理科分数查学校-Python引言在高考结束后,学生们面临的一大挑战是如何根据自己的分数找到合适的大学。这是一个挑战性的任务,因为它涉及大量的数据和复杂的决策过程。大量的信息需要被过滤和解析,以便学生们能对可能的大学选择有......
  • Django-4.2博客开发教程:需求分析并确定数据表(四)
    前三步已经完成了一个初步流程,从创建项目》应用》数据迁移》访问首页。以下是我整理的基本流程,接下来一步一步完成整个项目。 1.我们的需求: 博客的功能主要分为:网站首页、文章分类、文章内容、图片、文章推荐、文章排行、热门推荐、文章搜索 等~1、网站首页:首页是整个网站......
  • list数据实现先分组后排序
    使用jdk8的stream流(基本实现分组靠Collectors.goupingby),list自带的sort()方法排序,话不多说,代码如下: List<User>list=Arrays.asList(newUser("1","小明","2","一年级"), newUser("2","小名","1",&q......
  • 数据中心机房建设,务必确定这13个关键点
    下午好,我的网工朋友。关于机房、机架的相关内容,给你们说了不少。今天再给你补充个知识点,机房建设,要怎么做。熟悉机房建设的网工朋友可能都知道,一个全面的数据中心机房建设工程一般包括:综合布线、抗静电地板铺设、棚顶墙体装修、隔断装修、UPS、专用恒温恒湿空调、机房环境监控系统......