【JVM】内存分区

news2025/1/18 20:19:45

内存分区

  • 一. JVM 执行流程
  • 二. JVM 运行时数据区
    • 1. 堆(线程共享)
    • 2. Java虚拟机栈(线程私有)
    • 3. 本地方法栈(线程私有)
    • 4. 程序计数器(线程私有)
    • 5. 方法区(线程共享)
  • 小结

一. JVM 执行流程

  • 程序在执行之前先要把java代码转换成字节码(class文件).
  • JVM 首先需要把字节码通过类加载器(ClassLoader) 把文件加载到内存中 运行时数据区(Runtime Data Area) .
  • 而字节码文件是 JVM 的一套指令集规范,并不能直接交个底层操作系统去执行,因此需要特定的命令解析器 执行引擎(Execution Engine)将字节码翻译成底层系统指令再交由CPU去执行.
  • 而这个过程中需要调用其他语言的接口 本地库接口(Native Interface) 来实现整个程序的功能

这就是这4个主要组成部分的职责与功能。

在这里插入图片描述

总结来看, JVM 主要通过分为以下 4 个部分,来执行 Java 程序的,它们分别是:

  1. 类加载器(ClassLoader)
  2. 运行时数据区(Runtime Data Area)
  3. 执行引擎(Execution Engine)
  4. 本地库接口(Native Interface)

二. JVM 运行时数据区

