Java 和 Tomcat - CodeCache 已满。编译器已被禁用

问题描述 投票:0回答:2

我的情况

  • 我开发了一个用于文档分析的网络服务
  • 此网络服务读取 txt 和 pdf 文档
  • 为了阅读 pdf 文件,我正在使用由我的大学顾问开发的 java 库
  • 我正在使用Java 7
  • 我目前部署在Tomcat v7.0上
  • 如果我从我的应用程序生成一个war文件并将其托管在我的电脑上的本地tomcat上,或者如果我通过eclipse ee在tomcat上启动我的应用程序,则读取pdf文件没有问题

我的问题

  • 我已经为自己设置了一个小服务器(不是最好的硬件,双核CPU,4G内存),安装了tomcat,java和其他对我来说必要的东西。
  • 当我现在使用 tomcat 管理器在服务器 tomcat 上部署一个 war 文件时,一切正常,直到我尝试让应用程序读取 pdf 文件。
  • 应用程序读取几页后,我收到一条错误,指出 CodeCache 已满,因此编译已被禁用。

pdf 导入期间的错误输出示例

此日志显示了 pdf 的导入方式以及在某些时候开始出现错误消息的情况。我已将错误消息标记为粗体。

...

2012年5月31日上午11:15:40 infovis.struct.pdf.PDF导入流程信息: 正在处理第 13 页

2012 年 5 月 31 日 11:15:40 AM infovis.struct.pdf.PDF 导入流程信息:处理第 14 页

2012 年 5 月 31 日 11:15:41 AM infovis.struct.pdf.PDF 导入流程信息:处理第 15 页

Java HotSpot(TM) 64-Bit Server VM warning: CodeCache is full. Compiler has been disabled. Java HotSpot(TM) 64-Bit Server VM warning: Try increasing the code cache size using -XX:ReservedCodeCacheSize= Code Cache  [0x00007fa43437e000, 0x00007fa4347fe000, 0x00007fa43737e000)  total_blobs=1858 nmethods=1318 adapters=490 free_code_cache=44631Kb largest_free_block=45618688 Java HotSpot(TM) 64-Bit Server VM warning: CodeCache is full. Compiler has been disabled. Java HotSpot(TM) 64-Bit Server VM warning: Try increasing the code cache size using -XX:ReservedCodeCacheSize= Code Cache  [0x00007fa43437e000, 0x00007fa4347fe000, 0x00007fa43737e000)  total_blobs=1859 nmethods=1318 adapters=490 free_code_cache=44631Kb largest_free_block=45618688

2012 年 5 月 31 日 11:16:19 AM infovis.struct.pdf.PDF 导入流程信息:处理第 16 页

2012 年 5 月 31 日上午 11:16:20 infovis.struct.pdf.PDF 导入流程信息:处理第 17 页

Java HotSpot(TM) 64-Bit Server VM warning: CodeCache is full. Compiler has been disabled. Java HotSpot(TM) 64-Bit Server VM warning: Try increasing the code cache size using -XX:ReservedCodeCacheSize= Code Cache  [0x00007fa43437e000, 0x00007fa4347fe000, 0x00007fa43737e000)  total_blobs=1860 nmethods=1318 adapters=490 free_code_cache=44630Kb largest_free_block=45618688 May 31, 2012 11:17:07 AM infovis.structure.pdf.PDFImport process INFO: Processing Page 18 Java HotSpot(TM) 64-Bit Server VM warning: CodeCache is full. Compiler has been disabled. Java HotSpot(TM) 64-Bit Server VM warning: Try increasing the code cache size using -XX:ReservedCodeCacheSize= Code Cache  [0x00007fa43437e000, 0x00007fa4347fe000, 0x00007fa43737e000)  total_blobs=1861 nmethods=1318 adapters=490 free_code_cache=44633Kb largest_free_block=45618688

等等...

到目前为止我所尝试过的

我尝试更改服务器上 tomcat 配置中的缓存大小(我不是最擅长使用 linux shell)。我尝试增加 CodeCache 大小以及其他缓存的大小,但问题仍然出现。我已经检查了我的代码是否存在可能的泄漏,但尚未发现任何泄漏(请记住,如果我通过 eclipse 启动它,我不会收到此消息,因此这可能表明 Tomcat(?) 配置问题)。我还尝试设置参数“UseCodeCacheFlushing”,该参数应在代码缓存变满时强制清空代码缓存,但不知怎的,它不会影响应用程序崩溃。

我的tomcat服务器配置

我读到,当它是 64 位应用程序时,默认 CodeCache 大小为 32MB 或 64MB。我尝试保留 512mb(也许我在配置中做错了什么?),但问题当然又发生了。

您可以在这里将 JVM 启动参数传递给 Java。如果未设置,则 默认选项为:-Djava.awt.headless=true -Xmx128m -XX:+使用ConcMarkSweepGC

使用“-XX:+UseConcMarkSweepGC”启用CMS垃圾收集器 (改进的响应时间)。如果您使用该选项并且运行 Tomcat 一台只有一个 CPU 芯片(包含一个或两个内核)的机器, 您还应该添加“-XX:+CMSIncrementalMode”选项。 JAVA_OPTS="-Djava.awt.headless=true -Xmx3g -Xms2g -XX:+UseCodeCacheFlushing -XX:+UseG1GC -XX:MaxPermSize=512m -XX:ReservedCodeCacheSize=512m"

我对此的想法

在我的研究过程中,我发现一些注释表明,当出现编程故障时,CodeCache 相关问题可能表明存在内存泄漏问题,其结果是垃圾收集器无法清空缓存。 这可能是可能的,遗憾的是我没有阅读pdf的库的源代码。但另一方面,我在本地 tomcat(四核,4x 3.0ghz,也是 4g ram)上的台式电脑上阅读 650 页的 pdf 没有任何问题,这让我感到困惑。

难道这只是一个tomcat问题,如果我使用其他服务器(例如glassfish)进行部署就可以解决?

有人可以帮助我或提供任何想法或建议吗?也许我做了一些配置错误?我在使用 tomcat 或其他服务器方面没有那么丰富的经验,所以非常欢迎任何帮助。

非常感谢您与我分享的每一个答案和想法。

java tomcat code-caching
2个回答
0
投票

尝试其他 JVM,例如 JRockit,您应该不会遇到此问题。如果是 Tomcat - 尝试查看它是否在日志中记录了有关泄漏的信息 - 它通常会针对类加载器问题这样做。


0
投票

我的解决方案是从 Tomcat 切换到 Glassfish 作为应用程序服务器来部署我的应用程序。

在那次切换之后,我再也没有经历过这种 CodeCache 行为。

为了确保这个问题得到解决,我还观察了我的服务器上运行的 java-vm(使用带有远程功能的 jconsole)。我没有再看到任何可疑的行为。

© www.soinside.com 2019 - 2024. All rights reserved.