JVM 运行时内存结构简介

news2024/11/27 12:44:17

JVM 运行时内存结构简介

  • 一、前言
  • 二、JVM 运行时内存结构
    • 2.1 线程隔离数据区:
    • 2.2 线程共享数据区:
  • 三、JVM 内存区域划分
    • 1. 程序计数器(PC)
    • 2. 虚拟机栈
    • 3. 本地方法栈
    • 4. Java 堆
    • 5. 方法区
    • 6. 运行时常量池
  • 附录

一、前言

JVM(Java 虚拟机)的运行时内存结构在 Java 程序的运行中起着关键支撑作用。而在 Android 系统中,虽然没有直接使用传统的 JVM,但 Android 运行时环境(AndroidRuntime)借鉴了许多 JVM 的设计理念和机制。了解 JVM 的运行时内存结构,不仅有助于 Java 开发者更好地理解 Java 程序的运行机制,对于 Android 开发者来说,也能更深入地理解 Android 系统中应用程序的运行原理,优化程序性能,以及排查内存相关的问题。

二、JVM 运行时内存结构

在这里插入图片描述

2.1 线程隔离数据区:

  • 程序计数器:记录正在执行的虚拟机字节码的地址;
  • 虚拟机栈:方法执行的内存区,每个方法执行时会在虚拟机栈中创建栈帧;
  • 本地方法栈:虚拟机的Native方法执行的内存区;

2.2 线程共享数据区:

  • Java堆:对象分配内存的区域;
  • 方法区:存放类信息、常量、静态变量、编译器编译后的代码等数据;
  • 常量池:存放编译器生成的各种字面量和符号引用,是方法区的一部分。

三、JVM 内存区域划分

1. 程序计数器(PC)

  • 程序计数器是当前线程所执行的字节码行号指示器。每个线程都拥有自己独立的程序计数器,属于私有内存空间,在整个内存中占比较小。
  • 当线程执行 Java 方法时,PC 计数器记录正在执行的虚拟机字节码地址;而当线程执行 Native 方法时,PC 计数器为空。

2. 虚拟机栈

  • 虚拟机栈的生命周期与线程相同,是 Java 方法执行的内存模型。每个方法执行时都会创建一个栈帧,方法的执行过程对应着虚拟机栈的入栈到出栈过程。
  • 栈帧是支持虚拟机进行方法执行的数据结构,也是虚拟机栈的栈元素。栈帧包括局部变量表(容量以 slot 为最小单位,用于存储一组变量,其大小在编译期确定)、操作栈(操作栈元素的数据类型需与字节码指令序列严格匹配,大小同样在编译期确定)、动态连接(指向运行时常量池中该栈帧所属方法的引用,用于动态连接)、方法返回地址(正常退出时,执行引擎遇到方法返回的字节码,将返回值传递给调用者;异常退出时,若遇到未被捕捉的 Exception,则不会有任何返回值)以及可能的额外附加信息(由具体虚拟机实现,虚拟机规范未明确规定)。
  • Java 虚拟机规范规定该区域可能出现两种异常:当线程请求栈深度超出虚拟机栈所允许的深度时抛出 StackOverFlowError;当 Java 虚拟机动态扩展到无法申请足够内存时抛出 OutOfMemoryError。

3. 本地方法栈

  • 本地方法栈为虚拟机使用的 Native 方法提供内存空间,与为 Java 方法提供内存空间的虚拟机栈类似。有些虚拟机的实现将本地方法栈和虚拟机栈合二为一,如 Sun HotSpot 虚拟机。
  • 该区域可能抛出 StackOverFlowError 和 OutOfMemoryError 异常。

4. Java 堆

  • Java 堆是 Java 虚拟机管理的最大一块内存,也是垃圾回收的主要区域,存放着几乎所有的对象实例和数组数据。由于 JIT 编译器的栈上分配、标量替换等优化技术,部分对象实例数据可能不在 Java 堆中,而是在栈内存。
  • 从内存回收角度,Java 堆分为新生代和老年代,以更快地回收内存;从内存分配角度,可划分出线程私有的分配缓冲区(TLAB),以便更快地分配内存。对象实例在堆上的结构包括对象头和实例数据,可能还有填充数据以保证对象起始地址是 8 字节的整数倍。
  • Java 虚拟机规范规定该区域可抛出 OutOfMemoryError 异常。

