java - 使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
解决方案
默认情况下,JVM 处理类的加载和卸载。你的应用程序命令行是什么?您看到的是 OOM:元空间还是 JavaHeap?
推荐阅读
- javascript - 模拟子组件 - 多个组件匹配节点与标记名错误
- asp.net - 在同一个 asp.net Web 应用程序中使用两个 Owin 身份
- python - Python 生成的 lzma 文件缺少未压缩的大小
- php - 在 PHP 中循环 fputcsv 的问题,我该如何解决?
- c++ - 复制“向量”数组:通过 memcpy 还是迭代每个?
- c# - 使用 C# 根据工作日选择日历
- c# - 加载时输入文本框缩短
- jquery - 等待所有 Ajax 调用在 for 循环内完成,然后重定向
- kotlin - Kotlin putExtra 没有得到解决
- python - 为什么全局变量会改变功能?