2012-02-09 6 views
8

私のアプリケーションが実行中とそのステータスの間に生成するスレッドに関する質問があります。これらのデフォルトスレッドはすべて実行中であるべきですか?そして彼らは私のJVMを生き続けるのですか?

私はSwingアプリケーションを持っており、いくつかのテストシナリオでは、Java VisualVMを使用していくつかの奇妙な動作に気付きました。私のプログラムを何もしないで30分以上走らせると(ちょうど始めて走っていて)次のことに気付きました。

まず、スレッドタブでは、多くの生きているスレッドが見えます。 Situation of my application after 30mins or so of not doing anything

(とりわけ)読書 Default threads like, DestroyJavaVM, Reference Handler, Signal DispatcherWhat are these threads which are spwaned when a Java application begins its execution?私はそこには非常に良い理由を持っているこれらのスレッドのほとんどを理解しています。 (私はまだ "RMI TCP"のものを理解しようとしています)
しかし、彼らの状態は疑問です。彼らの最初の6人が100%のランニング状態にあったのは普通ですか?

また、これらのスレッドのいずれかがヒープ消費量を次のように説明できますか? Heap consumption of my application doing nothing, over 30+ mins

私は*。のHashMap $エントリとTreeMapの$エントリのインスタンスの多くがsun.rmiというから発信ライブラリで参照され、作成されていることに気づいたと私はそれが「RMI TCP」のスレッドに関連すると考えていました。.. 。

最後に、メインJFrameを破棄しようとすると、フレーム自体が表示されなくなりますが、アプリケーションはまだ実行されています....これらのスレッドが理由(またはその一部) ??

ありがとうございます。

答えて

8

私はまだこれらのスレッドは、RMI経由でJMX接続を受け入れ、処理するために使用されている「RMI TCP」もの

を把握しようとしています。あなたはJVisualVMを見ているときに今を使っています。ワーカースレッド名であなたのIPを気付いたことがありますか?

しかし、彼らの状態は疑問があります。彼らの最初の6人が100%のランニング状態にあったのは普通ですか?

スレッドが実行可能であるからといってそれがを実行し、CPU時間を消費しているという意味ではありません。 Thread.State引用:

  • NEW - まだ開始されていないスレッドがこの状態にあります。

  • RUNNABLE - Java仮想マシンで実行中のスレッドはこの状態です。

  • ブロック - モニタロックを待機しているブロックがこの状態です。

  • WAITING - 特定のアクションを実行するために別のスレッドが無期限に待機しているスレッドはこの状態です。

  • TIMED_WAITING - 指定された待機時間まで別のスレッドがアクションを実行するのを待機しているスレッドはこの状態です。

  • 終了しました - 終了したスレッドはこの状態です。

あなたは、ソケットのようなI/Oを待っについては言及していない、このリストを見ることができるように。このタスクを実行するスレッドは、実行可能ファイルとしてまだマークされています。明らかにデータを待ってもCPUを消費しません。また、スレッド受付接続は実行可能ですが、何もしません。クライアントが新しい接続を確立しようとすると、それが認識されます。

また、これらのスレッドのいずれかがヒープ消費量を次のように説明できますか?

ヒープ消費量は正常で健康です。鋸歯形状は不要なオブジェクトを除去するガベージコレクションによって発生します。 JVMはまた、ヒープ消費量がかなり一定であることを理解していますので、それほど必要ではないと思うので最大ヒープサイズを減らし続けます(オレンジのグラフ)。

最後に、メインJFrameを破棄しようとすると、フレーム自体が表示されなくなりますが、アプリケーションはまだ実行されています....これらのスレッドが理由(またはその一部) )??

アプリケーション全体ではなく、JFrameのみを閉じるためです。 Swing EDT(event dispatching thread)はまだ動作しています。しかし、これはそれとは関係ありません。あなたのメインフレームには、

jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

を使用してください。

TL、スレッドとメモリ消費量を考慮した場合DR

アプリケーションは、完全に罰金です。心配しないでください!

はよく組織の答えにも

+2

1を参照してください! JFrameについては、私はEXIT_ON_CLOSEを使うことができると知っていますが、より大きなフレームワークによってアプリケーションcoulbが呼び出され、EXIT_ON_CLOSEだけを使用すると、JVMインスタンス全体が強制終了されます。最後の表示可能なフレームのdispose()は、アプリケーションをとにかく終了させるはずです。 – mdm

+0

@mdm:私はSwingのエキスパートではありませんが、['Window.dispose()'](http://docs.oracle.com/javase/7/docs/api/java/awt/Window.html#dispose ()):*注意:Java仮想マシン(VM)内の最後の表示可能なウィンドウが破棄されると、VMが終了することがあります。* –

+1

この回答のアドバイスは素晴らしいですが、私はうそをつくつもりはありません - あなたはTL; DR ;-)を使用しているため純粋に+1に投票しました –

関連する問題