我的情况
- 我开发了一个用于文档分析的 Web 服务
- 此网络服务读取 txt 和 pdf 文档
- 为了阅读 pdf 文件,我正在使用我的大学顾问开发的 java 库
- 我正在使用 Java 7
- 我目前正在将它部署在 Tomcat v7.0 上
- 如果我从我的应用程序生成一个war文件并将其托管在我电脑上的本地tomcat上,或者如果我通过eclipse ee在tomcat上启动我的应用程序,则读取pdf文件没有问题
我的问题
- 我已经为自己设置了一个小服务器(不是最好的硬件,双核 cpu,4g 内存),安装了 tomcat,java 和其他对我来说似乎必要的东西。
- 当我现在使用 tomcat 管理器在服务器 tomcat 上部署战争文件时,一切正常,直到我尝试让应用程序读取 pdf 文件。
- 在应用程序读取了几页后,我收到一个错误,即 CodeCache 已满,因此编译已被禁用。
pdf 导入期间的示例错误输出
此日志显示了如何导入 pdf 以及在某些时候开始出现错误消息。我已将错误消息标记为粗体。
...
2012 年 5 月 31 日上午 11:15:40 infovis.structure.pdf.PDFImport process INFO:Processing Page 13
2012 年 5 月 31 日上午 11:15:40 infovis.structure.pdf.PDFImport process INFO:Processing Page 14
2012 年 5 月 31 日上午 11:15:41 infovis.structure.pdf.PDFImport process INFO:处理第 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 infovis.structure.pdf.PDFImport process INFO:处理第 16 页
2012 年 5 月 31 日上午 11:16:20 infovis.structure.pdf.PDFImport process INFO:Processing Page 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服务器配置
我读过默认 CodeCache 大小是 32MB 或 64MB,当它是 64 位应用程序时。我尝试保留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(四核,4x 3.0ghz,也是 4g ram)上的台式电脑上阅读 650 页 pdf 时没有问题,这让我感到困惑。
难道这只是一个tomcat问题,如果我使用另一台服务器进行部署,比如glassfish,就可以解决吗?
任何人都可以帮助我或提供任何想法或建议吗?也许我做错了一些配置?我在使用 tomcat 或其他服务器方面没有那么经验,所以非常欢迎任何帮助。
非常感谢您的每一个回答,并认为您正在与我分享。