Java 虚拟机面试题, 为什么 Java 8 移除了永久代PermGen并引入了元空间Metaspace?
Java 虚拟机面试题, 为什么 Java 8 移除了永久代PermGen并引入了元空间Metaspace?
QA
Step 1
Q:: 为什么 Java 8
移除了永久代(PermGen)并引入了元空间(Metaspace)?
A:: 在Java 8
之前,Java虚拟机(JVM)使用永久代(PermGen)来存储类的元数据、常量池、方法信息等。永久代的大小是固定的,容易出现内存不足的问题,尤其是在应用程序频繁加载和卸载类时,可能会导致OutOfMemoryError: PermGen space
。为了解决这个问题,Java 8
引入了元空间(Metaspace)。元空间不再使用JVM内存,而是使用本地内存(Native Memory),这样可以更灵活地管理内存。元空间的大小可以通过参数配置,并且默认情况下是自适应的,不容易出现内存不足的问题。
Step 2
Q:: 元空间(Metaspace)的优点和缺点是什么?
A:: 元空间的主要优点包括:1
)更灵活的内存管理,因为它使用的是本地内存,减少了OutOfMemoryError
的风险;2)自适应的内存大小,可以根据应用需求自动调整。缺点包括:1)可能会消耗更多的本地内存,增加操作系统的压力;2
)如果不加以限制,可能导致应用程序占用过多的系统资源。
Step 3
Q:: 如何配置元空间的大小?
A:: 可以通过以下JVM参数来配置元空间的大小:1
)-XX:MetaspaceSize=<size>
:设置元空间的初始大小;2
)-XX:MaxMetaspaceSize=<size>
:设置元空间的最大大小;3
)-XX:MinMetaspaceFreeRatio=<percentage>
:设置最小的元空间空闲比例;4
)-XX:MaxMetaspaceFreeRatio=<percentage>
:设置最大的元空间空闲比例。这些参数允许开发者根据应用程序的需求对元空间进行精细化的配置。
Step 4
Q:: 在元空间中存储了哪些内容?
A:: 元空间中存储了与类加载器和类相关的元数据,例如类的名称、方法、字段、接口实现信息等。它不存储实例数据或静态变量,而是专门用于保存与类型系统相关的元信息。