【JVM】JVM的内存结构是怎样的?

JVM的内存结构是Java程序运行时内存管理的核心,不同区域有明确的职责。

一、整体划分

包括两大部分,分为线程私有区域(随线程创建/销毁,无需垃圾回收)和线程共享区域(所有线程共用,需要垃圾回收管理)。

  • 线程私有区域:程序计数器、虚拟机栈、本地方法栈。 支撑线程独立执行(如方法调用、指令跟踪)
  • 线程共享区域:堆、方法区(元空间)。 存储对象实例、类信息等全局数据,是内存管理的核心区域

二、各区域详解:

1.程序计数器(Program Counter Register):

  • 线程私有: 每个线程都有独立的程序计数器,互不干扰。
  • 作用:记录当当前线程 “下一条要执行的 JVM 字节码指令的地址”,为线程提供执行路标,确保线程在切换(如CPU调度被中断)后能够恢复到正确的执行位置。

若执行的是 Java 方法,计数器存储下一条要执行的字节码指令的地址;
若执行的是 Native 方法(本地方法,如 C/C++ 实现),计数器值为undefined。 因为Native方法的执行由操作系统控制,而非JVM,无需JVM记录指令地址。

特点:
1.内存空间极小,几乎不占用资源。
2.是JVM中唯一不会发生OutOfMemoryError(OOM) 的区域
3.本质是线程执行的路标,确保线程切换(如CPU调度)后能恢复到正确执行的位置。

2.虚拟机栈:

  • 线程私有:每个线程创建时,会分配一个虚拟机栈生命周期与线程一致。
  • 作用:记录方法调用的执行状态,每个方法调用时,会创建一个栈帧,栈帧入栈;方法执行完毕,栈帧出栈。
  • 栈帧包含的内容:
    1.局部变量表: 存储方法内的局部变量(如基本类型、对象引用),容量在编译期确定;
    2.操作数栈:方法执行时的临时数据存储区(如计算a+b时,先将a和b入栈,再执行加法);
    3.动态链接:指向方法区中该方法的符号引用(运行时转换为直接引用)
    4.返回地址:方法执行完后,回到调用者的位置(如main方法调用func(),func()执行完需回到main的下一行)。

可能的异常:
1.StackOverflowError:线程请求的栈深度超过虚拟机允许的最大深度(如递归调用无终止条件);
2.OutOfMemoryError:虚拟机栈可动态扩展时,扩展失败(如创建过多线程,栈内存总需求超过系统内存)。

3.本地方法栈:

  • 线程私有:与虚拟机栈功能类似,但专门为 Native 方法(非 Java 实现的方法)服务。
  • 特点:
    可能抛出StackOverflowError(栈深度超限)和OutOfMemoryError(内存不足),与虚拟机栈一致。

4.堆:

  • 线程共享:JVM中内存占比最大的区域,几乎所有对象实例(包括数组)都在这里分配内存。
  • 作用存储对象实例,是**垃圾回收(GC)**的主要工作区域。
  • 结构划分:
    堆空间通常按照对象“存活时间”划分为以下区域:
    • 新生代:存放新创建的对象,分为:
      • Eden区(伊甸园):新对象优先分配到这里。
      • Survivor 区(幸存者区):分为 From 和 To 两个大小相等的区域,用于存放 Eden 区回收后存活的对象(每次 GC 后,存活对象在 From 和 To 之间转移,经过多次存活后进入老年代)。
    • 老年代:存放存活时间长的对象(如经过多次年轻代 GC 仍存活的对象)。

特点:
1.堆的大小可通过**-Xms(初始堆大小)和-Xmx(最大堆大小)参数配置(尽可能两者设为一致,避免动态扩展消耗性能);
2.是
OOM 最常见的区域**(如创建对象过多且无法被 GC 回收,堆空间耗尽时抛出java.lang.OutOfMemoryError: Java heap space)。

5.方法区:

  • 线程共享:存储已被 JVM 加载的类信息、常量、静态变量、即时编译器(JIT)编译后的代码等数据。
  • 历史演进
    • JDK 7 及之前:方法区的实现称为 “永久代(PermGen)”,属于堆的一部分,大小固定(易 OOM);
    • JDK 8 及之后:永久代被元空间(Metaspace) 取代,元空间不再使用堆内存,而是直接使用本地内存(Native Memory),大小受系统内存限制(更灵活)。
  • 运行时常量池
    是方法区的一部分,存放编译期生成的符号引用和字面量(如字符串常量"abc")。

