当前位置:网站首页>JVM内存和垃圾回收-08.方法区
JVM内存和垃圾回收-08.方法区
2022-08-04 16:51:00 【J___code】
1.栈、堆、方法区的交互关系
首先大致回顾下内存区域的整体结构以及可能出现的异常:
对于语句
Person person = new Person();
,Person的class文件存储在方法区中,对象的引用person存放在栈中,new Person()
后产生的对象存储在堆中
2.方法区的理解
- 它是每个线程共享的内存区域
- 在JVM启动时创建,且物理内存空间可以不连续
- 和堆一样可以选择固定大小,也可扩展
- 关闭JVM就会释放方法区的内存
- 定义了太多的类会导致方法区溢出(比如Tomcat上部署了多个项目,每个项目需要使用反射创建类)
- JDK7之前把方法区称为永久代;JDK8开始使用元空间取代永久代(元空间使用本地内存)
3.方法区的内部结构
方法区用于存储类型信息、运行时常量池、静态变量、即时编译器编译后的代码缓存等
- 类型信息:包括类、接口、枚举、注解的信息
- 类型的完整名称(包名.类名)
- 直接父类的完整名称
- 类的修饰符(public、final等)
- 直接接口的列表
- 域信息:即类中的属性
- 域名称
- 域类型
- 域修饰符
- 方法信息:
- 方法名称
- 返回类型
- 方法的修饰符
- 方法的字节码
- 异常表
对于类中使用
final static
修饰的属性,在链接的准备阶段就被赋予值,而一般的属性需要在初始化阶段才会被赋予值(该值是在代码中显示给定的值,即显示初始化)
4.运行时常量池和常量池
4.1 常量池
- 源文件的类、接口编译后产生一个class文件,class文件需要数据的支持,该数据并不会直接存储在class文件中(常量池还是在class文件中,只不过不是直接在每一行字节码后使用常量,而是使用一个引用,如图中的#3),而是存储到常量池
- 常量池可以视为一张表,JVM根据该表找到要执行的类名、参数类型、字面量等类型
4.2 运行时常量池
- 常量池是class文件的一部分,而运行时常量池是方法区的一部分
- 常量池存储编译器生成的各种字面量和符号引用,该部分内容在类加载后存储在运行时常量池中
- 动态性:运行时常量池除了常量池中在编译期已确定的数值字面量,还包括运行期解析后才能获得的方法或字段引用(如执行
"psj".intern()
时,如果在常量池中没有psj
时,就会在运行时常量池中创建) - 也存在OOM异常
5.方法区的演变*
下面图中浅绿色部分表示JVM内存
- JDK6:静态变量存放在永久代上
- JDK7:字符串常量池和静态变量从永久代移到堆中
- JDK8:无永久代,使用元空间替代,且元空间使用本地内存而不是JVM的内存
1.为什么使用元空间替换永久代?
- 为永久代设置空间大小很难确定。元空间不在JVM中而在本地内存,所以它的大小受本地内存的限制,本地内存很少出现Full GC
- 对永久代的调优十分困难
2.StringTable为什么要调整?永久代GC效率低(在Full GC的时候才会触发,即老年代内存或永久代内存不足时),导致StringTable回收效率不高,而在开发中会使用到大量字符串,很容易导致永久代内存不足。堆中会及时回收内存
3.静态引用对应的对象实体始终在堆空间中,而根据不同的JDK版本,由于静态变量存放的位置不同,该静态变量的引用可能在永久代中,也可能在堆中
static byte[] arr = new byte[1024*1024*100]; // arr根据JDK版本不同会存在不同的位置,而byte数组始终在堆中
6.总结
为什么要分为新生代和老年代?为什么要有Survivor区?
https://blog.csdn.net/u013126379/article/details/115590570
边栏推荐
猜你喜欢
跨链桥已成行业最大安全隐患 为什么和怎么办
全球电子产品需求萎靡:三星越南工厂大幅压缩产能,减少工人工作日
从正负样本解耦看对比学习为何需要large batch size训练Ddcoupled Contrastive learning (DCT)
越来越火的图数据库到底能做什么?
Heilongjiang Mobile New Magic Hundred Box M411A_2+8_S905L3A_wire brush firmware package
贝叶斯优化核极限学习机KELM用于回归预测
"Distributed cloud best practices" BBS, on August 11, shenzhen
B站回应HR称核心用户是Loser;微博回应宕机原因;Go 1.19 正式发布|极客头条
智慧场馆的无人值守怎么做?
Go语言gin框架返回json格式里,怎么把某个int属性转成string返回?
随机推荐
Hubei Mobile ZTE B860AV2.1_S905L_ flash firmware package
面试官:多个线程执行完毕后,才执行另一个线程,该怎么做?
抖音最重要的接口——item_search_video-根据关键词获取视频列表
北京海淀6家必胜客被暂停外卖订餐 存在食品安全问题
AtCoder Beginner Contest 262 部分题解
如何提高员工积极性?
广东移动魔百盒M411A _905L3_线刷固件包
码蹄集 - MT2142 - 万民堂大厨
Steady Development | Data and Insights on Mobile Game Players in Western Europe
7 月浏览器市场份额:Edge 全球第二、360 安全浏览器中国第二
shell脚本详解-------循环语句wuile循环和until循环
移动海信IP102H_905L3-B_线刷固件包
机器学习入门到大神专栏总览
测试开发必备技能-Jmeter二次开发
湖北移动HG680-LV_S905L3B_线刷固件包
浙江移动咪咕MGV2000-K4_ZJ_S905l2_7661_线刷固件包
8年软件测试感悟,送给刚入测试行业的小伙伴
PAT 甲级 A1072 Gas Station
饿了么智能头盔专利获授权 进一步提升骑手安全保障
SQL语言的分类以及数据库的导入