5. 方法区

  • 方法区主要存储已被虚拟机加载的类信息、常量、静态变量、编译器编译后的代码等数据。垃圾回收在该区域出现较少。
  • 该区域可能抛出 OutOfMemoryError 异常。

6. 运行时常量池

运行时常量池是方法区的一部分,用于存放编译器生成的各种字面量和符号引用。除了编译期产生的 Class 文件的常量池外,还可以在运行期间将新的常量加入常量池,如 String 类的 intern()方法。

  • 字面量:与Java语言层面的常量概念相近,包含文本字符串、声明为final的常量值等。
  • 符号引用:编译语言层面的概念,包括以下3类:
    • 类和接口的全限定名
    • 字段的名称和描述符
    • 方法的名称和描述符

该区域不会抛出 OutOfMemoryError 异常。

附录

Jvm系列1—运行时内存结构
深入研究Android内存优化(上)- 至少解决 APP 中 90% 的内存异常问题

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

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

相关文章

LLM RAG检索生成的深度解析:理解其工作原理与应用

前言 2024年随着大模型进一步增强升级,越来越多的大模型应用落地,经过初期的探索和研究,目前业界逐渐收敛聚聚于两个主要的应用方向:RAG和Agents。今天我们就来先聊聊这个RAG~ 一.RAG基本介绍 RAG:全称R…

Linux下enable bbr

最近开通一台VPS,操作系统选择了Ubuntu 22.04,需要启用bbr功能。 BBR 是 Bottleneck Bandwidth(瓶颈带宽)的缩写,而 RTT 是一种拥塞控制系统。您可以在 Linux 桌面上启用 TCP BBR,以改善整体网上冲浪体验。…

IO模型-----聊天室

运行1个服务器和2个客户端 实现效果: 服务器和2个客户端互相聊天,服务器和客户端都需要使用select模型去实现 服务器要监视2个客户端是否连接,2个客户端是否发来消息以及服务器自己的标准输入流 客户端要监视服务器是否发来消息以及客户端自己…

Elasticsearch 安装 windows

1,下载Elasticsearch Download Elasticsearch | Elastic 2,下载的压缩包解压后 3,进入bin文件夹,双击 elasticsearch.bat 启动 4,修改配置 启动成功后先关掉了ctrlc关掉 进入config文件夹,打开文件 elasticsearch.ym…

力扣 1425带限制的子序列和

