mio-233 2024-02-03 11:17 采纳率: 27.8%
浏览 2
已结题

JVM内存结构问题,堆和方法区

在学习JVM知识时候遇到一个问题,就是方法区和堆区存储什么

方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,方法编译出的字节码也是保存在这个区域。

也有说静态变量存储在堆区?所以到底存在哪里

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-02-03 11:19
    关注

    引自免费微信小程序:皆我百晓生

    在Java虚拟机(JVM)的内存模型中,方法区和堆是两个不同的内存区域,各自存储不同类型的程序数据:

    方法区

    方法区主要用于存储类级别的结构信息以及运行时常量池数据。具体包含以下内容:

    1. 已加载的类信息:包括类的全名、直接超类的名称、接口列表、字段描述符与方法描述符等。
    2. 常量池:编译期生成的各种字面量(如字符串常量)和符号引用(如类、接口、字段和方法的引用)。
    3. 类变量(静态变量):所有对该类的静态变量的定义,这些变量在类加载完成后分配空间,并在整个应用程序范围内共享,不会随着类实例的创建和销毁而改变其生命周期。

    注意:在Java 8及之前版本,永久代(PermGen)通常作为方法区的实现;而在Java 8之后,HotSpot JVM用元空间(Metaspace)取代了永久代来实现方法区,但存储的数据类型不变。

    堆内存则是Java对象的主要存储区域,它主要负责存储对象实例,也包括:

    1. 实例变量:非静态变量,每个对象实例都有自己的实例变量副本。
    2. 对象数组:比如声明为Object[] array = new Object[10];时,数组本身是在堆上分配的。
    3. 静态变量(补充说明):虽然静态变量的定义存在于方法区,但其实际存储空间也是在堆中分配的。这意味着对静态变量的所有访问实际上都会通过方法区中的符号引用找到堆中的存储位置进行操作。

    总结一下,静态变量的“定义”或者说元数据存放在方法区,而其对应的值或引用则存放在堆中。当一个类被加载后,静态变量会在堆中初始化并分配内存空间。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月11日
  • 已采纳回答 2月3日
  • 创建了问题 2月3日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?