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个流木有关。