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

我的情况

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

我的问题

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

PDF 导入过程中的错误输出示例

此日志显示pdf的导入方式,并在某个时刻开始错误消息。我已将错误消息标记为粗体。

...

May 31, 2012 11:15:40 AM infovis.structure.pdf.PDFImport 流程 信息: 处理 第 13 页

May 31, 2012 11:15:40 AM infovis.structure.pdf.PDFImport 流程 信息: 处理 第 14 页

May 31, 2012 11:15:41 AM infovis.structure.pdf.PDFImport 流程 信息: 处理 第 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

May 31, 2012 11:16:19 AM infovis.structure.pdf.PDFImport 流程 信息: 处理 第 16 页

May 31, 2012 11:16:20 AM infovis.structure.pdf.PDFImport 流程 信息: 处理 第 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:+UseConcMarkSweepGC

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

我对此的看法

在我的研究中,我发现一些说明,当编程失败时,与CodeCache相关的问题可能表明内存泄漏问题,其中结果是垃圾回收器无法清空缓存。这可能是可能的,可悲的是,我没有阅读pdf的库的源代码。但另一方面,我在本地tomcat(quadcore,4x 3.0ghz,也是4g ram)上的台式PC上阅读650页的pdf没有问题,这让我感到困惑。

难道这只是一个tomcat问题,如果我使用另一台服务器进行部署,比如玻璃鱼,这个问题可以得到解决吗?

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

非常感谢您的每一个答案,并认为您正在与我分享。


答案 1

尝试另一个JVM,如JRockit,你不应该有这个问题。如果它是Tomcat - 尝试查看它是否在其日志中记录了有关泄漏的内容 - 它通常针对类加载器问题这样做。


答案 2

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

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

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


推荐