为什么JDK8用Metaspace替代PermGen

简介: 为什么JDK8用Metaspace替代PermGen

1. 性能和内存管理优化

  • 字符串驻留:在JDK 8之前,字符串常量池位于永久代中,这可能导致永久代快速填满,尤其是大量使用字符串的应用。Metaspace的引入将字符串常量池移到了堆内存中,减轻了永久代的压力,提高了字符串操作的性能。
  • 类元数据大小不确定性:类和方法的元数据大小难以预估,因此在永久代中为它们分配合适的空间大小是一项挑战。Metaspace使用本地内存动态调整大小,解决了这个问题,减少了因元数据分配不当导致的内存溢出。

2. GC效率和复杂度降低

  • GC复杂度:永久代的垃圾回收与堆的垃圾回收是分开进行的,这增加了垃圾回收的复杂度。Metaspace的使用使得类元数据和其他堆内存统一管理,减少了GC的复杂性,提高了回收效率。
  • 类卸载和内存泄漏检测:在永久代中,类和类加载器的垃圾回收效率较低,可能导致内存泄漏问题难以发现和解决。Metaspace允许更灵活和高效的类卸载机制,有助于识别和处理类加载器引起的内存泄漏。

3. 与JRockit和IBM JVM的统一

  • 合并技术路线:Oracle计划将HotSpot JVM与JRockit JVM技术整合,后者已经采用了类似的非堆内存管理机制来存储类元数据。引入Metaspace是这一整合计划的一部分,旨在统一和优化JVM架构。

4. 参数简化与灵活性

  • 参数调整:永久代相关的参数(PermSize和MaxPermSize)在JDK 8中被废弃,取而代之的是Metaspace的相关参数,如MaxMetaspaceSize,这提供了更大的灵活性和更简单的内存管理方式。

5. 动态内存分配与限制

  • 动态调整:Metaspace的大小可以动态调整,根据应用需求自动扩展和收缩,直到达到MaxMetaspaceSize的限制,这比永久代的固定大小设定更加灵活和高效。

监控与管理

  • 监控工具:虽然JDK 8初期的监控工具(如jstat和JVisualVM)可能仍显示与PermGen相关的旧信息,但更新后的工具已经适应了Metaspace,允许用户更精确地监控和管理元数据空间的使用。


综上所述,Metaspace的引入是为了改进内存管理的效率、灵活性和性能,减少内存溢出的风险,并为未来的JVM发展铺平道路。

相关文章
|
2天前
|
Linux 测试技术 开发工具
CentOS Linux 8使用阿里源(安装jdk11、git测试)
CentOS Linux 8使用阿里源(安装jdk11、git测试)
10 1
|
7天前
|
Java 关系型数据库 MySQL
杨校老师课堂之Java项目部署到云端服务器之安装MySQL、Jdk、Tomcat
杨校老师课堂之Java项目部署到云端服务器之安装MySQL、Jdk、Tomcat
15 0
杨校老师课堂之Java项目部署到云端服务器之安装MySQL、Jdk、Tomcat
|
19天前
|
Oracle Java 关系型数据库
玩客云安装Armbian和部署jdk环境
该文介绍了在玩客云设备上安装Armbian系统和Java SDK的步骤。首先,需要准备玩客云设备、Armbian镜像文件和USB工具。然后,通过短接点刷入Armbian系统,并通过SSH访问。接着,从可信源下载Java SDK,将其解压并移动到合适目录,编辑环境变量使其生效。最后验证Java安装成功。注意选择兼容版本并备份数据。内容涵盖了ROM开发相关技术。
|
21天前
|
Oracle Java 关系型数据库
Java入门——开发环境、入门程序(搭建Java开发环境、安装JDK 验证、JDK、编写代码、编译代码、运行代码)
Java入门——开发环境、入门程序(搭建Java开发环境、安装JDK 验证、JDK、编写代码、编译代码、运行代码)
28 3
|
22天前
|
Java
树莓派安装java jdk8
树莓派安装java jdk8
44 5
|
22天前
|
Ubuntu Java Linux
Linux centos7 ubuntu 一键安装Java JDK 脚本 shell 脚本
Linux centos7 ubuntu 一键安装Java JDK 脚本 shell 脚本
34 2
|
7天前
|
Java
杨校老师课堂之JDK1.8下载、安装与环境变量配置
杨校老师课堂之JDK1.8下载、安装与环境变量配置
19 0
|
9天前
|
Oracle Java 关系型数据库
Java官网下载JDK21版本详细教程(下载、安装、环境变量配置)
Java官网下载JDK21版本详细教程(下载、安装、环境变量配置)
|
21天前
|
Java 开发工具
Ubuntu18.04 安装jdk1.8
Ubuntu18.04 安装jdk1.8