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

【JVM基础05】——组成-能不能解释一下方法区?

目录

  • 1- 引言:方法区概述
    • 1-1 方法区是什么?(What)
    • 1-2 为什么用方法区?方法区的作用 (Why)
  • 2- ⭐核心:详解方法区(How)
    • 2-1 能不能解释一下方法区?
    • 2-2 元空间内存溢出问题
    • 2-3 什么是常量池?
    • 2-4 运行时常量池
  • 3- 小结:
    • 3-1 什么是方法区?方法区的作用?
    • 3-2 介绍一下运行时常量池?


1- 引言:方法区概述

1-1 方法区是什么?(What)

  • 方法区是 Java 虚拟机中的一个运行时数据区,它是各个线程共享的内存区域,主要用于存储类的信息和运行时常量池。
  • 方法区在 Java 虚拟机启动时创建,在虚拟机关闭时释放。具体存储内容包括类的结构、方法、字段以及运行时常量池的信息。
    • 在 JDK 8之前,方法区存储在堆中的永久代区域
    • 在 JDK 8之后,永久代被移除,改为元空间,使用的是操作系统的本地内存

image.png

1-2 为什么用方法区?方法区的作用 (Why)

  • ① 存储类信息:方法区存储所有被加载类的结构信息,包括类名、访问修饰符、字段描述、方法描述等。这些信息在类加载时会被读取并存储到方法区,以便于虚拟机执行相应的操作。
  • ② 存储运行时常量池:运行时常量池是方法区的重要组成部分,包含了编译期间生成的各种字面量和符号引用。当类被加载时,常量池的信息会被加载到运行时常量池,并将符号地址转换为真实的内存地址,以便在程序运行时进行快速查找和执行。
  • ③ 支持类加载和卸载:方法区在类加载时创建,在类卸载时释放存储空间。它的存在使得Java虚拟机可以动态加载和卸载类,从而支持Java的动态性和扩展性。

2- ⭐核心:详解方法区(How)

2-1 能不能解释一下方法区?

  • 方法区(Method Area) 是各个线程 共享的内存区域
  • 主要存储类的信息、运行时常量池
  • 虚拟机启动的时候创建,关闭虚拟机时释放
  • 如果方法区域中的内存无法满足分配请求,则会抛出OutOfMemoryError:Metaspace

image.png


2-2 元空间内存溢出问题

  • 以下代码演示了通过动态生成和加载类来导致Java虚拟机的元空间(Metaspace)内存溢出(java.lang.OutOfMemoryError: Metaspace)的情况。

在没有设置元空间大小上限的情况下

  • 以下代码的执行是没有错误的

**如果设置了 **-XX:MaxMetaspaceSize=8m

  • 此时会抛出 java.lang.OutOfMemoryError: Metaspace异常
/*** 演示元空间内存溢出 java.lang.OutOfMemoryError: Metaspace* -XX:MaxMetaspaceSize=8m*/
public class MetaspaceDemo extends ClassLoader { // 可以用来加载类的二进制字节码public static void main(String[] args) {MetaspaceDemo test = new MetaspaceDemo();for (int i = 0; i < 10000; i++) {// ClassWriter 作用是生成类的二进制字节码ClassWriter cw = new ClassWriter(0);// 版本号,public,类名,包名,父类,接口cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "Class" + i, null, "java/lang/Object", null);byte[] code = cw.toByteArray();// 执行类的加载test.defineClass("Class" + i, code, 0, code.length); // Class 对象}}
}

2-3 什么是常量池?

  • 常量池可以看做是一张表,虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量等信息。

image.png

  • 字符串常量池(String Constant Pool)是Java虚拟机中的一个特殊内存区域,用于存储字符串字面量。

image.png

  • 一个Java方法的机器指令想要执行,则需要他要去查表,翻译到常量池中去找到对应的地址进行翻译,然后最终才能去执行当前的指令。

2-4 运行时常量池

  • 常量池是 .class 文件中的,当该类被加载,它的常量池信息就会 放入运行时常量池,并把里面的符号地址变为真实地址*

image.png


3- 小结:

3-1 什么是方法区?方法区的作用?

在这里插入图片描述


3-2 介绍一下运行时常量池?

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 手机如何播放电脑的声音?
  • Django 简介
  • Unity UGUI 之 Slider
  • .NET开源、简单、实用的数据库文档生成工具
  • Windows 11+Visual Studio 2022 环境OpenCV+CUDA 12.5安装及踩坑笔记
  • 23种设计模式【结构型模式】详细介绍之【组合模式】
  • 【分布式锁】Redission实现分布式锁
  • 杰发科技Bootloader(1)—— Keil配置地址
  • Vuex数据持久化实现
  • 若依Vue前后端分离版如何部署(windows)(超详细)
  • Python爬虫(5) --爬取网页视频
  • MacOS安装SDKMan管理Java版本
  • libtins初探-抓包嗅探
  • 微信小程序canvas 使用案例(一)
  • android13读取cpu频率,并调整频率
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【前端学习】-粗谈选择器
  • 〔开发系列〕一次关于小程序开发的深度总结
  • angular2 简述
  • IDEA 插件开发入门教程
  • JavaScript服务器推送技术之 WebSocket
  • Java教程_软件开发基础
  • jdbc就是这么简单
  • js ES6 求数组的交集,并集,还有差集
  • Linux快速复制或删除大量小文件
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • opencv python Meanshift 和 Camshift
  • php ci框架整合银盛支付
  • Python socket服务器端、客户端传送信息
  • python 学习笔记 - Queue Pipes,进程间通讯
  • React Transition Group -- Transition 组件
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 初识 webpack
  • 高性能JavaScript阅读简记(三)
  • 记一次用 NodeJs 实现模拟登录的思路
  • 将 Measurements 和 Units 应用到物理学
  • 今年的LC3大会没了?
  • 聊聊sentinel的DegradeSlot
  • 如何编写一个可升级的智能合约
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 我的面试准备过程--容器(更新中)
  • 小程序 setData 学问多
  • 学习ES6 变量的解构赋值
  • 以太坊客户端Geth命令参数详解
  • 运行时添加log4j2的appender
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • ionic异常记录
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • ![CDATA[ ]] 是什么东东
  • #QT(一种朴素的计算器实现方法)