【问题标题】:Can Runnable generate an memory leak when there is Thread.sleep(long) inside?当里面有Thread.sleep(long)时,Runnable会产生内存泄漏吗?
【发布时间】:2018-05-25 09:30:42
【问题描述】:

当里面有Thread.sleep(long)时,Runnable会产生内存泄漏吗?

如果我将runnable放在runnable里面,会有什么风险吗?

【问题讨论】:

  • 这里也讨论了同样的问题stackoverflow.com/questions/8914735/…
  • 简短的回答是肯定的——一个线程可以继续new附加对象,然后在循环中调用Thread.sleep()。如果您发布代码,社区可能会提供更好的帮助。

标签: java multithreading memory runnable


【解决方案1】:

直接回答您的问题是否定的,Thread.sleep 在可运行的 run() 中调用时不会产生任何内存泄漏。 内存泄漏是在堆内存中存在一个未被任何运行代码引用的对象时发生的。所以Thread.sleep 没有创建任何引用泄漏的对象,因此不易发生内存泄漏。

回答你的第二个问题;也是NO。我应该说Runnable 通常不能被视为单独的Thread,Runnable 是一个简单的interface,它有一个run() 方法。 Runnable 可以提交给ThreadThread Pool,以便在单独的线程中执行。即使在这种情况下,单独从另一个 Thread 创建和启动 new Thread 也不会造成任何内存泄漏。

【讨论】:

  • 我不同意这一点。可运行界面并不像您介绍的那么简单。我在使用 Runnable 的其他程序中看到了一些内存泄漏问题,因此必须有可能通过从 Runnable 主体到外部字段的基本调用来创建内存泄漏。试想一个异步可运行且永不结束的 while 循环的示例,该循环正在调用可运行之外的字段,并由 Thread.sleep(long) 延迟一些。我认为垃圾收集器在这种情况下不会正常工作。如果所有“特殊”都完成了,取消可运行是很重要的。
  • 实际上,GC 不应该在那种情况下清理任何东西。 GC 应该清理运行代码未引用的内存。我认为您需要阅读“什么是 java 内存泄漏”[1]。对于 Runnable 的论点是否简单,您可以自己阅读源代码并找出答案。这是 java 源代码 [1] plumbr.io/blog/memory-leaks/what-is-a-memory-leak [2] grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多