2016-11-20 13 views
1

再配置するときにTomcatが.warファイルを再ロードできることは分かっています。Tomcatプロセスを終了して再起動する必要はありません。私は.warを削除し、Tomcatがアンデプロイするのを待って、新しい.warをウェブパスにコピーします。しかし、Tomcatを再起動しなくても、何度も些細なアップデートをした後、Tomcatがメモリを効果的にリリースしたり、パフォーマンス上の問題を引き起こしたりする可能性はありますか? 1つのTomcatインスタンスに1つのwarアプリケーションしかないとします。戦争を再展開するときにTomcatを再起動する必要はありますか?

答えて

2

基本的な問題は、operating system does with processesと同じ方法で、Javaが現在、Java Virtual Machine (JVM)で実行されているコード部分間で何らかの分離を提供していないことです。 Windows/Linux /などの環境下で別のプロセスに影響を与えずにプロセスを強制終了することができます。物事がガベージコレクションされることを保証するだけです。

WARの処理方法は、various specificationsによると、各戦争にはそのコードの実行を担当する独自のクラスローダーが必要です。 WARがデプロイされていない場合、最終的な結果は、そのクラスローダーがガベージコレクションされるべきことです。

残念なことに、garbage collectorは完全に参照されていないオブジェクトのみを処理でき、これを禁止することができるWARコードに存在する微妙なバグが多数存在し、再配置するたびに別のクラスローダーが作成され、あなたはメモリリークを持っています。 Tomcat自体の中でこのような種類のバグを検出して取り組むために多くの努力が払われましたが、JVMサポートなしで100%の権利を行うことは不可能に近づいています。

WARを修正する以外に唯一の措置は、JVMを再起動することです。

生産中でもメモリ使用量をVisualVMで確認すると、Tomcat JVMで何が起こるかを確認できます。

+0

_developing_ a WARは、WARの_deploying_とは​​大きく異なります。手動配置ではなく、ホットデプロイが頻繁に行われるWebコンテナを完全に制御する必要があります。つまり、これは比較的まれに起こるはずです。 –

0

はい。 Tomcatを停止して新しい戦争を展開し、Tomcatを再起動するのはずっときれいです。 1つの欠点は、デフォルトでアプリケーションクラスの多くが新しい要求がアプリケーションにヒットするまでロードされず、大きな問題ではないことです。あなたの新しいWARへの最初のリクエストでスタートアップの数秒を意味します。これが我々が生産に戦争を展開する方法です。

新しい戦争によってTomcatが正常に起動できなくなった場合、我々は戦争をロールバックして問題を知っているが別のトピックである場合に、ログのヘルスチェックを設定することもできます。

ダウンタイムについて

これはあなたの質問の範囲外かもしれませんが、ユーザーがダウンタイムを見られないようにするには、tomcatの複数のインスタンスを実行し、一度に1つずつ展開して再起動します。

関連する問題