質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.92%

Eclipseでシングルスレッドで実行しても、CPU(4コア8スレッド)がほぼ100%になる

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 6,984

ratetail

score 32

前提・実現したいこと

Windows7Pro、Eclipse4.6.3 neonで、Javaプログラムを単純なシングルスレッドで実行すれば
Windows側のCPUも1スレッド分だけが最大になると思っていたが
なぜそうならないのかの理由及び、そのような設定があるのかを知りたい。

発生している問題・エラーメッセージ

Eclipse上でdebug実行する、及びWindowsコマンドプロンプト上で「java classXX」で実行すると、現状Windows側のCPUをほぼ使い切る。

該当のソースコード

List<String> listStr = new ArrayList<String>();
Thread th1 = new Thread(new Runnable(){
    @Override
    public void run(){
        for(int m = 0; m < 10; ++m){//10回分
            listStr.clear();
            long st = System.currentTimeMillis();
            for(int i = 0; i < 10000000; ++i){
                listStr.add(String.valueOf(i));
            }
            long ed = System.currentTimeMillis();
            System.out.println(listStr.size() + " " + (ed-st));
        }
    }
});
th1.start();

補足情報(言語/FW/ツール等のバージョンなど)

Eclipse上及び、Windowsコマンドプロンプトで、Javaをマルチスレッドで実行しても、シングルスレッドで実行しても
作業効率上げるために最適化を図ってシングルスレッドで動作しているように実行しながら
マルチスレッドで扱っているということでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

そもそも、「シングルスレッドのプロセスだから CPU を一つしか使わない」というわけではありません。同時に使わないだけで、実行するコアが違うことはありえます。(まあプロセススケジューラでその辺は回避するようになってはいますが)

また、java をプロンプトから起動したときとは異なり、Eclipse のデバッガから動かしているのであれば、実際の java プログラムの  に、デバッガそのものも動いていますから、当然こちらが CPU を食っていても全然おかしくありません。
100% になっているというのはデバッガがアイドルタイムもすべて奪っているだけで、別に処理が重いことを意味しているわけではないからです。
※デバッガは入出力から何からキャッチしようとしているでしょうから、理解できる動きです

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/12 13:13

    テストソースは大量の String の生成と List への登録、そしてそれを使うことなく破棄しているので、GC が大量に発生するのは確かです。あとは実行時のメモリ量指定で、GC の頻度が増えたか。
    ※GC中は実行が止まるからとにかく急いで GC を完了させようとするはずなので、CPUパワー全部持ってってる可能性が

    キャンセル

  • 2017/05/14 13:15

    皆様、ご回答ありがとうございます。
    今回の主質問についての問題は、解決する事が出来ました。

    また、実験結果について補足しますと
    今回のコード直前でclearしている場合は各GCが使う論理コアは
    それぞれ10~40%程度をジグザグしますが
    clearをしない場合は、GCのそれぞれの論理コアはほぼ100%に張り付いていました。

    あまりに多すぎるからなのか、そのあたりまでは、今回知りたい情報の範囲を超えていると判断したため、不要と考えて調査はしていませんでした。

    論理コアと言うんですね。情報ありがとうございます。

    また、それぞれのジャンルにおいて、マルチコア、マルチプロセス、マルチタスク、マルチスレッドなど、色々あるようですが、問題になった際に、また新しく質問として作成しようと思います。

    どうもありがとうございます。

    キャンセル

  • 2017/05/15 09:34

    ちなみに1スレッドかどうか確認するためのコードでパラレルGCが動かないのは当然で、GCしなければならないようなメモリの確保と開放が発生していないからです。(変数を宣言してないでしょ?)
    ガベージコレクションとはどういうもので、特に Java の場合はどのようなタイミングでどのゴミを消して再利用できるようにするか、理解しておくと大規模なシステムを作るときに多少は役に立ちます。GC をいかに抑えるか、というのは性能に影響するので(Full GC になるとプログラムが止まってしまうので、いらぬ面倒を引き起こす)

    キャンセル

0

Java の処理系の実際の動作は詳しく知りませんが、何やら根本的なところでの誤認があるように見えます。

私の知る限り、Java のプログラムは、JavaVM という仮想環境の中で動作するはずです。仮想環境の中でシングルスレッド動作するよう設定したからと言って、仮想環境自体がシングルスレッド動作する必要はどこにもありません。仮想環境内でシングルスレッド処理では起こりえない問題が発生しない限り、仮想環境自体はいくらでもマルチスレッド処理される可能性があるはずです。

また、Java で言うシングルスレッド/マルチスレッド処理の意味するところと、Windows で言うシングルスレッド/マルチスレッド処理の意味するところがそもそも違う可能性がある点にも注意が必要です。

実際のところ、論理 8core ある環境で、Windows で言う「マルチスレッドに対応したアプリ」でも、「マルチプロセスに対応していないアプリ」は CPU リソースを12.5% までしか使うことができません。

それ以上使えるのは、Windows 的にはマルチプロセス処理と呼ばれる処理を行っている場合だけです。他回答へのコメントを見る限り、JavaVMは、これを行っているようです。

大事なことは、Javaプログラムの実行負荷を考える場合に、実環境のCPU利用率と安易に直結させようとするのは無理があるということですので、Windowsにおけるマルチプロセスとマルチスレッドの具体的な違いについてはとりあえず置いておきます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る