java Process 流导致的错误
来源:互联网 发布:ipad专业视频剪辑软件 编辑:程序博客网 时间:2024/06/08 06:09
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(); } }}
你会发现会一直 执行。
这是因为流需要接管(是否如此?可以来探讨)。否则会导致内存泄漏。
1 0
- java Process 流导致的错误
- 自作聪明导致的一个Java编码错误
- 调用Process.waitfor导致的进程挂起
- 调用Process.waitfor导致的进程挂起
- locale错误导致Java中文乱码错误的总结
- 安全狗导致IIS Worker Process 遇到了一个问题和错误模块 ntdll.dll的解决方法
- XIB 导致的错误
- strlen导致的错误
- &导致的错误
- 导错包导致的错误
- Java Process的问题
- java process的waitfor()
- java Process的waitFor()
- Java Process 的 waitFor()
- java Process的waitFor()
- java Process的waitFor()
- Java的package语法功能导致的执行错误
- java连接FTPSERVER导致的错误处理方法
- 什么叫做Oracle RAC中的nodename
- 排错-Loadrunner录制打不开浏览器解决办法
- opengl绘制一个机器人手臂的一些问题
- 移动端开发学习1:viewport
- Android测试教程2--简单小测试
- java Process 流导致的错误
- LeetCode21:Merge Two Sorted Lists
- 只是想改变
- Android Pdf 方案
- 八数码3
- SQL Server中角色与权限管理
- centos下的apache2.4.6虚拟主机设置
- 浅谈 LLDB 调试器 - 如果这叫浅谈,那深得到啥样了呢!
- Java String是不可变的(immutable)