关于JVM的一些调整心得

前段时间,所负责项目在运行的时候,抛出OMM问题,metaspace元空间溢出

一通找资料,最终解决了这个问题。

在解决问题的同时,也对jvm的运行参数有了些许了解,在此记录下来

解决经历

一般来说,一旦出现omm问题,提升堆内存能解决

服务所在的服务器(容器)有4G的内存空间,而运行时被没有做jvm配置,堆大小默认是当前内存的一半,也就是2G,而当我将Xms和Xmx均设置为3G时,完全没有解决问题

经过查询资料,我了解到了metaspace并不在堆中,它的大小似乎取决于所加载的class数量

所以我进行了代码优化,减少了不必要的依赖,同时调整MaxMetaSpace大小为512M,解决了问题。

总结

JVM加载类的时候,需要记录类的元数据,这些数据会保存在一个单独的内存区域内,在Java 7里,这个空间被称为永久代(Permgen),在Java 8里,使用**元空间(Metaspace)**代替了永久代。永久代和元空间保存的数据并不完全一样,永久代中还保存另一些与类的元数据无关的杂项。

MaxMetaSpace在容器中默认大小为100M,而metaspace初始大小仅为20M,这个是控制metaspaceGC发生的初始阈值,对于一些业务功能较为复杂的项目来说显然是不够了,需要手动配置参数

这次出现的问题,间接让我学会了jstat、jps、jmap等一系列命令的使用,了解了jvm各分区的作用以及解读gcutil、metacapacity含义。