JVM(HotSpot):方法区(Method Area)

文章目录

一、内存结构图

1.6 方法区详细结构图

1.8方法区详细结构图

1.8后,方法区是JVM内存的一个逻辑结构,真实内存用的本地物理内存。

且字符串常量池从常量池中移入堆中。

二、方法区定义

官方的规范定义:

方法区(Method Area)与Java堆一样,是各个线程共享的内存区域

它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。

方法区的实现:

对于JDK8之前的版本,我们都把他称为永久代,或者将两者混为一谈,其实两者并不是一个概念,使用永久代来实现方法区,可以像java堆一样去管理方法区的内存,而它会更容易导致内存溢出的问题到了JDK7,尝试将字符串常量池、静态变量移出来,而在JDK8之后的版本,就完全舍弃了永久代,改用元空间来实现

(永久代有上限,参数:-XX:MaxPermSize,即使不设置也会有默认大小),

相关参数:

bash 复制代码
永久代:-XX:MaxPermSize=10m
元空间:-XX:MaxMetaspaceSize=10m

三、内存溢出问题

JDK8
java.lang.OutOfMemoryError: Metaspace

错误复现:

随便搞个springboot项目,设置一下元空间大小为10m,启动就会报错。

四、常量池与运行时常量池

从内存结构图中,我们可以知道,常量池是方法区中的一个组成部分。

常量池,就是一张表,虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量(字符串、基本类型)等信息,它们是写在*.class文件中的。

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

相关推荐
嘟嘟w3 小时前
JVM(Java 虚拟机):核心原理、内存模型与调优实践
java·开发语言·jvm
G皮T5 小时前
【Java】Java 运行时数据区域(一):名词概念
java·jvm·runtime·运行时·运行时数据区域
小年糕是糕手6 小时前
【C++】C++入门 -- inline、nullptr
linux·开发语言·jvm·数据结构·c++·算法·排序算法
七夜zippoe6 小时前
JVM调优实战:从GC日志分析到参数配置(Xmx, Xms, XX:+)
java·jvm·gc·jit·垃圾回收器
IUGEI7 小时前
【后端开发笔记】JVM底层原理-内存结构篇
java·jvm·笔记·后端
未若君雅裁9 小时前
JVM基础总结
java·jvm·java-ee
心态特好10 小时前
JVM 如何判断‘对象 / 类该回收
jvm
鲸沉梦落10 小时前
JVM类加载
java·jvm
EAIReport12 小时前
自动化报告生成产品内嵌OA/BI平台:解决传统报告痛点的技术方案
java·jvm·自动化
没有bug.的程序员20 小时前
Java 字节码:看懂 JVM 的“机器语言“
java·jvm·python·spring·微服务