java Process 流导致的错误

原创 2015年11月19日 00:41:57

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();
        }
    }
}
你会发现会一直 执行。
这是因为流需要接管(是否如此?可以来探讨)。否则会导致内存泄漏。

安全狗导致IIS Worker Process 遇到了一个问题和错误模块 ntdll.dll的解决方法

装过安全狗的,有可能会导致以下几个错误,如果没有安装安全狗就再找一下其它解决方法,出现的症状有以下几种: 1、IIS Worker Process 遇到了一个问题,需要关闭 ...
  • coolwu
  • coolwu
  • 2017年06月24日 17:07
  • 440

java处理Process输入流阻塞问题

多时候,我们需要调用系统命令来做些处理。比如,在程序中ping设备是否能连接,执行数据库的自动备份,以及程序的重启。这时候我们必须要使用Process类来完成这些功能。     一般情况下,我们...

vs错误 cannot process

  • 2013年08月04日 18:03
  • 122B
  • 下载

【转】E: Sub-process /usr/bin/dpkg returned an error code (1)错误解决

在Ubuntu14.04 X64位系统上安装Android Studio,需要安装32位库文件,用于兼容32位的程序。究其原因,如下:    Android项目中的R文件是在编译时自动生成的,一般...

loadrunner性能测试错误:Abnormal termination, caused by mdrv process termination

loadrunner性能测试错误:Abnormal termination, caused by mdrv process termination 原文地址:http://m.oschina.n...

Oracle数据恢复:解决ORA-00600:[4000] ORA-00704: bootstrap process failure错误一例

今天刚好遇到这个问题,不过没有这么严重,我的仅仅是在没有备份的情况下数据文件丢失,数据块还没有坏,呵呵幸运啊!我用的这是通过alter database create datafile as ‘丢失数...

运行QEMU时,出现错误:(process:8559): GLib-WARNING...gmem.c:483: custom memory allocation vtable not support

在Ubuntu上主机上,手动编译安装好QEMU后,运行自己编译的linux4.4内核的zImage镜像,会出现以下错误:root@ubuntu:/home# qemu-system-arm -M ve...

EasyFliow- Process ID错误处理方法大全

一、在访问工作流路径后,常会提示Process ID错误。  首先是错误出现的原因,如下: 1.最初设置网络域与目前运行的设置不符(在安装的时候,有要求输入计算机域名,但是如果计算机没有加入域,则...

一次PEDIY---修改Windows自带的calc.exe (Unable to read memory of debugged process......”错误提示)

标 题: 【原创】一次PEDIY---修改Windows自带的calc.exe 作 者: stalker 时 间: 2008-07-08,11:06:15 链 接: http://bbs.ped...

关于[move_base-2] process has died执行错误的解决方案

在学习ROS By Example volume 1这本书里的8.1.2.2节的导航命令: roslaunch rbx1_bringup fake_turtlebot.launch roslaun...
  • sltorum
  • sltorum
  • 2016年11月14日 19:37
  • 900
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java Process 流导致的错误
举报原因:
原因补充:

(最多只允许输入30个字)