14

私の状況

  • ドキュメント分析用の 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 や他のサーバーでの作業経験があまりないので、どんな助けでも大歓迎です。

すべての回答に感謝し、あなたが私と共有していると考えました.

4

2 に答える 2

0

この問題が発生しないはずのJRockitなどの別のJVMを試してください。Tomcatの場合(ログにリークに関する情報が記録されているかどうかを確認してください)、通常はクラスローダーの問題に対して記録されます。

于 2012-06-08T13:09:20.787 に答える
0

私にとっての解決策は、アプリケーションをデプロイするためのアプリケーション サーバーとして Tomcat から Glassfish に切り替えることでした。

その切り替え後、この CodeCache の動作を再体験することはありませんでした。

この問題が解決されていることを確認するために、サーバーで実行されている java-vm も観察しました (リモートで jconsole を使用)。不審な動作は見られなくなりました。

于 2012-07-04T12:49:52.820 に答える