三、各区域的协作关系:

Java 程序运行时,内存流转大致如下:
1.类加载器将类信息加载到方法区(元空间)
2.主线程启动,创建虚拟机栈,main方法的栈帧入栈;
3.执行new Object()时,在中创建对象实例,栈帧的局部变量表存储该对象的引用(地址);
4.程序计数器记录当前执行的字节码指令地址,确保线程切换后能继续执行;
5.方法执行完毕,栈帧出栈;对象不再被引用时,由 GC 在堆中回收。

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

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

相关文章

青少年软件编程(python五级)等级考试试卷-客观题(2023年12月)

更多内容和历年真题请查看网站:【试卷中心 -----> 电子学会 ----> 机器人技术 ----> 五级】 网站链接 青少年软件编程历年真题模拟题实时更新 青少年软件编程(python五级)等级考试试卷-客观题(2023年12月&#xff0…

网络编程-创建TCP协议服务器

int socket(int domain, int type, int protocol);头文件&#xff1a; #include <sys/socket.h>#include <netinet/in.h> #include <netinet/ip.h>int skt_tcpfd;int domain;skt_tcpfdsocket(AF_INET,SOCK_STREAM,0);int bind(int sockfd, const struct soc…

ruoyi框架角色分配用户

分配用户&#xff0c;不要将当前正在登录的用户绑定。否则&#xff0c;在加入当前用户之后&#xff0c;取消或者添加其他用户时会被注销当前登录。

Java Stream常见函数与应用案例

1. Java Stream核心概念与基础函数 1.1 Stream API的设计哲学与核心特性 Java Stream API的设计哲学源于函数式编程范式&#xff0c;其核心特性体现在数据处理模式的转变上。与传统集合操作相比&#xff0c;Stream API采用声明式编程风格&#xff0c;支持链式调用&#xff0c;显…

【Canvas与徽章】中国制造金色玻璃光徽章

【成图】【代码】<!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>中国制造金色玻璃光徽章 Draft1</title><style type"tex…

终结系统裸奔:Debian老旧版本安全加固终极指南

核心警示:Debian 8与10已结束官方支持,暴露于0day漏洞风险中。本文提供的加固方案仅为迁移前的临时防护措施,非长久之计。 一、老旧Debian系统的致命隐患 支持状态: Debian 8(Jessie):2018年终止安全更新 Debian 10(Buster):2024年7月结束主流支持 风险清单: 无补…

Ape.Volo项目源码学习(1:源码下载及运行)

Ape.Volo项目是基于 .Net 8 、SqlSugar、Vue2.x、RBAC、前后端分离开箱则用的中后台快速开发框架&#xff0c;其使用Async/Await异步编程&#xff0c;支持CodeFirst模式、RabbitMQ/RedisMQ消息队列、CORS 跨域配置、数据库操作&#xff08;读写分离、多库、分表&#xff09;、支…

2-4.Python 编码基础 - 流程控制(判断语句、循环语句、break 语句与 continue 语句)

一、判断语句 1、if 语句 &#xff08;1&#xff09;基本格式 if 【判断条件】:【满足条件时执行的代码块】&#xff08;2&#xff09;演示 number 10if number > 0:print("这个数是正数")# 输出结果这个数是正数2、if - else 语句 &#xff08;1&#xff09;基本…

大模型自我进化框架SE-Agent:开启软件工程自动化新时代

一、引言&#xff1a;当大模型学会“自我进化” 在软件开发领域&#xff0c;传统模式下人类工程师面对复杂任务时&#xff0c;往往需要经历反复调试、多轮迭代才能产出高质量代码。而随着大语言模型&#xff08;LLM&#xff09;的兴起&#xff0c;一种名为**SE-Agent&#xff…

UE官方文档学习 C++ TAarry 查询(四)多种查询方式

一.IndexofByKey 返回索引通过值&#xff0c;返回来查找键。二IndexOfByPredicate通过定义二元谓词&#xff0c;来判定是否有符合谓词判定的元素。符合条件True的&#xff0c;才返回Index。这里所谓Lamda,函数就是 把函数当作参数输入&#xff0c;里面的参数值传递前加个[]。这…

根据Wireshark捕获数据包时间和长度绘制电脑发射信号波形

下一期&#xff1a; 根据Wireshark捕获数据包时间和长度绘制路由器发送给电脑数据的信号波形-CSDN博客 一、Wireshark采集数据 数据格式&#xff1a; 在我的另一篇博客中详细介绍了怎么导出数据&#xff1a; Wireshark导出数据包时间和长度-CSDN博客 通过MATLAB加载数据&a…

Suno API 接入指南:快速上手与高效集成

随着 AI 技术的发展&#xff0c;音乐生成已经逐渐成为开发者和创作者探索的新方向。Suno API 提供了一套简洁的接口&#xff0c;让我们能够通过代码快速生成音乐、歌词&#xff0c;甚至旋律。本文将带你从零开始&#xff0c;完成 Suno API 的接入与调用&#xff0c;并分享一些高…

React Hooks原理深潜:从「黑魔法」到「可观测」的蜕变之旅

文章目录【技术栈深潜计划】React Hooks原理深潜&#xff1a;从「黑魔法」到「可观测」的蜕变之旅一、引言&#xff1a;为什么我们需要“深潜”Hooks&#xff1f;二、基石&#xff1a;没有JavaScript闭包&#xff0c;就没有Hooks2.1 闭包的精简回顾2.2 Hooks与闭包的关联三、核…

MySql知识梳理之DDL语句

例子&#xff1a;为emp表增加一个新的字段”昵称”为nickname&#xff0c;类型为varchar(20)alter table emp add nickname varchar(20) comment 昵称;例子&#xff1a;将emp表的nickname字段修改为username&#xff0c;类型为varchar(30)ALTER TABLE emp CHANGE nickname us…

Games 101 第四讲 Transformation Cont(视图变换和投影变换)

三维变换 三种变换 下面分别是放缩&#xff0c;旋转&#xff0c;平移在旋转当中&#xff0c;绕着y轴旋转矩阵的顺序不一样&#xff0c;因为绕着y轴转在右手坐标系中 &#xff0c;z是第一轴&#xff0c;x是第二轴&#xff0c;而负号会加在第一轴上&#xff0c;因此负号在下面。 …

rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(一)基本代码

Cargo.toml [dependencies] eframe "0.32.1" egui "0.32.1"‌启动函数一&#xff1a;run_simple_native 简化版入口函数&#xff0c;适用于快速原型开发仅需提供应用标题和 UI 渲染闭包即可运行典型使用场景&#xff1a;单面板工具、简单演示程序 // 导入…

离线优先与冲突解决:ABP vNext + PWA 的边缘同步

&#x1f6f0;️ 离线优先与冲突解决&#xff1a;ABP vNext PWA 的边缘同步 &#x1f4da; 目录&#x1f6f0;️ 离线优先与冲突解决&#xff1a;ABP vNext PWA 的边缘同步0. 环境 &#x1f680;1. 场景与目标&#xff08;痛点→指标&#xff09;&#x1f3af;2. 架构与时序 …

Slither 审计自己写的智能合约

作为区块链开发者&#xff0c;写完合约之后最重要的一步就是 检查代码有没有漏洞。一旦部署到链上出了问题&#xff0c;不仅修复麻烦&#xff0c;还可能直接造成资金损失。 Slither 是一款非常好用的自动化审计工具&#xff0c;可以帮你快速找出大部分常见风险。这篇文章专门讲…

Python万里长征6(非教程)pandas筛选数据三基础、三核心、三高级

文章目录一、背景二、布尔索引2.1 总结三、进阶核心用法&#xff08;实用高效&#xff09;3.1 多条件组合3.2 字符串表达式&#xff08;类似SQL&#xff09;3.3 针对字符串的正则匹配四、高级方法&#xff08;依赖基础&#xff09;4.1 函数应用&#xff08;如apply()或lambda&a…

阿里云上部署nuxt开发的项目(SSG和SSR混合渲染)

1.项目说明及配置 // nuxt.config.ts export default defineNuxtConfig({// ... 其他配置// Nitro 引擎让你可以非常精细地为每个页面定义渲染策略nitro: {// 预设取决于你的部署平台,例如 vercel, netlify, static 等,或者node-serverpreset: vercel, // 这里以 Vercel 为例…