15158846557 在线咨询 在线咨询
15158846557 在线咨询
所在位置: 首页 > 营销资讯 > 网站运营 > Java8中的JVM元空间是不是方法区?

Java8中的JVM元空间是不是方法区?

时间:2023-11-12 06:24:01 | 来源:网站运营

时间:2023-11-12 06:24:01 来源:网站运营

Java8中的JVM元空间是不是方法区?:不是的,应该说是:

元空间是方法区的一种具体实现
你可以把方法区理解为Java中定义的一个接口,把元空间/永久代看做这个接口的具体实现类
方法区是规范,元空间/永久代是Hotspot针对该规范进行的实现。
在JVM规范中,方法区被定义为一种逻辑区域,而方法区具体怎么实现是各JVM的实现细节,所以方法区的内容在堆里也好,不在堆里也好都是符合标准的。

如果想要深入了解JVM的话,可以买这一本《Java虚拟机规范》,这一章中讲解的比较详细




元空间这个东西,是在JDK8以后才存在的,JDK7及以前,只有永久代这个区域

元空间的存储位置是在计算机的内存当中,而永久代的存储位置是在JVM的堆(Heap)中

根据视频里的讲解,讲师的个人推测,JDK8以后,JVM用元空间代替永久代的原因可能是:

  1. 随着操作系统的发展,计算机支持的内存从32位的最大2^32字节,变为64位的最大2^48字节(64位操作系统有16位是保留位,所以只有48位可用)
  2. 随着Java在Web领域的发展,Java程序变得越来越大,需要加载的内容也越来越多,如果使用永久代实现方法区,那么需要手动扩大堆的大小,而使用元空间之后,就可以直接存储在内存当中,不用手动去修改堆的大小。
2021/05/16更新:

最近看文章的时候看到了官方JEP对于移除PermGen的理由:

地址:JEP 122: Remove the Permanent Generation

Motivation
This is part of the JRockit and Hotspot convergence effort. JRockit customers do not need to configure the permanent generation (since JRockit does not have a permanent generation) and are accustomed to not configuring the permanent generation.
======中文翻译======
动机
这是JRockit和Hotspot融合工作的一部分。JRockit的客户不需要配置永久代(因为JRockit没有永久代),并且习惯于不配置永久代。

元空间的空间范围默认是:
最小:20.75MB 最大:16EB(GB -> TB -> PB -> EB)

补充:最近在看汇编,突然发现这个数字的大小刚好是64位计算机可以识别到的最大内存。

地址总线(Address Bus)是一种计算机总线,是CPU或有DMA能力的单元,用来沟通这些单元想要访问(读取/写入)计算机内存组件/地方的物理地址。 [1]
数据总线的宽度,随可寻址的内存组件大小而变,决定有多少的内存可以被访问。
举例来说:一个 16位元 宽度的位址总线 (通常在 1970年 和 1980年早期的 8位元处理器中使用) 到达 2 的 16 次方 = 65536 = 64 KB 的内存位址,而一个 32位单元位址总线 (通常在像现今 2004年 的 PC 处理器中) 可以寻址到 4,294,967,296 = 4 GB 的位址。但现在很多计算机内存已经大于4G(windows XP x32位系统最大只能识别3.29G,所以要使用4G以上大内存就要用windows x64位系统)。所以主流的计算机都是64位的处理器也就是说可以寻址到2^64=16X10^18=16EB的位址,在很长一段时间内这个数字是用不完的。
来源于百度百科:

但是你可以通过这两个命令来设置大小

-XX:MetaspaceSize=

-XX:MaxMetaspaceSize=


回答参考来自视频的P3 (时间:7':23'' - 19':19''):

视频讲的挺好的,老师使用它手写的一个JVM来讲解,遇到难点直接看他自己写的C++源码,会更形象。



关键词:方法,空间

74
73
25
news

版权所有© 亿企邦 1997-2025 保留一切法律许可权利。

为了最佳展示效果,本站不支持IE9及以下版本的浏览器,建议您使用谷歌Chrome浏览器。 点击下载Chrome浏览器
关闭