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或其他服务器方面没有那么有经验,所以任何帮助都是非常受欢迎的。
非常感谢您的每一个答案,并认为您正在与我分享。