java 开发中 Process 流输出导致的 内存泄漏
首先来看个试例:
1.让其程序无限流输出。
public class OutStream {
public static void main(String[] args) {
while (true){
System.out.println("out print");//输出普通流 (InputStream)
System.err.println("err print");//输出错误流 (ErrorStream)
try {
Thread.sleep(50);//让其慢一点 也可以省略
} catch (InterruptedException e) {
}
}
}
}
把上面的程序 弄成bat可以执行文件,jar文件也可以 代码如下:
@echo off
java -cp %上面java文件classes所在地% OutStream &*
我们存为outStream.bat文件。
2.在写一个 执行此文件的方法。
public class OutStreamTest {
public static void main(String[] args) {
// final Path path = Paths.get("C:\\outStream.bat");
String cmd = "cmd /c cd C: && outStream.bat";
try {
final Process process = Runtime.getRuntime().exec(cmd);
final InputStream inputStream = process.getInputStream();
new Thread(()->{
try {
try(BufferedReader br = new BufferedReader(new InputStreamReader(inputStream))){
while (true){
String line = br.readLine();
if(line == null) break;
System.out.println(line);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
这个时候你会发现 打印几秒后就不再打印了。而此时内存会一直增加...导致内存泄漏。
3.在其中加入接收错误流后。
public class OutStreamTest {
public static void main(String[] args) {
// final Path path = Paths.get("C:\\outStream.bat");
String cmd = "cmd /c cd C: && outStream.bat";
try {
final Process process = Runtime.getRuntime().exec(cmd);
final InputStream inputStream = process.getInputStream();
new Thread(()->{
try {
try(BufferedReader br = new BufferedReader(new InputStreamReader(inputStream))){
while (true){
String line = br.readLine();
if(line == null) break;
System.out.println(line);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
final InputStream errorStream = process.getErrorStream();
new Thread(()->{
try {
try(BufferedReader br = new BufferedReader(new InputStreamReader(errorStream))){
while (true){
String line = br.readLine();
if(line == null) break;
System.out.println(line);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
你会发现会一直 执行。
这是因为流需要接管(是否如此?可以来探讨)。否则会导致内存泄漏。