Java之JVM方法区、永久代、元空间、常量池简介说明

2023-10-27

转自:

Java之JVM方法区、永久代、元空间、常量池简介说明

下文笔者讲述jvm中方法区,永久代,元空间,常量池的简介说明,如下所示

JVM内存模型简介

 jvm堆是所有线程共享的
  主要用来存储对象
  堆:
   年轻代和老年代两块区域
  使用NewRatio参数来设定比例
  对于年轻代,一个Eden区和两个Suvivor区,使用参数SuvivorRatio来设定大小;

Java虚拟机栈/本地方法栈:
 线程私有,主要存放局部变量表,操作数栈,动态链接和方法出口等
程序计数器——同样是线程私有,记录当前线程的行号指示器,为线程的切换提供保障 
方法区——线程共享,主要存储类信息,常量池,静态变量,JIT编译后的代码等数据
 
方法区理论上来说是堆的逻辑组成部分:
  运行时常量池——是方法区的一部分
  用于存放编译期生成的各种字面量和符号引用

永久代和方法区的关系

 
永久代是HotSpot的概念
 方法区是Java虚拟机规范中的定义,
 是一种规范而永久代是一种实现
 一个是标准一个是实现
 其他的虚拟机实现并没有永久带这一说法
在1.7之前在(JDK1.2 ~ JDK6)的实现中
HotSpot使用永久代实现方法区
HotSpot使用 GC分代来实现方法区内存回收

可以使用如下参数来调节方法区的大小:
  -XX:PermSize
    方法区初始大小
  -XX:MaxPermSize
    方法区最大大小
   
   超过这个值将会抛出OutOfMemoryError异常
     java.lang.OutOfMemoryError: PermGen

元空间

对于Java8
  HotSpots取消永久代
方法区是一个规范,规范没变
 它就一直在。那么取代永久代的就是元空间
 
 元空间和永久代区别:
   存储位置不同:
     永久代物理是是堆的一部分
     和新生代,老年代地址是连续的
     元空间属于本地内存
 
 存储内容不同:
   元空间存储类的元信息
  静态变量和常量池等并入堆中
   相当于永久代的数据被分到了堆和元空间中。

Class文件常量池

 Class 文件常量池指的是编译生成的 class 字节码文件
   其结构中有一项是常量池(Constant Pool Table)
    用于存放编译期生成的各种字面量和符号引用
   这部分内容将在类加载后进入方法区的运行时常量池中存放 

这里的字面量是指字符串字面量和声明为 final的(基本数据类型)常量值
  这些字符串字面量除了类中所有双引号括起来的字符串(包括方法体内的)
   还包括所有用到的类名、方法的名字和这些类与方法的字符串描述、字段(成员变量)的名称和描述符
   声明为final的常量值指的是成员变量,不包含本地变量,本地变量是属于方法的
这些都在常量池的 UTF-8 表中(逻辑上的划分);

符号引用:
  就是指指向 UTF-8 表中向这些字面量的引用
  包括类和接口的全限定名(包括包路径的完整名)
   字段的名称和描述符、方法的名称和描述符
   只不过是以一组符号来描述所引用的目标,和内存并无关
   所以称为符号引用,直接指向内存中某一地址的引用称为直接引用;

运行时常量池

运行时常量池是方法区的一部分
   是一块内存区域
Class 文件常量池:
   将在类加载后进入方法区的运行时常量池中存放
 一个类加载到 JVM 中后对应一个运行时常量池
  运行时常量池相对于 Class 文件常量池来说具备动态性
  Class 文件常量只是一个静态存储结构
  里面的引用都是符号引用
 而运行时常量池可以在运行期间将符号引用解析为直接引用
 可以说运行时常量池就是用来索引和查找字段和方法名称和描述符的
 给定任意一个方法或字段的索引
 通过这个索引最终可得到该方法或字段所属的类型信息和名称及描述符信息
 这涉及到方法的调用和字段获取 

字符串常量池

字符串常量池是全局,jvm只有一份
因此也称为全局字符串常量池
 运行时常量池中的字符串字面量若是成员
 则在类的加载初始化阶段就使用到了字符串常量池