JVM 运行时数据区域也叫内存布局,但需要注意的是它和 Java 内存模型(( Java Memory Model,简称 JMM)完全不同,属于完全不同的两个概念,它由以下 5 大部分组成:

在这里插入图片描述

1. 堆(线程共享)

堆的作用:程序中创建的所有对象都在保存在堆中。

堆里面分为两个区域:新生代和老生代。
新生代放新建的对象,当经过一定 GC 次数之后还存活的对象会放入老生代。
新生代还有 3 个区域:一个 Eden (伊甸区) + 两个 Survivor(S0/S1)。

在这里插入图片描述

垃圾回收的时候会将 Eden 中和正在使用的 Survivor 区中存活的对象放到一个未使用的 Survivor 中,并把当前的 Eden 和正在使用的 Survivor 清除掉。

2. Java虚拟机栈(线程私有)

Java 虚拟机栈的作用:描述 Java 方法执行的内存模型, 每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
我们常说的堆内存、栈内存中,栈内存指的就是虚拟机栈。
注意:Java虚拟机栈 是每个线程都有一份, 每个线程都有自己的方法调用关系

Java 虚拟机栈中包含了以下 4 部分:

在这里插入图片描述

  1. 局部变量表: 存放方法参数和局部变量。
  2. 操作栈:每个方法会生成一个先进后出的操作栈。
  3. 动态链接:指向运行时常量池的方法引用。
  4. 方法返回地址:PC 寄存器的地址。

什么是线程私有?

  • JVM的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现
  • 因此在任何一个确定的时刻,一个处理器核心都只会执行一条线程中的指令
  • 为了切换线程后能恢复到之前正确的执行位置,每条线程都需要独立的程序计数器,各条线程之间计数器互不影响,独立存储

我们就把类似这类区域称之为"线程私有"的内存。

3. 本地方法栈(线程私有)

本地方法栈和虚拟机栈类似,只不过 Java 虚拟机栈是给 JVM 使用的,而本地方法栈是给本地方法使用的。
(内部是 C++ 代码, 存储的是 native 方法之间的调用关系)

4. 程序计数器(线程私有)

程序计数器的作用:用来记录当前线程执行的行号的。

程序计数器是一块比较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。

  • 如果当前线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;
  • 如果正在执行的是一个Native方法,这个计数器值为空。

程序计数器内存区域是唯一一个在JVM规范中没有规定任何OOM (Out Of Memory) 情况的区域!

5. 方法区(线程共享)

方法区的作用:用来存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据的。

在《Java虚拟机规范中》把此区域称之为“方法区”,JDK 8 中叫做元空间(Metaspace)。

运行时常量池:
运行时常量池是方法区的一部分,存放字面量与符号引用。
字面量 : 字符串常量 (JDK 8 移动到堆中) 、final常量、基本数据类型的值。
符号引用 : 类和结构的完全限定名、字段的名称和描述符、方法的名称和描述符。

小结

在这里插入图片描述

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

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

相关文章

Unity:2D游戏设置相机orthographicSize

目录 根据设备分辨率动态设置相机 orthographicSize 根据设备分辨率动态设置相机 orthographicSize 2d游戏里面相机的Orthan.size确定的是高度,宽度是按照屏幕的宽高比计算出来的cameraWidthSize camera.Orthographic.size*(Screen.Width/Screen.height)我在游戏…

内网穿透--cpolar

工具介绍 cpolar是一种安全的内网穿透云服务,它将内网下的本地服务器通过安全隧道暴露至公网。使得公网用户可以正常访问内网服务。 下载位置 cpolar官网:cpolar - 安全的内网穿透工具 创建隧道映射 cpolar安装成功后,双击打开cpolar web u…

一文教你如何配置路由策略

【微|信|公|众|号:厦门微思网络】 微思-课程介绍 组网需求 如图1所示,某公司的部门A和部门B相距较远,Router_1和Router_6分别作为这两个部门的出口设备,AS 100内部使用OSPF作为IGP。现要求: 通过部署BGP,使…

实验三--贪心算法的设计与分析

某不知名学校算法课第三次实验报告 题目来自力扣 这次实验是贪心算法 贪心的思维很跳跃,每道题也没有固定的模板的思考方向 跳跃游戏 题目描述: 给定一个非负整数数组,你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳…

PHP 电竞网站系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 电竞网站系统是一套完善的web设计系统,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 php电竞网站系统 代码 https://download.csdn.net/download/qq_41221322/88377255 论文 h…

基于linux的进程信号知识

1.前言 生活当中我们无时不刻都在接触外界给予我们各种各样的信号,比如穿越马路时看到红灯就得停下来,在比如听到手机铃声就得接电话,那么生活中如果很多重要的信号同时发生了,你会先做哪个事情?换句化说你会如何处理…

Failed to load the JNI shared library “D:\...\jvm.dll

1.解决办法: 64-bit Eclipse requires a 64-bit JVM, and 32-bit Eclipse requires 32-bit JVM--you can not mix-and-match between 32-bit and 64-bit. 2.问题: 下载了Eclipse4.16,openjdk8,双击安装Eclipse无法启动&#x…

侯捷 C++ STL标准库和泛型编程 —— 3 容器(序列式容器)

3 容器 3.1 容器结构分类 分类:序列式容器 Sequence Container,关联式容器 Associative Container 序列式容器:按照放入的次序进行排列 Array 数组,固定大小Vector 向量,会自动扩充大小Deque 双向队列,双…

每日一题 1333. 餐厅过滤器(中等)

感觉应该算是简单题 思路: 按照他提出的要求进行筛选即可学习了 sort 函数中几个参数的用法, keylambda c:(c[1], c[0]) 的形式可以令在排序中当c[1]相等时按照c[0]大小进行排序,reverseTrue 实现降序排列 class Solution:def filterResta…

基于微信小程序的美食推荐系统设计与实现(源码+lw+部署文档+讲解等)

前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻…

element日历插件获取显示的第一天和最后一天

和重置日期内容显示 需求是要传入当前显示的第一天和最后一天来获取范围,再判断某个日期是否有内容标记 已知星期排版是固定的,第一天是星期天,最后一天是星期六。通过当月1号和最后一天再往前推算需要展示上个月几天,和下个月几…

Vue3 + TS 自动检测线上环境 —— 版本热更新提醒

🐔 前期回顾 编写 loading、加密解密 发布NPM依赖包,并实施落地使用_彩色之外的博客-CSDN博客 目录 🌍 问题产生 🤖 性能效率 🪂 新建 autoUpdate.ts 🎋 在App.vue使用 🌍 问题产生 当用…

秋招搞个保底offer再说,我换赛道了。

作者:阿秀 InterviewGuide大厂面试真题网站:https://top.interviewguide.cn 这是阿秀的第「312」篇原创 小伙伴们大家好,我是阿秀。 转测开这个话题已经聊过很多次了,以前也分享过不少测开相关的面经: 后端太卷&#x…

Mac电脑视频处理工具 Topaz Video AI for mac

Topaz Video AI是一款强大而易用的视频处理软件,通过人工智能技术提供高质量的视频增强和编辑功能。它可以帮助用户改善视频的质量、修复缺陷、优化图像,并提供丰富的编辑选项,以满足个性化的视频处理需求。无论是专业摄影师、视频编辑人员&a…

vue+Vant,关闭Popup弹框,遮罩层并没有消失

遇到问题&#xff1a; 点击Popup弹框关闭按钮&#xff0c;弹框的遮罩不能正常关闭&#xff0c;如下图。经研究&#xff0c;排除了popup属性问题&#xff0c;最后只能删除代码排除法。 <!--弹框&#xff1a;选号--><van-popupv-model"showNumber"closeablero…

JS 内存泄漏与垃圾回收机制

一、什么是内存泄漏? 内存泄漏&#xff08;Memory Leak&#xff09;是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放&#xff0c;造成系统内存的浪费&#xff0c;导致程序运行速度减慢甚至系统崩溃等严重后果。通俗点就是指由于疏忽或者错误造成程序未能释放已…

指定名校牛导|肿瘤科医生赴哈佛大学麻省总医院访学进修

世界排名第一的哈佛大学&#xff0c;美国排名第一的研究型医院-麻省总医院&#xff0c;AIMBE fellow头衔的导师&#xff0c;这些条件均符合T医生要求的名校牛导标准。 T医生背景&#xff1a; 申请类型&#xff1a; 单位公派访问学者 工作背景&#xff1a; 三甲医院医生 教育…

在openwrt dnsmasq DHCP中为客户端分配不同的网关和DNS | 旁路由 禁止上网

环境&#xff1a;openwrt dnsmasq PS4/Switch 问题&#xff1a;为路由器下的设备分配不同的网关和DNS&#xff0c;禁止局域网设备上网 解决办法&#xff1a;修改dnsmasq配置文件 背景&#xff1a;Openwrt 的DHCP服务是使用dnsmasq实现的&#xff0c;他可以给内网的客户端设备…

如何减少爬虫产生的网络负载:爬取间隔和缓存控制策略

在进行Python爬虫开发时&#xff0c;我们需要注意控制爬取频率&#xff0c;以减少对目标网站的网络负载。本文将为您分享两种关键策略&#xff1a;爬取间隔和缓存控制。通过合理设置爬取间隔和使用缓存&#xff0c;您可以有效减少网络负载&#xff0c;同时保证数据的实时性和准…

Spring5应用之AOP动态代理开发

作者简介&#xff1a;☕️大家好&#xff0c;我是Aomsir&#xff0c;一个爱折腾的开发者&#xff01; 个人主页&#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏&#xff1a;Spring5应用专栏_Aomsir的博客-CSDN博客 文章目录 前言何为动态代理…