当前位置: 首页 > news >正文

JVM的内存区域划分

JVM即Java虚拟机,是Java实现跨平台交互能力的核心,Java编译后的.class文件,就是通过虚拟机和操作系统进行交互的;

常见的虚拟机有:JVM、VMwave、Virtual Box,目前最主流使用的JVM是HotSpot VM;

JVM 的内存区域划分,主要分为这几个部分:本地方法栈,程序计数器,虚拟机栈,堆区,元数据区;

(此处的 "栈" 与数据结构的栈是不一样的概念,此处的栈,指的是 JVM 中的一个特定存储空间;)

一个 JVM 对应一个 Java进程,这也是为了进程之间保持一定的隔离性;

本地方法栈:native 表示 JVM 内部的 C++ 代码,就是给调用 JVM 内部方法准备的栈空间,存储的是 native 方法之间的调用关系,是线程私有的,即一个线程对应一个本地方法栈;

程序计数器:记录当前的线程执行到了哪一个指令,每一个线程会有对应的一个程序计数器; 

虚拟机栈:此处就是个 Java程序代码 使用的栈,存储的是代码方法之间的调用关系;在栈空间内,是包含有很多个元素的,每个元素表示一个方法,也称为一个栈帧,且每个栈帧会包含方法的入口地址,方法的参数,方法的返回地址和局部变量等;同时这一块空间内,并不是只包含一个虚拟机栈,而是包含多个的,每一个线程对应一个虚拟机栈,此处可以通过 jconsole 来对某一个线程进行查看,查看线程里的栈调用关系;

栈上的内存空间是跟着方法走的,也就是调用一个方法,就会创建一个栈帧,方法执行结束了,栈帧也就销毁了;

虽说一个线程对应一个虚拟机栈,但实际上一个线程栈上的内容,比如局部变量,另外一个线程也是可以进行使用的;

堆:堆是 JVM 中空间最大的区域。new 出来的对象,都是存放在堆上的,类的成员变量,也是存放在堆上的。与虚拟机栈和程序计数器不同的是,堆是一个进程对应一个,即多个线程共用的;

元数据区(方法区)(永久代): 这一块空间主要存储常量池,静态成员变量和类对象,一个进程对应一个元数据区,是多个线程共用的;

对于 public final 修饰的话,就需要去分析是否被优化成字面值常量,如果是的话,那么就在元数据区的常量池里;如果没被优化,且没加 static 就是作为成员变量在堆上,加了 static的话就是作为静态变量,也是在元数据区里;

类对象:类对象其实可以理解为对应的 .class,里面主要存的就是这个类的名称,父类,方法和属性这些东西,一个类只有一个类对象,JVM在加载类的时候,就会创建一个这个类的class示例;  

类的初始化和实例化:此处与Spring的Bean对象是相反的,先进行初始化,在进行实例化;

1. 在使用一个对象时,JVM会先检查当前的类是否完成初始化(在元数据区中给静态数据分配内存,并给类的属性值赋予初始值),如果还没有,JVM就需要调用类的构造器来完成初始化;

2. 完成初始化之后,开始进行实例化,在堆中开辟内存空间来存储一些非静态数据;

所以说,根据上述 JVM 内存区域划分的讲解,我们可以得知:

  • 局部变量是存放在虚拟机栈上的;
  • 普通成员变量是存放在堆上的;
  • 静态成员变量是存放在元数据区上的;
http://www.lryc.cn/news/310074.html

相关文章:

  • YOLOv9有效改进|使用动态蛇形卷积Dynamic Snake Convolution
  • 设计模式学习笔记 - 设计原则 - 1.单一职责原则
  • 飞天使-学以致用-devops知识点4-SpringBoot项目CICD实现(实验失败,了解大概流程)
  • 使用HTML5画布(Canvas)模拟图层(Layers)效果
  • 违背祖训,微软骚操作强制用户更新至 Win 11 23H2
  • MISRA C++ 2023指南:您需要了解的一切
  • Vue:【亲测可用】父组件数组包对象,传给子组件对象,子组件修改属性(字段)后,父组件没有更新
  • hbase学习十:客户端实现与Meta表解析
  • 《OpenScene: 3D Scene Understanding with Open Vocabularies》阅读笔记1
  • 数据结构 - Trie树(字符串统计、最大异或对)
  • 2. vue 工程创建
  • 2024绿色能源、城市规划与环境国际会议(ICGESCE 2024)
  • 0门槛电子画册制作
  • C语言----冒泡排序进阶
  • 【机器学习】实验5,AAAI 会议论文聚类分析
  • 安卓虚拟机ART和Dalvik
  • OPENWRT本地局域网模拟域名多IP
  • 今日学习总结2024.3.2
  • Java虚拟机(JVM)从入门到实战【上】
  • SaaS 电商设计 (九) 动态化且易扩展的实现购物车底部弹层(附:一套普适的线上功能切量的发布方案)
  • 数据结构——lesson5栈和队列详解
  • 使用rsync同步服务器和客户端的文件夹
  • 计算机网络|Socket
  • Python 使用 MyHDL库 实现FPGA板卡仿真验证
  • 解决SpringBoot集成WebSocket打包失败问题
  • i-vista五星测试标准
  • 初识Maven
  • 16 Educational Codeforces Round 142 (Rated for Div. 2)C. Min Max Sort(递归、思维、dp)
  • Mongodb安装配置
  • Linux常用操作命令大全