1.最初に次のコードを見てください
java.io.io.fileinputStream; public class ttt {public static void main(string [] args)throws exception {for(int i = 0; i <10; i ++){final string shoodid = "thread_" + i; swreet = new runnable(){new runnable(){wubling run(){systems.putlint + " = new FileInputStream( "/opt/test.log"); swree.sleep(60 * 1000);} catch(exception ex){ex.printstacktrace();} system.out.println(stopped! ");}}); swrey.start();} sweet. sleep(10 * 60 * 1000);}}}2. Linuxでこのクラスをコンパイルして実行し、Linuxコマンド/USR/SBIN/LSOF -P <PID>を使用して、このプログラムによって開かれたファイル情報を表示します。
$/usr/sbin/lsof -p `ps -ef | Grep Java | grep ttt | awk '{print $ 2}' `| Grep "test.log" Java 21562 fkong 3r Reg 253,0 0 35471424 /opt/test.logjava 21562 fkong 4r reg 253,0 0 35471424 /opt/test.logjava 21562 fkong 21562 fkong 6r Reg 253,0 0 35471424 /opt/test.logjava 21562 fkong 7r reg 253,0 0 35471424 /opt/test.logjava 253,0 0 35471424 /opt/test.logjava 21562 fkong 11r reg 253,0 0 35471424 /opt/test.logjava 21562 fkong 11r reg 253,0 0 35471424 /opt/test.logjava 21562 fkong 1253,0253,0253,0253,03 /opt/test.log10スレッドが実行されている場合でも、LSOFコマンドを使用して表示した結果も同じです。 10個のファイルストリームが閉じられていないことがわかります。
3.以下のこのコードにいくつかの変更を加えました。つまり、スレッドが実行された後、すべてのスレッドが次のようにnullに設定されます。
java.io.fileinputStream; Import java.util.arraylist; Import java.util.list; public static void main(string [] args)throws {list <shood> swreets = new arraylist <shood>(); runnable(){public void run(){system.out.println(threadid + "start!"); try {fileInputStream fis = new fileInputStream( "/opt/test.log"); sweep(60 * 1000);} catch(Exception ex){ex.printstrace( "停止!");}}); shood.start(); threads.add(thread);} shood.sleep(2 * 60 * 1000); for(thread:threads){thread = null;} out.println( "cleanup shoods!"); swree.sleep(10 * 60 * 1000);}};}繰り返しますが、LSOFを使用して10個のスレッドが実行された後に表示され、結果はまだ類似しており、閉じられていない10個のファイルストリームがまだあります。
すべてのスレッドをNULLに設定した後、いくつかの変更を加えました。
java.io.fileinputStream; Import java.util.arraylist; Import java.util.list; public static void main(string [] args)throws {list <shood> swreets = new arraylist <shood>(); runnable(){public void run(){system.out.println(threadid + "start!"); try {fileInputStream fis = new fileInputStream( "/opt/test.log"); sweep(60 * 1000);} catch(Exception ex){ex.printstrace( "停止!");}}); shood.start(); shoods.add(thread);} shood.sleep(2 * 60 * 1000); for(thread = null;} out.println( "cleanup threads!"); system.gc(); system.gc(); system.gc(); system.gc(); gc! "); swree.sleep(10 * 60 * 1000);}}LSOFを使用して再度表示すると、実行中に10のファイルストリームが開いていることがわかりますが、「完成したGC!」の後、10のファイルストリームが閉じられていることがわかります。
最後に、スレッドをnullに設定するステートメントを削除するだけで、実行の結果は上記のGC操作を実行した結果とも一致しています。
最終的に、JVMで開いて閉じていないIOファイルストリームについては、次回のGCを行っているときに使用されなくなったときにすべてをリサイクルしますが、JVMにこれらのことをさせることはまだ良くありません。同じ古いことわざはあなた自身のことをすることです。