Tomcat のメモリ構成の正しい姿勢についての簡単な説明

Tomcat のメモリ構成の正しい姿勢についての簡単な説明

1. 背景

多くのブログや記事を読みましたが、JVM のメモリ割り当て方法に関する包括的な記事は見つかりませんでした。その多くは単なるコピー アンド ペーストです。

厳密さを期すため、この記事では HotSpot VM 仮想マシンと JDK1.7 に基づくメモリ割り当てのみを紹介することに特に留意します。GC に関する説明も、専門家からの批判を避けるために CMS 同時実行コレクション (G1 ではない) に基づいています。

現在主流の JVM は HotSpot VM (J9 VM と Zing VM がそれに続く) であり、ほとんどのブログ投稿は JDK 1.7 より前のバージョンに基づいています。

(注: 仮想マシンの実装や JDK によってメモリの配分が異なるため、以下の記事で説明するメモリ構造は論理構造のみであり、メモリの物理構造ではありません)

この記事はメモリ割り当ての方法のみを紹介します。具体的なガベージコレクションのメカニズムやメモリ構造の原理はこの記事の焦点では​​ありません。また、この記事を通じて、皆さんが JVM について少しでも理解していただければ幸いです。編集者は JVM を徹底的に理解しているわけではなく、他の人を誤解させたくはありません。

2. 全体的なメモリ構造

問題を解決したいだけで、理由を理解したくない場合は、このセクションをスキップしてください。

この記事では、ガベージ コレクションされたメモリ領域 (プログラム カウンタ、スタック、ローカル メソッド スタックを除く GC ヒープと呼ばれる) の構造について、「Java オブジェクトの生涯」という名言を引用しながら紹介します。

私は普通の Java オブジェクトです。エデン地区で生まれました。エデン地区では、私によく似た弟たち (他の Java オブジェクト) も見かけました。私たちはエデン地区で長い間遊んでいました。ある日、エデンエリアの人が多すぎたため(Young GCが発動し、GCごとに年齢が1歳加算される)、サバイバーエリアの「From」エリアに行くことを余儀なくされました。サバイバーエリアに行って以来、私は定まった居住地を持たず、時にはサバイバーの「From」エリア、時にはサバイバーの「To」エリアを漂うようになりました(Young GCごとに、サバイバーエリアのfromエリアとtoエリアを「入れ替える」必要がありました)。私が18歳(18人のヤングGCを経験)になって初めて、父は私に、もう大人で社会に出て行く時期だと言いました。それで私は年上の世代のところに行きました。そこにはたくさんの人がいて、みんなかなり年配でした。私もここでたくさんの人に会いました。旧世代では20年間生き、その後リサイクルされました(旧GC)。

説明すると、まずメモリ全体は、以下のように若い世代(young)、古い世代(old)、永久世代(permanent)に分かれています。

若い世代: (若い世代のガベージ コレクションは Young GC と呼ばれます)

若い世代はエデンエリアとサバイバーエリアに分かれている

1. エデンエリアは新しいObject()が生まれる場所です

2. Survivor 領域は、ガベージ コレクションを生き残ったオブジェクトを格納する領域です。Survivor 領域は、from 領域と to 領域に分かれています。

2.1.from領域: GC回復後、eden領域とto領域にまだ残っているオブジェクトはfrom領域に格納されます。

2.2.to領域: GC回復後、eden領域とfrom領域にまだ残っているオブジェクトはto領域に転送されます。

2.3. 2.1 と 2.2 の操作により、from 領域と to 領域内の残存オブジェクトが相互に転送され、1 つの領域は常に空になります。

旧世代: (旧世代のガベージ コレクションは Old GC と呼ばれます)

18 回の Young GC の後、若い世代にまだ残っているオブジェクトは若い世代から古い世代に転送されます。

古い世代がいっぱいになると、古い GC がトリガーされ、生き残ったオブジェクトは 20 回の古い GC 後にリサイクルされるまで古い世代に残り続けます。

永久世代: (若い世代 + 古い世代 + 永久世代の回復のためのフル GC)

これは、HotSpot VM の Java メソッド領域の実装であり、通常はクラス情報、定数プール、静的変数、JIT コンパイルされたコード、およびその他のデータが格納されます (簡単に言えば、コンパイルされたコードの保存領域です。つまり、Java プロジェクトの実行中にクラス ファイルがロードされるほど、永続的な生成メモリ領域が必要になります)。

(注: 永久世代は Hotspot 仮想マシンに固有の概念であると言われています。他の JVM にはこの機能はありません。Java 8 では、永久世代は完全に削除され、ヒープに接続されていない別のローカル メモリ (メタスペース) に置き換えられました)

3. 一般的な記憶障害の説明

よくある問題 1 java.lang.OutOfMemoryError: Java ヒープ スペース ----JVM ヒープ (ヒープ) オーバーフロー

原因: プロジェクトの実行フェーズで新しいオブジェクトが多すぎるため、構成された最大メモリがいっぱいになり、このエラーが発生します。

解決策: Xms と Xmx のサイズを手動で設定します。

よくある問題 2 java.lang.OutOfMemoryError: PermGen スペース ---- PermGen スペース (永続世代) オーバーフロー

原因: このエラーは、開発されたプロジェクトに多数の Java ファイルがある場合に発生します (つまり、プロジェクトが大きく、JVM によって多数のファイルがロードされる場合)。

解決策: MaxPermSize サイズを手動で設定します。

よくある問題 3 java.lang.StackOverflowError ---- Stack Overflow

理由: 通常、コード ロジックの再帰レベルが多すぎることが原因です。

解決策: 再帰コードを修正し、再帰層の数を制御する

4. メモリ割り当て方法(提案であり、万能薬ではありません)

