私の会社は最近、コンテンツ管理ソリューションとしてAlfrescoに移籍しました。コンテンツの一部が動的であるため(別の.jspファイルに含まれている.jspファイルは、Alfresco からXMLとして公開されたサイトマップを読み取り、24時間の結果をキャッシュします)、生成されるファイルは.jspでrsyncされ、 Sun Web Server 7サーブレットコンテナ。Sun Web Server 7サービング.jsp - エデンのスペース動作 - 考えられるメモリリーク
各ページには、ランタイムディレクティブを使用する に含まれるヘッダー、メニュー、およびフッターがあります。私の理解は、最初の要求がindex.jsp
になされたときに、コンパイルされたjspsの数が存在するということです。 index.class
,header.class
, menu.class
およびfooter.class
である。要件はサーブレットコンテナで1回コンパイルして、ソースjsp(Alfrescoによってプッシュアウトされたもの)をx秒ごとに変更するかどうかをチェックすることです。
Webサーバ自体は、Sunのドキュメントで推奨されているように、次のパラメータを使用して生産準備ができて(default-web.xml
)configredされました:checkInterval
パラメータが60に設定されるべきであることを
<init-param>
<param-name>development</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>checkInterval</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>fork</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>mappedfile</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>suppressSmap</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>classdebuginfo</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>trimSpaces</param-name>
<param-value>true</param-value>
</init-param>
ますが、これをやってWebサーバーが起動しなくなってしまいます(私は理由を理解できませんでした)。このための残念な回避策は で、次にdevelopment
をtrueに設定することをお勧めします。
-server -Xrs -Xmx2048m -Xms2048m -Xmn2024m -XX:+AggressiveHeap -XX:LargePageSizeInBytes=256m -XX:+UseParallelOldGC -XX:+UseParallelGC -XX:ParallelGCThreads=8 -XX:+DisableExplicitGC
パフォーマンステスト、我々は2ギガバイトに頻繁にスパイクエデンスペース(当社静的の合計サイズを見ている時:
サーブレットコンテナは、(Sunのドキュメントで推奨再びとして)次のJVM設定で構成されています内容はおよそ200MBであり、私たちの テストは少数のページに対するものです)。マイナーなコレクションがたくさんあります。オブジェクトを素早くTenuredの空間に押し込んで、本当に回復することはありません。多くの完全なGCが得られます (生存者のスペースも90MBから2バイトに縮小されます。 。これが最大の問題点です。私たちの開発者の誰も これは正常な動作だと思いますが、そのメモリがどこに行くのか説明できません。
私たちが見ている他の問題は、スレッド数です。各HTTP要求がサーブレットで新しいスレッドを生成すると、ロードに比例して増加することが予想されます(実行時にjsp:include
を実行すると、新しいスレッドが各サーブレット内にも作成されるとも考えられます)(RequestDispatcher.include()
コンパイル済みのjsp )しかし、各リクエストが処理されると、スレッドは終了し、新しいスレッドが生成されます。 これは正しい仮定ですか?スレッド数は負荷に関係なく停止して増加するようです。
期待されたパターンが上記のものであることに同意しますが、サーブレットコンテナによって実際に行われる作業が非常に少ないため、ピークが若い世代のサイズの限界にあるという事実に懸念があります。 – pertinky
また、動的再コンパイルに関しては、いくつかのJasper2のドキュメントによると、JVMで動作するjavac antタスクにメモリリークがあり、 'fork = true'を使用して別のJVMプロセスでjspをコンパイルすることをお勧めします。上記のグラフは、フォークしていないWebサーバーから来ています。私は現在、フォークしているので、違いがあるかどうか確認しています。 – pertinky