若是本地,则在使用到的时候(执行此代码时)才会使用到字符串常量池
其实,“使用常量池”对应的字节码是一个 ldc 指令
在给 String 类型的引用赋值的时候会先执行这个指令
看常量池中是否存在这个字符串对象的引用
若有就直接返回这个引用
若没有,就在堆里创建这个字符串对象并在字符串常量池中记录下这个引用(jdk1.7)

String 类的 intern() 方法还可在运行期间把字符串放到字符串常量池中
JVM 中除了字符串常量池
  8种基本数据类型中除了两种浮点类型剩余的6种基本数据类型的包装类,都使用了缓冲池技术
 但Byte、Short、Integer、Long、Character 这5种整型的包装类也只是在对应值在 [-128,127] 时才会使用缓冲池
  超出此范围仍然会去创建新的对象 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java之JVM方法区、永久代、元空间、常量池简介说明 的相关文章

  • 如果列名不同,则一对多休眠连接

    我有三个具有以下结构的表 合同 gt Contract id 主要 customer company id Vendor company id 公司 gt Company id 主要 创建日期 创建者 Company Timeline gt
  • 如何使用 Maven Failsafe 插件运行 JUnit 5 集成测试?

    当我运行命令时 Maven Failsafe 插件找不到我的 JUnit 5 集成测试mvn clean failsafe integration test 尽管它可以找到文件 我有junit jupiter api and junit j
  • 单元测试组合服务方法

    我正在为一个类编写 junit 单元测试 该类使用以下方法实现公开的接口 public Set
  • 如何提取文件 jre-9/lib/modules?

    In JRE 9 lib目录 至少在 Windows 上 有一个名为modules其大小约为107 MB 是否可以提取该文件或在其中列出 java 模块 我可以看到一个名为jmod可以在jdk 9 bin jmod exe 但那是为了阅读
  • 使用 JSch 分别为各个提示提供输入

    问题是 SSH 连接需要在常规登录后提供另一个用户 ID 和密码信息 我正在使用 JSch 连接到远程服务器 它接受以下形式的输入InputStream 和这个InputStream只能通过一次 由于会话是交互式的 这会导致问题 我尝试将输
  • Android WebView文件上传

    我正在开发一个 Android 应用程序 基本上它是一个WebView和一个进度条 Facebook 的移动网站 m facebook com 已加载到WebView 当我单击 选择文件 按钮上传图像时 没有任何反应 我已经尝试了所有的解决
  • Android volley使用RequestFuture.get()时出现超时异常

    在我的片段中 我尝试使用 TMDB 的开放电影数据库来获取有关 正在播放 电影的详细信息 如果我使用 RequestFuture get time TimeUnit 方法来执行此齐射请求 我总是会收到超时错误 如果我在 Safari 中手动
  • java.lang.Object的hashCode具体使用的算法是什么

    中使用的算法是什么JVM实施java lang Object的隐含的hashCode 方法 OpenJDK or Oracle JDK答案中首选 它依赖于实现 并且在很大程度上 该算法是entirely取决于实施 只要它是一致的 但是 根据
  • Java 中的 ExecuteUpdate sql 语句不起作用

    我正在学习如何将 SQL 与 Java 结合使用 我已成功安装 JDBC 驱动程序 并且能够从数据库读取记录并将其打印在屏幕上 我的问题发生在尝试执行更新或插入语句时 没有任何反应 这是我的代码 问题所在的方法 public static
  • 将现有 eclipse 项目导出到 war 文件时出现“模块名称无效”

    我正在尝试将现有 Eclipse 项目导出到 war 文件 但无论我在 WAR Export 对话框页面中输入什么 系统总是返回 模块名称无效 我不知道如何解决这个问题 谢谢您的帮助 我有同样的问题 我修复了它 请按照以下步骤操作 您可以创
  • 查找数组中的组合

    我在java中有一个像这样的二维数组 transmission communication tv television approach memorycode methodact 我需要获得所有组合 例如 transmission appr
  • 是否有最新的 Facebook Java SDK? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 好像没找到最近更新的 如果没有 是否有一个好的 Java 库来执行与 Facebook 的 API 交
  • 合并两个地图的最佳实践是什么

    如何将新地图添加到现有地图 地图具有相同的类型Map
  • java swing:向 JTree 项目添加自定义图形按钮

    我想在 JTree 中的项目右侧添加一个带有小图标的附加按钮 这可以做到吗 如果是这样 怎么办 thanks Clamp 你在这方面成功了吗 我想做同样的事情 但很难让 JButton 响应用户 设置渲染器以显示按钮的过程很顺利 但所有鼠标
  • Java String ReplaceAll 方法给出非法重复错误?

    我有一个字符串 当我尝试运行时replaceAll方法 我收到这个奇怪的错误 String str something op str str replaceAll o n it works fine str str replaceAll n
  • 传递 Android DialogFragment 参数时,onCreateDialog 捆绑参数意外为 null

    我正在尝试使用 DialogFragment 在 Android 中显示一个基本对话框 并使用对话框消息的参数 如中所述StackOverflow线程 https stackoverflow com questions 15459209 p
  • java中的预增量/后增量

    有人可以帮助我理解为什么 int i 1 int j 1 int k 1 int l 1 System out println i i System out println j j System out println k k System
  • Jackson 反序列化相当于 @JsonUnwrapped 吗?

    假设我有以下课程 public class Parent public int age JsonUnwrapped public Name name 生成 JSON age 18 first Joey last Sixpack 我如何将其反
  • @Embeddable 中的 @GenerateValue

    我已将实体的 id 分离到一个单独的 Embeddable 类中 该实体如下 Entity Table name users public class Users EmbeddedId private Users pk id private
  • 你能快速告诉我这个伪代码是否有意义吗?

    我相信我的代码现在是万无一失的 我现在将写出伪代码 但我确实有一个问题 为什么 DRJava 要求我返回 if 语句之外的内容 正如你所看到的 我为 ex 写了 return 1 只是因为它问了 但是它永远不会返回该值 谁可以给我解释一下这

