私の状況
- ドキュメント分析用の Web サービスを開発しました
- この Web サービスは、txt および pdf ドキュメントを読み取ります
- PDFファイルを読むために、大学のアドバイザーが開発したJavaライブラリを使用しています
- 私はJava 7を使用しています
- 現在、Tomcat v7.0 にデプロイしています。
- アプリケーションから war ファイルを生成し、PC のローカル Tomcat でホストする場合、または Eclipse EE を介して Tomcat でアプリケーションを起動する場合、pdf ファイルの読み取りは問題ありません。
私の問題
- 私は自分で小さなサーバーをセットアップし(最高のハードウェア、デュアルコアCPU、4g RAMではありません)、Tomcat、Java、および必要と思われる残りをインストールしました。
- Tomcatマネージャーを使用してサーバーのTomcatにwarファイルをデプロイすると、アプリケーションにpdfファイルを読み取らせるまで、すべて正常に動作します。
- アプリケーションがいくつかのページを読み取った後、CodeCache がいっぱいになり、これが原因でコンパイルが無効になったというエラーが表示されます。
PDF インポート中のエラー出力の例
このログは、pdf がどのようにインポートされているかを示し、ある時点でエラー メッセージが開始されます。エラーメッセージを太字にしました。
...
2012 年 5 月 31 日 11:15:40 AM infovis.structure.pdf.PDFImport プロセス情報: 処理中のページ 13
2012 年 5 月 31 日 11:15:40 AM infovis.structure.pdf.PDFImport プロセス情報: 処理中のページ 14
2012 年 5 月 31 日 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
2012 年 5 月 31 日 11:16:19 AM infovis.structure.pdf.PDFImport プロセス情報: 処理中のページ 16
2012 年 5 月 31 日 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 シェルの操作が得意ではありません)。CodeCache サイズと他のキャッシュのサイズを増やそうとしましたが、問題は引き続き発生します。コードにリークの可能性がないかチェックしましたが、まだ見つかりませんでした (覚えておいてください。Eclipse 経由で開始すると、このメッセージが表示されないため、Tomcat(?) 構成の問題を示している可能性があります)。また、コードキャッシュがいっぱいになったときにコードキャッシュを空にするよう強制する「UseCodeCacheFlushing」パラメーターを設定しようとしましたが、どういうわけかアプリケーションの故障には影響しません。
私のTomcatサーバー構成
64 ビット アプリケーションの場合、デフォルトの CodeCache サイズは 32MB または 64MB であると読みました。512MB を確保しようとしましたが (設定が間違っていたのでしょうか?)、もちろん問題は再び発生しました。
ここで、JVM 起動パラメータを Java に渡すことができます。設定されていない場合、デフォルトのオプションは次のようになります: -Djava.awt.headless=true -Xmx128m -XX:+UseConcMarkSweepGC
「-XX:+UseConcMarkSweepGC」を使用して、CMS ガベージ コレクターを有効にします (応答時間の改善)。そのオプションを使用し、1 つまたは 2 つのコアを含むちょうど 1 つの 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)のデスクトップPCで650ページのpdfを読むのに問題はなく、これは私を混乱させます。
これは、glassfish などの別のサーバーを展開に使用すると解決できる tomcat の問題にすぎないのでしょうか?
誰かが私を助けたり、アイデアや提案を提供したりできますか? 多分私はいくつかの設定を間違っていましたか?私は tomcat や他のサーバーでの作業経験があまりないので、どんな助けでも大歓迎です。
すべての回答に感謝し、あなたが私と共有していると考えました.