質問するログイン新規登録
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

362閲覧

addShutdownHook 中にLoggerの出力がされなくなる現象

zacky

総合スコア59

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2023/11/01 15:13

0

0

実現したいこと

java実行中にSystem.exit(1)等で終了した際、終了処理を行うためにRuntime.getRuntime().addShutdownHookを予め定義していたのですが、addShutdownHookの中ではjava.util.logging.Loggerの出力が一切されなくなります。

これは一体どういう理由なのでしょうか?
addShutdownHookは終了処理と同時に平行で進むため、Logger用に確保されていたメモリが解放された といった現象なのでしょうか?
また、可能であれば、addShutdownHook中にLoggerを出力できるようにする方法はあるでしょうか?

下記が現象のサンプルコードです。

Java

1package org.example; 2import java.util.logging.Logger; 3 4public class Main { 5 private static final Logger logger = Logger.getLogger(Main.class.getName()); 6 public static void main(String[] args) { 7 logger.info("test"); 8 Runtime.getRuntime().addShutdownHook(new Thread( 9 () -> { 10 try { 11 while (true) { 12 logger.info("logger wait"); 13 System.out.println("print wait"); 14 Thread.sleep(1000); 15 } 16 } catch (Exception e) { 17 logger.info("logger error"); 18 System.out.println("print error"); 19 System.exit(1); 20 } 21 } 22 )); 23 } 24} 25

上記を実行実行すると、下記のような実行結果となります。

11 02, 2023 12:07:18 午前 org.example.Main main 情報: test 11 02, 2023 12:07:18 午前 org.example.Main lambda$main$0 情報: logger wait print wait print wait print wait print wait print wait print wait

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

シャットダウン中なら何があっても不思議では無いというのが前提かと思います。JPCERT にも以下の指摘があります。

FIO14-J. プログラムの終了時には適切なクリーンアップを行う 2012-01

シャットダウン時にはJVMがセンシティブな状態にあるかもしれないので、いくつか注意すべき事項がある。シャットダウンフックは以下の条件を満たすべきである。

処理に時間がかからず簡潔であること
スレッドセーフであること
データアクセス時にはロックを取得し、アクセスが完了したらロックを解放すること
システムのサービスに依存しないこと。サービス自身もシャットダウンするかもしれない(たとえば、ロガーはその他のフックによって終了するかもしれない)

投稿2023/11/01 17:13

jimbe

総合スコア13374

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問