随机推荐

  • 【2022版】Java多线程与高并发面试题总结,108道题含答案解析。

    前言 最近面试的小伙伴很多 对此我整理了一份Java面试题手册 基础知识 JavaOOP Java集合 泛型面试题 Java异常面试题 Java中的IO与NIO面试题 Java反射 Java序列化 Java注解 多线程 并发 JVM Mys
  • set要点

    set分为set和multisets 前者元素不能重复 后者允许 set通常是以平衡二叉树完成的 由于set和map十分类似 所以本文篇幅较短 主要聚焦于一些set比较特殊的部分 set特点 由于二叉树搜索元素时的良好性能 其搜索函数算法具
  • esp32CAM环境安装教程---串口驱动安装

    前言 1 本人安装好arduino 的ESP32环境之后 发现一直下载不进去程序 一直说Cannot configure port something went wrong Original message PermissionError
  • pytorch实现style transfer

    说是实现 其实并不是我自己实现的 亮出代码 https github com yunjey pytorch tutorial tree master tutorials 03 advanced neural style transfer c
  • 【计算机网络】实验报告二:Wireshark实验

    Wireshark实验 实验准备 1 数据链路层 1 实作一 熟悉 Ethernet 帧结构 2 实作二 了解子网内 外通信时的 MAC 地址 3 实作三 掌握 ARP 解析过程 2 网络层 1 实作一 熟悉 IP 包结构 2 实作二 IP
  • 尚硅谷-宋红康-MySQL高级性能篇

    尚硅谷 宋红康 MySQL高级性能篇 第1章 Linux下MySQL的安装与使用 1 安装前说明 1 1 Linux系统及工具准备 二级目录 三级目录 第1章 Linux下MySQL的安装与使用 1 安装前说明 1 1 Linux系统及工具
  • 华为Atlas开发环境(ATC环境)搭建

    此博文主要用于指导在非昇腾AI设备上安装开发环境 用于代码开发及ATC模型转换等功能 以下所有操作建议在root用户下进行 可以省去很多麻烦 1 准备软件包 若开发环境为x86 64架构 而运行环境为aarch64架构 则开发环境上需要同时
  • cv2.error: Unknown C++ exception from OpenCV code

    超链接 深度学习工作常用方法汇总 矩阵维度变化 图片 视频等操作 包含 torch numpy opencv等 原因 ndarray经过切片后 会出现内存不连续的情况 当不连续时 保存就会报错 解决办法 frame np ascontigu
  • 在子工程中禁用的父工程的 maven 插件

    以 mybatis generator maven plugin 插件为例 在父工程中添加了 mybatis generator maven plugin 插件 想要在子工程禁用 则在对应子工程 pom 中添加 如下内容
  • App数据抓取(抓包工具使用)

    文章目录 fiddler使用 移动端 mitmproxy mitmdump 基础实战 使用Python抓取数据 小结 fiddler使用 基础篇介绍了如何设置fiddler做代理 这里继续介绍使用方法 在file中可以选择开始 停止抓包 可
  • 在安装project2010 64位时提示 “无法安装64位office,因为已有32位版本”解决方法...

    1 点击电脑左下角开始按钮 选择运行 或者window R快捷键 输入命名 regedit 2 弹出注册表编辑器窗口 选择HKEY CLASSES ROOT 打开子选项 3 然后找到Installer文件夹 展开文件列表 文件太大的话直接在
  • 87键键盘insert键使用方法

    87键党一枚 对于计算机工作者而言 104键键盘太鸡肋了 有很多键基本用不到 布局比较反人类 对于想要盲打全键的程序员 文字工作者而言 要按下控制键 得转动手腕甚至转动手肘 严重降低效率 87键实现了所有常用键的布局 可以盲打所有按键 对于
  • 马上看懂各种内聚类型(逻辑内聚、过程内聚、顺序内聚)

    各种内聚模式 内聚概念 内聚其实是一个模块内部各成分之间相关联程度的度量 用来表示说 你这个模块里面各个元素之间关系好不好 是不是每天勾肩搭背 还是冷眼相对或者是偶尔打个招呼 内聚类型 这里用 元素 来统一表达一个模块中各种操作 部分等说法
  • 定时任务-quartz的使用,实现可页面化管理

    定时任务 quartz的使用 实现可页面化管理 使用spring quartz实现定时任务的页面化管理 主要特点 1 时间表达式等信息配置在数据库中 从而实现页面化管理 2 可以手动执行或者停止单个任务 也可以使一个任务加入或者移出自动运行
  • unity 渲染流水线

    渲染流水线 主要分为应用阶段 几何阶段 光栅化阶段 应用阶段 这一阶段最重要的输出是渲染所需的几何信息 即渲染图元 几何阶段 重要任务就是把顶点坐标变换到屏幕空间 通过对输入的渲染图元进行多次处理后 输出屏幕空间的二维顶点坐标 每个顶点对应
  • 《大话数据结构》第六章树

    1 定义 之前我们一直在谈的是一对一的线性结构 可现实中 还有很多一对多的情况需要处理 所以我们需要研究这种一对多的数据结构 树 考虑它的各种特性 来解决我们在编程中碰到的相关问题 树 Tree 是n n 0 个结点的有限集 n 0时称为空
  • R语言中的函数18:readxl::read_excel(), read_xls(),read_xlsx()

    文章目录 read excel read xls 和read xlsx 函数介绍 实例 实例1利用read xls读取文件 实例2指定读取数据的范围range 实例3读取有缺失值的数据 实例4read xls和read xlsx需要对应的文
  • vue nextTick深入理解-vue性能优化、DOM更新时机、事件循环机制

    一 定义 nextTick 事件循环 nextTick的由来 由于VUE的数据驱动视图更新 是异步的 即修改数据的当下 视图不会立刻更新 而是等同一事件循环中的所有数据变化完成之后 再统一进行视图更新 nextTick的触发时机 在同一事件
  • 什么?计算机居然不能精确计算0.1+0.2?

    小云今年大三在一家互联网公司实习 今天下班回到寝室闷闷不乐 小帅见状关心到 怎么了 碰到什么不开心的事了吗 小云叹了口气 今天我写的程序中涉及到小数计算 出了个bug 被测试的人笑了 说我居然0 1 02都不会算 小帅忍不住笑了 0 1 0
  • Java之JVM方法区、永久代、元空间、常量池简介说明

    转自 Java之JVM方法区 永久代 元空间 常量池简介说明 下文笔者讲述jvm中方法区 永久代 元空间 常量池的简介说明 如下所示 JVM内存模型简介 jvm堆是所有线程共享的 主要用来存储对象 堆 年轻代和老年代两块区域 使用NewRa