没有合适的资源?快使用搜索试试~ 我知道了~
【JVM】灵性一问——为什么用元空间替换永久代?
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
2 下载量 118 浏览量
2020-12-21
08:50:39
上传
评论
收藏 80KB PDF 举报
温馨提示
试读
2页
前言 首先需要明确的是,以下我们讨论的HotSpot虚拟机,其他类型的虚拟机,例如JRockit与J9等,压根就没有永久代的概念。因此,下面所说的“虚拟机”都是HotSpot版本的。 要想理解这种变化的原因,需要先理解方法区、永久代与元空间的概念与之间的关系。 方法区与永久代,元空间之间的关系 方法区是一种规范,不同的虚拟机厂商可以基于规范做出不同的实现,永久代和元空间就是出于不同jdk版本的实现。 说白了,方法区就像是一个接口,永久代与元空间分别是两个不同的实现类而已。只不过永久代是这个接口最初的实现类,后来这个接口一直进行变更,直到最后彻底废弃这个实现类,由新实现类——元空间进行替代。 方
资源推荐
资源详情
资源评论
【【JVM】灵性一问】灵性一问——为什么用元空间替换永久代?为什么用元空间替换永久代?
前言前言
首先需要明确的是,以下我们讨论的HotSpot虚拟机,其他类型的虚拟机,例如JRockit与J9等,压根就没有永久代的概念。因
此,下面所说的“虚拟机”都是HotSpot版本的。
要想理解这种变化的原因,需要先理解方法区、永久代与元空间的概念与之间的关系。
方法区与永久代,元空间之间的关系方法区与永久代,元空间之间的关系
方法区是一种规范,不同的虚拟机厂商可以基于规范做出不同的实现,永久代和元空间就是出于不同jdk版本的实现。
说白了,方法区就像是一个接口,永久代与元空间分别是两个不同的实现类而已。只不过永久代是这个接口最初的实现类,后
来这个接口一直进行变更,直到最后彻底废弃这个实现类,由新实现类——元空间进行替代。
方法区方法区
借用《深入理解Java虚拟机——JVM高级特性与最佳实践》中介绍方法区的段落
方法区和堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等
数据。
Java7及以前版本的永久代的结构及以前版本的永久代的结构
在在Java7及以前的版本,是存在永久代的。在及以前的版本,是存在永久代的。在Java7版本时,永久代已经发生了悄悄的变化。等到版本时,永久代已经发生了悄悄的变化。等到Java8时,彻底废弃了永久时,彻底废弃了永久
代,由元空间替换。代,由元空间替换。
永久代与堆的构造如下:
(关于堆中的Eden、from与to区域,可以先参考我的另外一篇文章【JVM】说说java中的堆区)
从上图中可以看到,永久代与堆中的老年代是连续的,这里的连续指的是物理地址连续,永久代本身并不在堆中。因此,老年
代与永久代其中一个满了,都会触发Full GC。
我们可以使用以下的命令,来显示指定永久代的大小:
-XX:PremSize:设置永久代的初始大小
-XX:MaxPermSize: 设置永久代的最大值
由于方法区主要存储类的相关信息,所以对于动态生成类的情况比较容易出现永久代的内存溢出。最典型的场景就是,在 jsp
页面比较多的情况,容易出现永久代内存溢出,会报出”java.lang.OutOfMemoryError: PermGen space “异常。
Java7时,永久代的变化时,永久代的变化
在Java7时,仍然有永久代,永久代也与堆中的老年代连续,但永久代中存储的部分数据已经开始转移到Java Heap或Native
Memory中了,比如:
符号引用(Symbols)转移到了Native Memory
字符串常量池(interned strings)转移到了Java Heap
资源评论
weixin_38680340
- 粉丝: 4
- 资源: 980
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功