关于元空间使用本地内存
来源:6-10 Java内存模型之线程共享部分

YogurtJ
2020-02-05
老师您好,课程中您有讲到“元空间使用本地内存,而永久代使用的是JVM内存”
关于这个问题我有两个疑惑:
第一个疑惑就是:
既然元空间使用本地内存,那每次访问class的相关信息(比如说method,field)这些信息,是都需要再与本地内存进行交互嘛?不会影响其效率嘛?(他们不都在Java进程分配的范围里嘛,划了个界限之后区别很大嘛…?)
第二个疑惑是:
我也有印象老师在ClassLoader的那节课里讲到,在装载过程中,加载的时候 比如说ClassLoader.loadclass()的时候,就会生成一个Class<?>对象来存储类的相关信息,
对象都是存储在堆中的,那这些类信息,不还是会通过Class<?>对象存储在JVM的内存中(堆中)嘛,
如果这些类的信息多到要挤爆操作系统的 用户空间给整个Java进程分配的内存(不知道这句话描述是否有误,如有误,希望老师给予指正)的时候,该OutOfMemory的时候,不还是会OutOfMemory嘛…
那元空间使用本地内存而不是JVM内存的好处,究竟是体现在哪里呢?
希望祥仔可以解答疑惑!感谢~
1回答
-
同学好,不好意思看漏问题了,我觉得主要是想问元空间和永久代比起来好处在哪里。
jdk文档上说的,是方便HotSpot与其他JVM如JRockit的集成,因为JRockit本身是没有永久代的。
其次,先前永久代的大小是需要指定的,类和方法的信息大小难以确定,给永久代的大小指定带来困难(太小,容易导致永久代溢出 太大,容易导致老年代溢出)
而对于Metaspace 容量来讲:默认情况下,类元数据只受可用的本地内存限制(容量取决于是32位或是64位操作系统的可用虚拟内存大小)。新参数(MaxMetaspaceSize)用于限制本地内存分配给类元数据的大小。如果没有指定这个参数,元空间会在运行时根据需要动态调整。
另外,对于僵死的类及类加载器的垃圾回收将在元数据使用达到“MaxMetaspaceSize”参数的设定值时进行。适时地监控和调整元空间对于减小垃圾回收频率和减少延时是很有必要的。持续的元空间垃圾回收说明,可能存在类、类加载器导致的内存泄漏或是大小设置不合适。
此外,JVM内存于操作系统来讲也是其管理的内存,内存去获取东西也就是按照地址去获取,所以性能几乎是没有损失的
112020-02-08
相似问题