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 における重要なカスケード概念の詳細な説明

推薦する

VMware ESXi 6.0 および仮想マシンのインストール チュートリアルの展開 (画像とテキスト)

社内には以前からアイドル状態だった、構成の整ったサーバーがあったので、EXSI 6.0 を使って複数...

MySQL NULLがピットを引き起こした

比較演算子でNULLを使用する mysql> 1>NULLを選択します。 +------...

HTML でランダムロールコーラーを実装するためのサンプルコード

この点呼装置は簡易版であり、自動停止の必要性を考慮していないため、点呼を開始した後、停止ボタンをクリ...

TypeScript におけるインターフェースと型メソッドの正しい使用例

目次序文インタフェースタイプ付録: インターフェースとタイプの違い要約する序文インターフェースとタイ...

postcss-pxtorem モバイル適応の実装

コマンドを実行してプラグインpostcss-pxtoremをインストールします npm インストール...

Vue3.0+vite2は動的非同期コンポーネントの遅延読み込みを実装します

目次Viteプロジェクトを作成するコンポーネントの作成Viteプロジェクトを作成するパフォーマンスが...

CentOS 8 / RHEL 8 に VirtualBox 6.0 をインストールするための詳細なチュートリアル

VirtualBox は、技術者が異なる種類の複数の仮想マシン (VM) を同時に実行できるようにす...

WeChatアプレットはウォーターフォールフローのページングスクロール読み込みを実装します

この記事では、WeChatアプレットのウォーターフォールフローページングスクロールロードを実装するた...

vue ルーティング ビュー router-view のネストされたジャンプの実装

目次1. app.vueページを修正する2. ログインページを作成する (/views/login/...

three.js を使用してクールなアシッドスタイルの 3D ページ効果を実現します

この記事では、主にReact + three.jsテクノロジースタックを使用して3Dモデルの読み込み...

Google Web Fonts でウェブサイトに無制限のフォントを追加

長い間、リソースの制約により、使用できるフォントが限られていたため、Web サイトの開発は妨げられて...

MySQL で日付を保存するためのベスト プラクティス ガイド

目次序文時間型を保存するのに文字列を使用しないでくださいMySQL の日付型日時タイムスタンプTIM...

Web デザインでフラッシュ オーバーレイ ポップアップ レイヤーの z-index プロパティを設定しても機能しない

デフォルトでは、Flash は常にページのトップレベルに表示されます。つまり、ページに DHTML ...

Linux環境でOpenSSL証明書を生成する

1. 環境: CentOS7、OpenSSL1.1.1k。 2. コンセプト:ルート証明書: サーバ...

Filebeat を使用して Nginx ログを収集する方法

Nginx ログは、ユーザーの住所の場所や行動プロファイルなどを分析するために使用できます。Elas...