2017-12-11 45 views
-1

Thread.sleep(long)が内部にある場合、Runnableはメモリリークを生成できますか?Thread.sleep(long)が内部にある場合、Runnableはメモリリークを生成できますか?

実行可能ファイルをrunnableの内部に置くと、危険がありますか?

+0

ここでも同じ問題が議論されています。https://stackoverflow.com/questions/8914735/java-thread-sleep-leaking-threads –

+0

短い答えは「はい」です - スレッドは '新しい'追加のオブジェクトに続けて 'Thread .sleep() 'をループで実行します。あなたのコードを投稿すると、コミュニティがより良い助けになるかもしれません。 – Ryan

答えて

-1

あなたの質問に直接答えることはできません。run()の実行可能ファイル内で呼び出されると、Thread.sleepだけではメモリリークが発生しません。 A メモリリークは、実行中のコードから参照されていないオブジェクトがヒープメモリ内に存在する場合に発生します。だから、Thread.sleepは参照リークオブジェクトを作成していないので、メモリリークが発生しにくい。

2番目の質問に答えるには、またNOです。私は、Runnableは一般的に別のものと見なすことができないと言うべきである。Thread、ランナブルはrun()メソッドを持つ単純なinterfaceである。別のスレッドで実行するにはRunnableThreadまたはThread Poolに提出することができます。その場合でも、別のThreadからのnew Threadの作成と起動だけではメモリリークは発生しません。

+0

私はこれに同意しません。あなたが提示したように、Runnableインターフェイスは簡単ではありません。私はRunnableを持つ他のプログラムでメモリリークの問題があることを知ったので、Runnable本体から外部フィールドへの基本呼び出しでメモリリークを作成する必要があります。非同期runnableとnever whileループの例で、Thread.sleep(long)による遅延を伴って実行可能な外部のフィールドを呼び出しているとします。この状況では、ガベージコレクタが正常に動作するとは思わない。すべてが「特別」であれば、実行可能ファイルをキャンセルすることが重要です。 –

+0

実際には、GCはそのシナリオでは何もクリーンアップすべきではありません。 GCは、実行中のコードで参照されていないメモリをクリーンアップすることになっています。私はあなたが "何がJavaメモリリーク" [1]を読む必要があると思います。 引数 '' 'Runnable'''は単純であるかどうかは分かりませんが、自分でソースを読むことができます。ここにJavaソースがあります [1] https://plumbr.io/blog/memory -leaks/what-is-a-memory-leak [2] http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Runnable .java – Sudheera

関連する問題