【问题标题】:Detecting memory leak in Java thread检测Java线程中的内存泄漏
【发布时间】:2015-11-17 17:59:28
【问题描述】:

我正在开发一个可运行的文件,它从系统流中读取输入并分析传入的字符串,该程序运行了几天然后停止运行,我猜这可能是由于我的内存泄漏线程,但我似乎找不到它,任何人都可以建议我的代码是否有问题。

@Override
public void run() {
    BufferedReader bufReader = new BufferedReader(new InputStreamReader(System.in));
    while (true) {
        try {
            String inputStr;
            if ((inputStr = bufReader.readLine()) != null) {
                //do something
            } else {
                break;
            }
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

【问题讨论】:

  • 你能解释一下关于停止工作的更多信息吗?
  • “停止工作”是什么意思?
  • 它不再阻止IP
  • 程序“停止工作”时,您确定线程仍在运行吗?你如何提供标准输入?来自用户交互输入,还是批量重定向?我怀疑标准输入的 EOF 会导致程序在您的代码中执行 break,从而结束线程。
  • 好点,我正在使用fail -f -n 0 system.log | java -jar program.jar 提供输入,哦,天哪,我觉得我很盲目,你是对的。

标签: java multithreading memory-leaks runnable


【解决方案1】:

如果标准输入是通过批量重定向提供的,EOF 将导致程序执行break,退出while 循环并因此结束线程。

【讨论】:

    【解决方案2】:

    把bufReader改成这个

    InputStreamReader iSR = new InputStreamReader(System.in);
    BufferedReader bufReader = new BufferedReader(iSR);
    

    然后像这样关闭它们:

    bufReader.close();
    iSR.close();
    

    注意:它的答案与您的内存泄漏问题(如果存在)相关。

    【讨论】:

      猜你喜欢
      • 2016-12-09
      • 2012-02-17
      • 2012-07-16
      • 2021-09-01
      • 2015-05-20
      • 2011-10-08
      • 2020-02-14
      • 1970-01-01
      相关资源
      最近更新 更多