java代码内存又泄露...一个while循环的线程...到底哪里内存泄露了

csdpz 2011-11-08 11:12:05
我简单的介绍大致情况下,
因为有需求说要在更改设置后程序还能自动启动,所以做了一个小工具检测工具是否启动,如果没有启动就去启动,有的话就不启动。其实 就是通过一个一直运行的线程,去读取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虚拟机进行正常的垃圾回收呢?

还是有什么地方会造出内存泄露....请各位大佬赐教
...全文
368 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
csdpz 2011-11-26
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 kouyisc 的回复:]
我认为应该是你产生了很多Process进程而没有被销毁。。。将其销毁试试呢。。。
System.exit(0);或者destory方法销毁
[/Quote]
destroy....嗯,也许是的
csdpz 2011-11-26
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 chenliuyang 的回复:]
br = new BufferedReader(new InputStream(p.getInputStream()));
2个流木有关。
[/Quote]
关了大的缓冲流,里面的两个被包含的流也同样会被关闭的吧???
好像以前看到是这么说的.....
也许我记错了...
csdpz 2011-11-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 houxian 的回复:]
可以使用屏蔽代码的方式,看一下是不是正的又内存泄露。
[/Quote]
这个挺好,明天去试试
huan89517 2011-11-26
  • 打赏
  • 举报
回复
br = new BufferedReader(new InputStream(p.getInputStream()));
while ((line = br.readline()) != null)
{
很想知道你这段代码做了神马操作
是不是这里内存溢出的?
{
HOUXIAN 2011-11-21
  • 打赏
  • 举报
回复
可以使用屏蔽代码的方式,看一下是不是正的又内存泄露。
追风筝的孩子 2011-11-21
  • 打赏
  • 举报
回复
我觉得可能是每次需要重新启动的程序有问题。。。每次更改之后没释放资源。。。然后又重新启动。
chenliuyang 2011-11-21
  • 打赏
  • 举报
回复
br = new BufferedReader(new InputStream(p.getInputStream()));
2个流木有关。
kouyiSC 2011-11-21
  • 打赏
  • 举报
回复
我认为应该是你产生了很多Process进程而没有被销毁。。。将其销毁试试呢。。。
System.exit(0);或者destory方法销毁
csdpz 2011-11-20
  • 打赏
  • 举报
回复
求help................不行啊
csdpz 2011-11-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 gukuitian 的回复:]
先把sleep时间加大,试试内存是不是还会不停地涨?
[/Quote]
这个,试了下,内存还是会涨...
成一粒 2011-11-09
  • 打赏
  • 举报
回复
好像有个方法可以手动启用gc么?记不太清
csdpz 2011-11-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dengxu11 的回复:]
不是内存泄漏 是分配的内存增长过快导致gc还来不及释放,所以越来越多,所造成的
[/Quote]
大概可能也许是吧- -
csdpz 2011-11-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 goldenfish1919 的回复:]
Runtime.getRuntime().exec(),在jvm中非常消耗资源,能不用尽量别用。
[/Quote]
如果不用这个,不晓得怎么去获取当前系统中的进程名字啊....有没有什么好的方法占资源少的?
gukuitian 2011-11-09
  • 打赏
  • 举报
回复
先把sleep时间加大,试试内存是不是还会不停地涨?
旭子 2011-11-09
  • 打赏
  • 举报
回复
不是内存泄漏 是分配的内存增长过快导致gc还来不及释放,所以越来越多,所造成的
若鱼1919 2011-11-09
  • 打赏
  • 举报
回复
Runtime.getRuntime().exec(),在jvm中非常消耗资源,能不用尽量别用。

50,523

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