日期:2014-05-20  浏览次数:20723 次

java代码内存又泄露...一个while循环的线程...到底哪里内存泄露了
我简单的介绍大致情况下,
因为有需求说要在更改设置后程序还能自动启动,所以做了一个小工具检测工具是否启动,如果没有启动就去启动,有的话就不启动。其实 就是通过一个一直运行的线程,去读取tasklist里面有没有存在该程序名的进程...线程设定了没跑一次睡五秒。从代码上来看,不是很多,但是从占用的内存上来看,自从启动以后,内存的占用就会越来越高,好像java的垃圾回收没有起作用....不晓得是哪里出现内容泄露了。

这个小程序吧也是别人以前写好的,现在关注性能问题了,于是老大把这个问题交给我了,刚参加工作3个月啊让我分析内存泄露,表示小有压力....

下面给出伪代码(公司比较注重信息安全,所以没有源码,就来点伪代码吧):
//线程的run()方法

public void run()
{
  while (true)
  {
  boolean isRun = service.isLMTRun();
   
  if (!isRun)
  {
  service.startLMT();
  }

  Thread.sleeep(5000); //省略异常
  }
 }


public boolean isLMTRun()
{
  BufferedReader br = null;
  String line = null;
   
  try
  {
  Process p = Runtime.getRuntiem()****;//这一段忘记了,反正是获取系统进程

  br = new BufferedReader(new InputStream(p.getInputStream()));
  while ((line = br.readline()) != null)
  {
  if ()
  {
  //逻辑判断代码
  }
  }
  catch (Exception e)
  {
  log.error(e);
  }
  finally
  {
  if (null != br)
  {
  br.close(); //省略异常
  }
  }

  }
   
   
}


大概就是这么一段代码,运行一天后,内存会到60M作用....崩溃啊...很小的程序
我分析了下,不晓得对不对,说出我的想法。
br = new BufferedReader(new InputStream(p.getInputStream()));
对于这句代码是不是会有内存泄露的情况呢?
每次循环都会去创建BufferedReader和InputStream的一个对象,
br每次会关闭资源,但是InputStream的对象是不是就是没有关掉,所以5秒钟一次的循环让程序在运行一段时间会占用很大的内存无法让java虚拟机进行正常的垃圾回收呢?

还是有什么地方会造出内存泄露....请各位大佬赐教

------解决方案--------------------
Runtime.getRuntime().exec(),在jvm中非常消耗资源,能不用尽量别用。


------解决方案--------------------
不是内存泄漏 是分配的内存增长过快导致gc还来不及释放,所以越来越多,所造成的
------解决方案--------------------
先把sleep时间加大,试试内存是不是还会不停地涨?
------解决方案--------------------
可以使用屏蔽代码的方式,看一下是不是正的又内存泄露。

------解决方案--------------------
我认为应该是你产生了很多Process进程而没有被销毁。。。将其销毁试试呢。。。
System.exit(0);或者destory方法销毁
------解决方案--------------------
br = new BufferedReader(new InputStream(p.getInputStream()));
2个流木有关。