jvm虚拟机为什么使用元空间替换了永久代?
1 个回答
人一旦不害怕失去,态度就会变得随意,随你意,你随意。魔女#### 方法区 方法区是 JVM 中的各个线程共享的内存区域,用于存储已加载的类信息、常量、静态变量、即时编译后的代码等数据。 #### 永久代 - **定义**:在 Java 7 及以前版本中,HotSpot 虚拟机将方法区实现为永久代。 - **配置参数**: - `-XX:PermSize`:设置永久代的初始大小。 - `-XX:MaxPermSize`:设置永久代的最大值,默认 64M。 **问题**:动态生成大量类时(例如大量 JSP 页面),可能导致 `java.lang.OutOfMemoryError: PermGen space` 错误,因为永久代空间有限。 #### 元空间 - **定义**:在 Java 8 及以后版本中,HotSpot 虚拟机用元空间取代永久代。元空间存储在本地内存中,实现了方法区。 - **配置参数**: - `-XX:MetaspaceSize`:初始空间大小,达到该值时触发 GC 进行类型卸载,并根据释放空间量调整该值。 - `-XX:MaxMetaspaceSize`:最大空间,默认无上限。 - `-XX:MinMetaspaceFreeRatio`:GC 后最小的 Metaspace 剩余空间容量百分比,减少分配空间导致的 GC。 - `-XX:MaxMetaspaceFreeRatio`:GC 后最大的 Metaspace 剩余空间容量百分比,减少释放空间导致的 GC。 #### 为什么用元空间代替永久代? 1. **避免 OOM 异常**:永久代大小受 `PermSize` 和 `MaxPermSize` 限制,容易导致 OOM 错误。元空间大小由系统实际可用内存控制,避免了这一问题。 2. **改进内存管理**:元空间存储在本地内存,不与堆连续,内存管理更加灵活。 3. **更好的性能**:元空间更高效地进行垃圾收集和内存分配,减少垃圾收集器频率,提高程序运行性能。发布于 2024-07-13 19:27 •IP属地 贵州举报评论收藏
公众号进入网站体验更佳