この記事では、よく使用される構成パラメータのみを紹介します。通常、永続世代はヒープメモリとしてカウントされず(別のメモリを別途占有します)、新しい世代は古い世代の 1/2、つまりヒープメモリ全体の 1/3 を占有します。この原則に従って、構成例を示します。

たとえば、サーバーはプロジェクト用に 1G のメモリを提供できます。上記の図に基づいて、次の構成を示します。

動作モード:

- サーバーモード、複数のCPUを使用する場合のパフォーマンスが向上

新世代と旧世代: (通常、新世代と旧世代は別々に設定されないので、メモリ ヒープ サイズ全体を設定するだけです)

-Xms384m メモリヒープの初期メモリ空間

-Xmx768m メモリヒープの最大メモリスペース

永久世代: (新しい世代、古い世代構成の残りのメモリは永久世代用に予約されます) --- jdk1.8 は削除されていることに注意してください

-XX:PermSize=128m 永久世代の初期化サイズ

-XX:MaxPermSize=256m 永続世代の最大メモリ空間 (デフォルトは 64m)

4. さまざまな環境でのTomcatのメモリ設定方法

ここまで、さまざまなメモリ問題について詳しく説明し、構成パラメータを簡単に紹介してきました。次に、さまざまな環境での具体的な構成方法を紹介します。

1. コマンドラインを使用して Tomcat を起動します。

TOMCAT_HOME/bin/catalina.sh (Windowsではcatalina.bat)を変更し、ファイルの先頭に次の文を追加します。

JAVA_OPTS="-server -Xms384m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m"

2. tomcatがWindowsサービスとして登録されている場合は、tomcatディレクトリの/bin/tomcat8w.exeを使用して変更できます。以下に示すように

3. myeclipse を使用して tomcat を開発および起動している場合、上記の変更は機能しません。次のように設定できます。

Myeclipse->preferences->myeclipse->servers->tomcat->tomcat×.×->JDK パネルのオプションの Java VM 引数に、以下を追加します。

-server -Xms384m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m

最後に、2つの言葉:

どのような設定がされていても、パラメータ値が何であっても、実際のプロジェクトに合わせて継続的にデバッグする必要があり、簡単に諦めてはいけません。

たとえば、Tomcat のメモリ構成は、大きければ大きいほど良いというわけではありません。最適な構成は、プロジェクト/サーバーに適した構成です。

Tomcat メモリの正しい設定方法についての記事はこれで終わりです。Tomcat メモリ設定の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Spring Boot で組み込み Tomcat の maxPostSize 値を設定する方法
  • アイデアで外部Tomcatを使用してSpringbootを構成するための詳細な手順
  • Tomcat で JNDI データ ソースを構成する 3 つの方法
  • Tomcat が設定ファイルを外部に配置するためのソリューション
  • Tomcatユーザー管理の最適化された構成の詳細な説明

<<:  Webデザイナーの成長体験

>>:  CSS における重要なカスケード概念の詳細な説明

推薦する

Linux viコマンドの知識ポイントと使い方のまとめ

Linux viコマンドの詳しい説明vi エディタは、すべての Unix および Linux システ...

MySQL における datetime と timestamp の違いと選択

目次1 違い1.1 スペース占有1.2 表現範囲1.3 タイムゾーン2 テスト3つの選択肢MySQL...

Webフロントエンドの一般的な操作(JS/HTML/CSSなどの知識を含む)

ul liの前のアイコン1をキャンセルしますクリア値1値を1に設定ラベル中央値1をクリアラベルの中央...

イラスト風ウェブサイトホームページデザイン ウェブサイトデザインの新トレンド

視覚効果が非常に美しく、訪問者に強い印象を残すことがわかります。さらに、重要なポイントが強調され、訴...

openlayers6 マップオーバーレイの一般的な 3 つの用途 (ポップアップウィンドウマーカーテキスト)

目次1. 前に書く2. ポップアップウィンドウを実装するためのオーバーレイ2.1 vueページのad...

MySQLのUPDATE文の落とし穴を記録する

背景最近、オンライン操作中に DML ステートメントを実行しました。これは絶対確実だと思っていました...

CSS で要素フローティングとクリアフローティングを実装する方法

フローティングの基礎標準ドキュメント フローでは、要素は塊級元素と行內元素の 2 種類に分けられます...

テキスト ファイルの並べ替えに役立つ Awk コマンドラインまたはスクリプト (推奨)

Awk は、ソートを含む他の一般的なユーティリティによって実行できるいくつかのタスクを実行できる強...

Linuxで新しいユーザーを作成し、指定されたディレクトリへの権限を付与する

1 ユーザーを作成し、ユーザーのルートパスとパスワードを指定します useradd -d /home...

DockerとVMwareの競合を解決する

1. Dockerの起動の問題:問題は解決しました: Hyper-V をオンにする必要があります (...

react-virtualized を使用して、動的な高さを持つ画像の長いリストを実装する

目次開発中に発生した問題解決具体的な実装実績まとめバーチャルリストは、スクロールコンテナ要素の表示領...

CSS ピックアップ矢印、カタログ、アイコン実装コード

1. CSS その他のアイコンアイコンを作成するには 3 つの方法があります。写真css (小さな矢...

ページ内のリストプルダウン効果を実現するための純粋なCSS

次のような効果がよく見られます。 そうです、ページ上でよく使われる「展開と折りたたみ」のインタラクシ...

CentOS 7.5 に Python 3.6.6 を最初からインストールするための詳細なチュートリアル

ps: 環境はタイトル通りです依存関係をインストールする yum インストール openssl-de...

Tomcat のパフォーマンス最適化方法の簡単な概要

Tomcat自体の最適化Tomcat メモリ最適化起動時に大きなメモリ ブロックが必要であることを ...