お世話になります。
検証作業中にふと気になったのですが、
Javaで実装したプログラムを稼働させ続けた場合、
どんなに単純なプログラムであってもいつかはそのプロセスは落ちるのでしょうか?
今回試した作業は以下になります。
●実行環境
OS:Windows 10
JDK:Amazon Corretto 8
●プログラム作成
ログを1行出力し、それを無限ループさせるプログラムを作成
Java
1class main{ 2 public static void main(String[] args){ 3 try{ 4 while(true){ 5 System.out.println("testtest"); 6 Thread.sleep(1); 7 } 8 }catch(InterruptedException e){ 9 e.printStackTrace(); 10 } 11 } 12}
●プログラム実行
作成したプログラムを下記コマンドでコマンドプロンプトから実行
java -Xms8m -Xmx8m -Xmn2m main
●実行結果
==OOME発生寸前のログ==(約1時間半は稼働し続けていた) testtest testtest testtest testtest testtest testtest testtest testtest testtestException in thread "RMI TCP Connection(idle)" Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded java.lang.OutOfMemoryError: GC overhead limit exceeded
【今回設定した条件】
①プログラムの繰り返し間隔を極端に短くして実行(1000分の1秒ごと)
②プログラムの実行引数を小さくして実行(-Xms8m -Xmx8m -Xmn2m)
ヒープサイズは小さいですが、一時間半以上稼働していたため、
プログラムの初期実行に必要な容量は割り当てられていると想定しています。
今回は検証のため、上記のような条件で実行しましたが、
妥当な値で実行したとしても長い目で見た場合にメモリの上昇によるOOMEが発生するのではないか?と思っています。
通常稼働させた場合は、何年という単位になるのかもしれませんが、
いつかは落ちるのでしょうか。。?
何かご存じの方いらっしゃいましたら、ご教示いただけますと幸いです。
宜しくお願い致します。
(追記 2019/09/24)
エラー内容がjconsoleに起因することが考えられる為、
jconsoleを使わずに処理を流してOOMEが発生しないかを検証中。
→ jconsoleによる監視を外した結果、RMI TCP Connection Exceptionは出なくなったが、
OutOfMemoryError は再発し、プロセスが落ちてしまった。
(追記 2019/09/26)
java -Xms8m -Xmx8m -Xmn2m -XX:-UseGCOverheadLimit main
オプションを付けて上記で実行しましたが、変わらずOOMEが発生して落ちてしまいました。
エラー内容 Exception in thread "main" Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "main"
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/23 01:16
2019/09/24 01:00
2019/09/26 06:48 編集