首页 > 解决方案 > 使tomcat从元空间卸载编译的JSP文件

问题描述

打开 jsp 页面时的 java.lang.OutOfMemoryError(PermGen 空间)和 java.lang.ClassNotFoundException类似,但有一些更现代的问题。

我有一个有很多 JSP 的旧版应用程序。他们中的一些人   ...用来做空间(因为页面上的 CSS 清理还没有完成)。

最近我们在系统运行一段时间后出现内存不足的错误。我正在评估堆空间,它似乎处于控制之中,强制定期 GC 显示它小于 100MB 的堆,但非堆大小正在增加。我已经将大小限制为 300MB,这似乎已经很多了,因为系统在 Docker 中通常以 512MB 运行。

无论如何,我使用 JSPC,当我总计所有生成的类文件占用的字节量时,我得到21,981,012 字节。根据我看到的其他答案,我认为它进入了元空间。当然,当它被解压缩到内存中时,这个数字可能会增加很大一部分。

所以我的问题是,有没有办法配置 Java 或 Tomcat 在不使用时从元空间释放类数据,并在需要时重新加载它?

更新:我明确限制了我的元空间大小,CATALINA_OPTS以便它更快地失败 -XX:MaxMetaspaceSize=200m -XX:CompressedClassSpaceSize=100m

这是VisualVM。这些类似乎没有被卸载,元空间也没有下降。 在此处输入图像描述

这里是元空间。 在此处输入图像描述

标签: javajsptomcatmemorymemory-leaks

解决方案


默认情况下,JVM 处理类的加载和卸载。你的应用程序命令行是什么?您看到的是 OOM:元空间还是 JavaHeap?


推荐阅读