Tomcat メモリ オーバーフロー問題の解決経験

Tomcat メモリ オーバーフロー問題の解決経験

少し前に、製品バージョンをテスト用にテスターに​​提出したのですが、テスト結果はまったく予想外のものでした。

しばらくテストしていると、ページが固まってしまいました。この現象から、データベース層で固まっているのではないかと無意識に疑いました。そこで、データベース接続に関するパラメータを確認しました。予想通り、接続数が多すぎました!データベース接続数の問題を解決し、バグは解決したと思ったのですが…

しばらくテストした後、ページが再び停止しました。 ! !

タスク マネージャーを開くと、Tomcat のメモリが 1.5G を超えており、Tomcat をシャットダウンできないことがわかりました。原因は何ですか?考えてみると、Tomcat のメモリ増加の原因になりそうな点、つまりマルチスレッドを思いつきました。そこで、スレッド プールの構成のコードを調べましたが、特に怪しい点は見つかりませんでした。

それでは、まずはTomcatをシャットダウンできない問題を解決しましょう。Baiduはコードをチェックし、数十分後に発見しました。Tomcatリスナーの破棄メソッド(contextDestroyed)でスレッドプールが閉じられていなかったのです。この場合、スレッドプールを閉じることができないため、Tomcatをシャットダウンできません。

コードを次のように変更します。

パブリッククラスInitListenerはServletContextListenerを実装します{
  プライベート Logger logger = Logger.getLogger(InitListener.class);
  @オーバーライド
  パブリック void contextInitialized(ServletContextEvent sce) {
    logger.info("Tomcatを起動します");
  }
  @オーバーライド
  パブリック void contextDestroyed(ServletContextEvent sce) {
    logger.info("Tomcat を閉じ、スレッド プールを閉じます");
    ClassPathXmlApplicationContext クラスパスXmlApplicationContext = 新しい ClassPathXmlApplicationContext("classpath*:applicationContext.xml");
    ThreadPoolTask​​Executor myTaskExecutor = (ThreadPoolTask​​Executor) classPathXmlApplicationContext.getBean("myTaskExecutor");
    タスクをシャットダウンします。
  }
}

さて、Tomcat がシャットダウンできない問題は解決しました。

次に、メモリ オーバーフローの問題を解決します (まずログを参照してください)。

tomcat ログを確認すると、バックグラウンド インターフェイスの Spring 構成ファイルは、ページが呼び出すたびに初期化されることがわかりました。つまり、Spring は要求されるたびに Bean を再挿入し、占有されているメモリはリサイクルされません。

そこで、Spring構成ファイルがいつ初期化されるのか疑問に思いました。Tomcatが起動したとき、キーワードnewが使用されたとき、つまり、

ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("classpath*:applicationContext.xml");

それから、コードをグローバルに検索したところ、案の定、フィルターで見つかりました。インターフェースが出現するたびに、新しいオブジェクトが作成されます。なんてひどいコードでしょう。私は、そのとき自分が考えていたことを心の中で呪い続けました。私はこの経験を警告として受け止め、今後は同じような間違いを繰り返さないように自分自身に言い聞かせるために書き留めておきます。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Linux で Tomcat メモリ オーバーフローの問題を解決する方法
  • Tomcat メモリオーバーフローの完璧な解決策
  • TOMCAT メモリオーバーフローとサイズ調整の実装方法
  • JSP ページによって発生する Tomcat メモリ オーバーフローの解決策
  • Tomcat6.0/7.0インストール版メモリオーバーフロー設定方法
  • Tomcat メモリオーバーフローの分析と解決

<<:  MySQL 5.7 の sql_mode のデフォルト値によって生じる落とし穴と解決策

>>:  JavaScript Alert関数の実行順序の詳細な説明

推薦する

Angular構造ディレクティブモジュールとスタイルの詳細な説明

目次1. 構造指示モジュールforRoot()を書く3. スタイルの定義ドラッグ時の順序を調整するに...

Docker と Intellij IDEA の融合により、Java 開発の生産性が 10 倍向上

目次1. 開発前の準備2. 新しいプロジェクトIdea は Java 開発のための強力なツールであり...

Dockerfile をベースに Zabbix 監視システムのコード例を作成する

forループを使用してZabbixイメージをコンテナにインポートします。 n を `ls *.tar...

2 級コンピュータ試験のための MySQL の知識ポイントとよく使用される MYSQL コマンド

2級コンピュータ試験のMySQL知識ポイントの基礎、一般的なMYSQLコマンドは次のとおりです。よく...

DockerでLNMPアーキテクチャを展開する方法

環境要件: IPホスト名192.168.1.1ノード1プロジェクト計画:コンテナネットワークセグメン...

Vue での mixin の応用について議論する

Mixin は、再利用可能な機能を Vue コンポーネント間で分散する非常に柔軟な方法を提供します。...

MySQL のファントムリード問題を解決する方法

目次序文1. ファントムリーディングとは何ですか? 2. ファントムリーディングの問題点は何ですか?...

Vueプロジェクトでよく使われる実践的なスキルのまとめ

目次序文1. マルチレベルのデータとイベントの配信には$attrsと$listenersを使用する2...

vuex で履歴を実装するためのサンプルコード

私は最近、ユーザー操作を元に戻す、またはやり直す機能を備えたビジュアル操作プラットフォームを開発して...

歴史的な Linux 画像処理および修復ソリューション

従来の Linux イメージで作成された ECS クラウド サーバーには、NTP と YUM が設定...

最新の超詳細な VMware 仮想マシンのダウンロードとインストールのグラフィック チュートリアル

目次1. 仮想マシンをダウンロードする2. 仮想マシンのインストールVMware のダウンロードとイ...

MySQL 外部キー制約の例の説明

MySQL の外部キー制約は、2 つのテーブル間のリンクを確立するために使用されます。 1 つのテー...

MySQL コマンドを使用してインデックスを作成、削除、およびクエリする方法の紹介

MySQL データベース テーブルでは、インデックスを作成、表示、再構築、削除できるため、クエリ速度...

CocosCreatorメッセージ配信メカニズムの詳細な説明

概要この記事は、ゲームビジネスアーキテクチャに関連するコンテンツの紹介から始まります。ゲームビジネス...

iframe テクニックを使用して訪問者 QQ 実装のアイデアとサンプル コードを取得する

今日、仕事中に、一時的に追加した友人から、Web ページを使用して訪問者の QQ を取得する方法を尋...