1. Pertama lihat kode berikut
impor java.io.fileInputStream; kelas publik ttt {public static void main (string [] args) melempar pengecualian {for (int i = 0; i <10; i ++) {string final threadid = "thread_" + thread thread = thread baru (runnable new runnable () {public void run () {system.out.out. fis = FileInputStream baru ("/opt/test.log"); thread.sleep (60 * 1000);} catch (Exception ex) {ex.printStackTrace ();} System.out.println (threadId + "Stop!");}); thread.start ();} thread -thread (10 * * 60 * 60 *};}};}};2. Kompilasi dan jalankan kelas ini di Linux, dan kemudian gunakan perintah Linux/usr/sbin/lsof -p <pid> untuk melihat informasi file yang dibuka oleh program ini.
$/usr/sbin/lsof -p` ps -ef | Grep Java | grep ttt | awk '{cetak $ 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 5R 253.02444444444442442442442444444444444444424444444444444444444 21562 fkong 6r reg 253,0 0 35471424 /opt/test.logjava 21562 fkong 7r reg 253,0 0 35471424 /opt/test.logjava 21562 fkong 8r reg 253,0 0 354714424 /opkon.142 253,0 0 35471424 /opt/test.logjava 21562 fkong 11r Reg 253,0 0 35471424 /opt/test.logjava 21562 fkong 11r Reg 253,0 12raG2222424 /opt/test.logja4, 12rjava, 12rjava, 12rjava, /opt/test.logApakah itu selama atau setelah 10 utas berjalan, hasil menonton menggunakan perintah LSOF adalah sama. Anda dapat melihat bahwa 10 aliran file tidak ditutup.
3. Saya telah membuat beberapa perubahan pada kode ini di bawah ini, yaitu, setelah utas dieksekusi, semua utas diatur ke nol, sebagai berikut
import java.io.FileInputStream;import java.util.ArrayList;import java.util.List;public class TTT {public static void main(String[] args) throws Exception {List<Thread> threads = new ArrayList<Thread>();for (int i = 0; i < 10; i++) {final String threadId = "thread_" + i;Thread thread = new Thread(new Runnable () {public void run () {System.out.println (threadId + "dimulai!"); Coba {fileInputStream fis = new fileInputStream ("/opt/test.log"); thread.sleep (60 * 1000);} catch (pengecualian ex) {ex.printstack ();} {ex ex.printstack (); "Berhenti!");}}); thread.start (); threads.add (thread);} thread.sleep (2 * 60 * 1000); untuk (thread thread: thread) {thread = null;} system.out.println ("Bersihkan utas!"); thread.sleep (10 * 60 * 1000);}} Sekali lagi, gunakan LSOF untuk dilihat selama dan setelah 10 utas dijalankan, dan hasilnya masih serupa, dan masih ada 10 aliran file yang tidak ditutup.
Saya membuat beberapa perubahan lagi, setelah mengatur semua utas ke null, menambahkan (atau mendesak JVM) untuk melakukan beberapa operasi GC, sebagai berikut:
import java.io.FileInputStream;import java.util.ArrayList;import java.util.List;public class TTT {public static void main(String[] args) throws Exception {List<Thread> threads = new ArrayList<Thread>();for (int i = 0; i < 10; i++) {final String threadId = "thread_" + i;Thread thread = new Thread(new Runnable () {public void run () {System.out.println (threadId + "dimulai!"); Coba {fileInputStream fis = new fileInputStream ("/opt/test.log"); thread.sleep (60 * 1000);} catch (pengecualian ex) {ex.printstack ();} {ex ex.printstack (); "Berhenti!");}}); thread.start (); threads.add (thread);} thread.sleep (2 * 60 * 1000); untuk (thread thread: thread) {thread = null;} System.out.println ("Bersihkan Threads!"); System.gc (); System.out.gc (); Gc! "); Thread.sleep (10 * 60 * 1000);}}Gunakan LSOF untuk dilihat lagi, dan Anda masih dapat melihat bahwa 10 aliran file terbuka selama berjalan, tetapi setelah "GC selesai!", Hasilnya adalah bahwa 10 aliran file ditutup.
Akhirnya, saya hanya menghapus pernyataan yang mengatur utas ke nol, dan hasil menjalankan juga konsisten dengan hasil melakukan operasi GC di atas.
Pada akhirnya, untuk aliran file IO yang terbuka dan tidak tertutup di JVM akan mendaur ulang semuanya ketika mereka tidak lagi digunakan ketika mereka melakukan GC penuh lain kali, tetapi masih tidak baik untuk membiarkan JVM melakukan hal -hal ini. Pepatah lama yang sama adalah melakukan hal -hal Anda sendiri.