这是一道 动态规划加单调队列的题,重点加强单调队列知识的学习 回归本题,这个题中,动态规划的部分略去,状态转移方程可求 单调队列部分 1维护队头 if(i-sta.front() k) sta.pop_front(); 2维护队尾 while(!sta.empty() &…

企业级web应用服务器tomcat

目录 一、Web技术 1.1 HTTP协议和B/S 结构 1.2 前端三大核心技术 1.2.1 HTML 1.2.2 CSS(Cascading Style Sheets)层叠样式表 1.2.3 JavaScript 二、tomcat的功能介绍 2.1 安装 tomcat 环境准备 2.1.1 安装java环境 2.1.2 安装并启动tomcat …

C++:模板 II(非类型模板参数,特化,分离编译)

目录 非类型模板参数 模板的特化 函数模板特化 类模板特化 全特化 偏特化 引用特化 指针特化 模板分离编译 非类型模板参数 什么是非类型模板参数? 顾名思义,它的类型形参并不是一个类型,就是用一个常量来作为类模板或函数模板的…

(软件测试)基础2

1.等价类划分法 步骤: 2.编写数据用例 例题:参考基础1中的手机号实例 2.边界值分析法

p8 Run的流程和Docker原理

docker run的运行原理图 docker是怎么工作的? docker是一个cs的一个结构的系统docker的守护进程运行在宿主机上面通过socket进行访问 其实就是看下面的这个图,通过客户端的命令来操作docker的守护进程然后启动一些容器,默认容器是不启动的 …

凡图公益行:凡图家庭教育以行动筑梦,点亮孩子心中的光芒

在教育的路上,每一步都承载着未来的希望,凡图(山东)教育科技集团有限公司一直致力于为每一个孩子及家庭提供最优质的心理咨询服务。 在这样的背景下,凡图家庭教育以独特的使命感和责任感,成为了众多家庭信赖的伙伴。 也因此成为…

【 打印菱形】打印菱形

打印菱形 C语言实现&#xff0c;具体代码&#xff1a; #include<stdio.h>int main(){int i,j,k;// 上半部分for(i0;i<3;i){for(j0;j<2-i;j)printf(" ");for(k0;k<2*i;k)printf("*");printf("\n");}// 下半部分for(i0;i<2;i)…

文件上传真hard

一、SpringMVC实现文件上传 1.1.项目结构 1.1.2 控制器方法 RequestMapping("/upload1.do")public ModelAndView upload1(RequestParam("file1") MultipartFile f1) throws IOException {//获取文件名称String originalFilename f1.getOriginalFilename(…

数据库之Mybatis映射文件、动态SQL

目录 1.XML映射文件 2.动态SQL 1.XML映射文件 之前我们执行sql语句是通过注解的方式&#xff0c;还有另外一种方式是通过XML配置文件执行sql语句&#xff0c;这份文件在Mybatis中也称为XML映射文件。 XML配置文件的规范&#xff1a;只有这三条规范都正确的情况下&#xff0…

基于SSM的二手车交易管理系统的设计与实现 (含源码+sql+视频导入教程+论文)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的二手车交易管理系统拥有两种角色&#xff1a;管理员和用户 管理员&#xff1a;二手车信息管理、类型管理、定金支付管理、预约到店管理、二手车评估管理、论坛管理、系统管理、…

数据库Mybatis基础操作

目录 基础操作 删除 预编译SQL 增、改、查 自动封装 基础操作 环境准备 删除 根据主键动态删除数据&#xff1a;使用了mybatis中的参数占位符#{ }&#xff0c;里面是传进去的参数。 单元测试&#xff1a; 另外&#xff0c;这个方法是有返回值的&#xff0c;返回这次操作…

stack/queue容器

stack容器 std::stack 是 C 标准库中定义的容器适配器&#xff08;container adaptor&#xff09;&#xff0c;它基于其他底层容器&#xff08;如 std::deque、std::list 或 std::vector&#xff09;实现了后进先出&#xff08;LIFO&#xff09;的数据结构。栈容器没有迭代器&…

JavaScript_10_练习:轮播图

效果图 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>练习&#xff1a;轮播图</title>…

OD C卷 - 查找一个有向网络的头节点和尾节点

查找一个有向网络的头节点和尾节点 &#xff08;200&#xff09; 在一个有向图中&#xff0c;有向边用两个整数表示&#xff0c;第一个整数表示起始节点&#xff0c;第二个整数表示终止节点&#xff1b;图中只有一个头节点&#xff0c;一个或者多个尾节点&#xff1b;图可能存…

Linux系统信息排查

目录 介绍步骤 介绍 1、熟悉查看CPU信息、操作系统信息、用户信息、特殊权限账户、启动项和任务计划的排查命令 2、在进行受害主机排查时&#xff0c;首先要对主机系统进行基本排查&#xff0c;方便对受害主机有一个初步的了解。 3、利用lscpu和uname -a查看系统硬件软件基本…

JavaScript(28)——正则表达式

定义正则表达式语法&#xff1a; const 变量名 /表达式/ 判断是否有符合规则的字符串&#xff1a; test()方法 用来查看正则表达式与指定的字符串是否匹配 语法&#xff1a; regObj.test(被检测的字符串) //返回布尔值 regObj.exec(字符串) //返回的是数组 <script>…