商城网站建设教程,网站建设是什么工作,保险代理做的比较好的网站,做co网站文章目录 一、内存结构图二、方法区定义三、内存溢出问题四、常量池与运行时常量池 一、内存结构图 1.6 方法区详细结构图 1.8方法区详细结构图 1.8后#xff0c;方法区是JVM内存的一个逻辑结构#xff0c;真实内存用的本地物理内存。 且字符串常量池从常量池中移入堆中。 … 文章目录 一、内存结构图二、方法区定义三、内存溢出问题四、常量池与运行时常量池 一、内存结构图 1.6 方法区详细结构图 1.8方法区详细结构图 1.8后方法区是JVM内存的一个逻辑结构真实内存用的本地物理内存。 且字符串常量池从常量池中移入堆中。
二、方法区定义
官方的规范定义 方法区Method Area与Java堆一样是各个线程共享的内存区域 它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。
方法区的实现 对于JDK8之前的版本我们都把他称为永久代或者将两者混为一谈其实两者并不是一个概念使用永久代来实现方法区可以像java堆一样去管理方法区的内存而它会更容易导致内存溢出的问题到了JDK7尝试将字符串常量池、静态变量移出来而在JDK8之后的版本就完全舍弃了永久代改用元空间来实现 永久代有上限参数-XX:MaxPermSize即使不设置也会有默认大小
相关参数
永久代-XX:MaxPermSize10m
元空间-XX:MaxMetaspaceSize10m三、内存溢出问题
JDK8 java.lang.OutOfMemoryError: Metaspace 错误复现 随便搞个springboot项目设置一下元空间大小为10m启动就会报错。
四、常量池与运行时常量池
从内存结构图中我们可以知道常量池是方法区中的一个组成部分。
常量池就是一张表虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量字符串、基本类型等信息它们是写在*.class文件中的。
运行时常量池是当该class类被加载时它的常量池信息就会放入运行时常量池并把里面的符号地址变为真实的内存地址