- 締切済み
CPUの使用率が高くなる事象について
こんにちわ。業務で行き詰ってしまい、アドバイスをいただきたく質問させていただきます。 稚拙な文章ですがご容赦くださいますようお願いいたします。 ★プログラム構造 アプリケーションのメイン画面にテキストフィールドが配置されていて、 そのフィールドが空白の状態でエンターキーを押下するとポップアップでエラーを表示する。 エラーの表示は、JOptionPaneを継承したクラス内で、JDialogで表示している。 ただし、JDialogのタイトルバー上で右クリックをするとメニューバーが表示されてしまう。 この現象に対して、タイトルバーの部分をペイントすることにより、右クリックを防止しました。 ポップアップは移動できるため、マルチスレッド処理にし常にリペイントがかかるように製造。 ★不具合 ところが運用にて、1ヶ月程度たつとメイン画面の動作が非常に遅いとのクレームが来たので CPU使用率を調べてみたところ80%~90%ぐらいまで上昇していた。 画面上のオペレーションは、何もしてないのに80~90%から減少することはありませんでした。 メモリの使用率は大して使用しておりませんでした。 また発生するマシンはCPUが低スペックのもので発生しています。 メイン画面を再起動(JMの再起動)をすると現象が解消されるため、本アプリが原因と断定しました。 ところが、何が原因なのかがわかりません。 スレッド辺りが怪しいなぁとは思っておりますが。。 調査の切り口や、現象解消方法をご存知の方がいらっしゃいましたらご教授願いたく思います。 以下は環境です。 ◎OS:UNIX(Solaris8) ◎JAVA:1.4.1_03
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- kacchann
- ベストアンサー率58% (347/594)
あとは、 「プロファイラ」使って 「CPUを消費している箇所」を探るしかない気がします・・・
- kacchann
- ベストアンサー率58% (347/594)
>スレッド辺りが怪しいなぁとは思っておりますが とりあえず稼動スレッド数の増減を 観察してみては。
お礼
回答ありがとうございます。 とりあえず、手っ取り早く確認したかったので、以下の二つの方法で確認したところスレッドは正しく終了しておりました。 1)run()メソッドの中でhashcodeを出力。 2)javaのバージョンを1.5にあげてjconsoleで確認。
- namida6000
- ベストアンサー率57% (12/21)
切り口が変わってしまうのですが、 タイトルバーを出さないという制御方法です。 別クラスになりますが、 JFrameで setUndecorated(true); とすれば、タイトルバーがでません。 もしくは、親のJWindowクラスは元々タイトルバーがありません。 以前、タイトルを出したくないとお客さんから依頼を受けて、JWindowに変更しました。 JDialogに合わせるコーディングは必要ですが、スレッドは考える必要がなくなると思います。
お礼
ありがとうございます。 namida6000さんの教えていただいた方法は、似たような案を 代変案として提出済みです。 私が製造するのであれば、namida6000さんと同じような製造方法にするのですが、製造したのは、私ではないので・・・・。 ご意見ありがとうございます。
- bgbg
- ベストアンサー率53% (94/175)
> マルチスレッド処理にし常にリペイントがかかるように製造。 どう見てもこの部分が原因に思えるのですが。 要するにエラーダイアログの所在を常に監視し、タイトルバーの部分を上で塗りつぶしていると。 それをマルチスレッドで無限ループさせているわけですね。 無限ループは何もしなくても非常にCPUパワーを消費します。 この部分の設計を考え直す必要があるでしょう。 # そもそも右クリックメニュー表示を禁止する必要があるのか?
お礼
回答ありがとうございます。 >要するにエラーダイアログの所在を常に監視し、タイトルバーの部分を上で塗りつぶしていると。 >それをマルチスレッドで無限ループさせているわけですね。 おっしゃるとおりです。 >無限ループは何もしなくても非常にCPUパワーを消費します。 勉強になります。 ただ、スレッドが停止・開放された場合はCPUの使用率が下がると思っておりますが、間違っていますでしょうか。 現状では、CPU使用率が減少しないのです。 >この部分の設計を考え直す必要があるでしょう。 すでに代変案は提出済みなのですが、原因究明を要請されていますので、調べている最中でございます。 ># そもそも右クリックメニュー表示を禁止する必要があるのか? 客先からの要望なのです。。
- houou0123
- ベストアンサー率26% (4/15)
スレッドがどんどん増えて、溜まっていってるのでは? きちんと開放されてるでしょうか? こちらが参考になるかと思いますが・・・。
お礼
回答ありがとうございます。 参考URLも参照させていただきました。 しかし、参考URLに書いてある内容は行っておりました。 (1)スレッドをスタートさせてリペイントを繰り返す。 (2)ダイアログ(ペイントを行う元のダイアログ)を表示。 (3)OKボタンが押下され、制御が戻ってきたらスレッドを停止させる。 UNIXとWINDOWSでなにか相違点などあるのでしょうか。 現在デバックはWINDOWSで行っています。
補足
すみません。もうひとつ気になってることがあります。 (1)からの処理は、staticなメソッド内で行っています。 そして、(2)のダイアログの表示に関しては、 dialog.show(); で、表示しています。 このメソッドは使用すべきではありません。との警告が表示されます。 これが関係ある可能性がありますか。
お礼
回答ありがとうございます。 プロファイラも JavaBean、Eclipse両方試しましたが、特に問題点は見つかりませんでした。
補足
Swingのシングルスレッドルールに違反していることが判明しました。 (遅すぎますね・・・・。気づくのに。) おそらくその影響かと思います。 とりあえずこの質問は締め切らせていただきます。 回答していただいた皆さんありがとうございました。