1. Primero mire el siguiente código
import java.io.fileInputStream; public class ttt {public static void main (string [] args) lanza excepción {for (int i = 0; i <10; i ++) {string final thread_ "thread_" + i; hilo hilt = new thread (new runnable () {public void run () {system.printLn (thread + "inició!"); = new FileInputStream ("/opt/test.log"); thread.sleep (60 * 1000);} Catch (excepción ex) {ex.printstackTrace ();} system.out.println (threadid + "detenido!");}}); thread.start ();} thread.sleep (10 * 60 * 1000);}}}}}}}2. Compile y ejecute esta clase en Linux, y luego use el comando Linux/USR/SBIN/LSOF -P <Pid> para ver la información del archivo abierto por este programa.
$/usr/sbin/lsof -p `ps -ef | Grep Java | Grep ttt | Awk '{imprimir $ 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 Reg 253,0 0 35471424 /opt 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 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 11r REG 253,0 0 35471424 /opt/test.logjava 21562 fkong 12r REG 253,0 0 35471424 /opt/test.logYa sea durante o después de 10 hilos en ejecución, los resultados de visualización utilizando el comando LSOF son los mismos. Puede ver que 10 transmisiones de archivos no están cerradas.
3. He realizado algunos cambios en este código a continuación, es decir, después de ejecutar el hilo, todos los hilos están configurados en NULL, de la siguiente manera
import java.io.fileInputStream; import java.util.arrayList; import java.util.list; public class ttt {public static void main (string [] args) lanza la excepción {list <hift> hilts = new ArrayList <Shift> (); for (int i = 0; i <10; i ++) {Final String »" Thread_ "THUEST ItHEST; Runnable () {public void run () {System.out.println (threadid + "iniciado!"); Intente {fileInputStream fis = new FileInputStream ("/Opt/test.Log"); Thread.SeLep (60 * 1000);} Catch (Exception ex) {ex.PrintStackTrace ();} System.out.println (Threadid + "¡Detenido!");}}); thread.start (); hiltd (hilo);} hilt.sleep (2 * 60 * 1000); for (hilo hiled Nuevamente, use LSOF para ver durante y después de que se ejecutan los 10 hilos, y los resultados aún son similares, y todavía hay 10 flujos de archivos que no están cerrados.
Hice algunos cambios nuevamente, después de configurar todos los hilos en NULL, agregar (o instar al JVM) a hacer algunas operaciones GC, de la siguiente manera:
import java.io.fileInputStream; import java.util.arrayList; import java.util.list; public class ttt {public static void main (string [] args) lanza la excepción {list <hift> hilts = new ArrayList <Shift> (); for (int i = 0; i <10; i ++) {Final String »" Thread_ "THUEST ItHEST; Runnable () {public void run () {System.out.println (threadid + "iniciado!"); Intente {fileInputStream fis = new FileInputStream ("/Opt/test.Log"); Thread.SeLep (60 * 1000);} Catch (Exception ex) {ex.PrintStackTrace ();} System.out.println (Threadid + "¡Detenido!");}}); thread.start (); hilo.add (hilo);} thread.sleep (2 * 60 * 1000); for (hilo de hilo: hilos) {thread = null;} system.out.println ("limpie los hilos!"); system.gc (); system.gc (); system.gc (); system.println (") Gc! "); Hilo.sleep (10 * 60 * 1000);}}Use LSOF para ver nuevamente, y aún puede ver que las 10 transmisiones de archivos están abiertas durante la ejecución, pero después de "final de GC!", El resultado es que las 10 transmisiones de archivos están cerradas.
Finalmente, simplemente eliminé las declaraciones que establecen el hilo en nulo, y los resultados de la ejecución también son consistentes con los resultados de la realización de operaciones de GC anteriores.
Al final, para esas transmisiones de archivos IO que están abiertas y no cerradas en el JVM los reciclarán todos cuando ya no se usan cuando están haciendo GC completo la próxima vez, pero aún no es bueno dejar que el JVM haga estas cosas. El mismo dicho de siempre es hacer tus propias cosas.