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

Java和Tomcat-CodeCache已满。编译器已被禁用,java,tomcat,compiler-construction,code-caching,Java,Tomcat,Compiler Construction,Code Caching,我的处境 我开发了一个用于文档分析的web服务 此web服务读取txt和pdf文档 为了阅读pdf文件,我使用了由我的大学顾问开发的java库 我正在使用Java7 我目前正在Tomcat v7.0上部署它 如果我从我的应用程序生成war文件并将其托管在pc上的本地tomcat上,或者如果我通过EclipseEE在tomcat上启动我的应用程序,那么读取pdf文件就没有问题 我的问题 我为自己设置了一个小服务器(不是最好的硬件、双核cpu、4g ram),安装了tomcat、java和其他

我的处境

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

  • 我为自己设置了一个小服务器(不是最好的硬件、双核cpu、4g ram),安装了tomcat、java和其他我认为必要的东西
  • 当我现在使用tomcat管理器在tomcat服务器上部署war文件时,一切正常,直到我尝试让应用程序读取pdf文件
  • 在应用程序读取了几个页面后,我得到一个错误,即CodeCache已满,编译因此被禁用
pdf导入期间的错误输出示例

此日志显示pdf的导入方式以及错误消息的开始时间。我已将erorr消息标记为fat

2012年5月31日上午11:15:40 infovis.structure.pdf.pdf导入过程信息: 处理第13页

2012年5月31日上午11:15:40 infovis.structure.pdf.pdf导入过程信息:处理第14页

2012年5月31日上午11:15:41 infovis.structure.pdf.pdf导入过程信息:处理第15页

Java HotSpot(TM)64位服务器虚拟机警告:CodeCache已满。编译器已被禁用。Java HotSpot(TM)64位服务器虚拟机警告:尝试使用-XX:ReservedCodeCacheSize=代码缓存[0x00007fa43437e000,0x00007fa4347fe000,0x00007fa43737e000]增加代码缓存大小总计\u blobs=1858 nmethods=1318适配器=490空闲\u代码\u缓存=44631Kb最大\u空闲\u块=45618688 Java HotSpot(TM)64位服务器VM警告:CodeCache已满。编译器已被禁用。Java HotSpot(TM)64位服务器VM警告:尝试使用 -XX:ReservedCodeCacheSize=代码缓存[0x00007fa43437e000,0x00007fa4347fe000,0x00007fa43737e000)总计\u blobs=1859 n方法=1318适配器=490空闲\u代码\u缓存=44631Kb最大\u空闲\u块=45618688

2012年5月31日上午11:16:19 infovis.structure.pdf.pdf导入过程信息:处理第16页

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

Java HotSpot(TM)64位服务器VM警告:CodeCache已满。编译器已被禁用。Java HotSpot(TM)64位服务器VM警告:尝试使用 -XX:ReservedCodeCacheSize=代码缓存[0x00007fa43437e000,0x00007fa4347fe000,0x00007fa43737e000)总计\u blobs=1860 nmethods=1318适配器=490空闲\u代码\u缓存=44630Kb最大\u空闲\u块=45618688 2012年5月31日上午11:17:07 infovis.structure.pdf.PDFImport进程信息:处理第18页Java热点(TM)64位服务器VM警告:CodeCache已满。编译器已被禁用。Java HotSpot(TM)64位服务器VM警告:尝试使用-XX:ReservedCodeCacheSize=代码缓存增加代码缓存大小[0x00007fa43437e000,0x00007fa4347fe000,0x00007fa43737e000)总计\u blob=1861 n方法=1318适配器=490空闲\u代码\u缓存=44633Kb最大\u空闲\u块=45618688

等等

到目前为止我所尝试的

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

我的tomcat服务器配置

我曾读到,64位应用程序的默认CodeCache大小为32MB或64MB。我尝试保留512mb(可能是我在配置中做错了什么?)

您可以在此处将JVM启动参数传递给Java 默认选项为:-Djava.awt.headless=true-Xmx128m -XX:+UseConMarkSweepGC

使用“-XX:+UseConMarkSweepGC”启用CMS垃圾收集器 (提高了响应时间)。如果使用该选项并在 只有一个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)的台式pc上阅读650页的pdf没有问题,这让我感到困惑

这是否仅仅是一个tomcat问题,如果我使用另一台服务器进行部署(如glassfish)就可以解决

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

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

尝试另一个JRoc之类的JVM