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

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

ただいまの
回答率

88.13%

JVMのスレッドの起点

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 892

score 13

Javaでプログラムを書いて、コンパイルしてclassファイルを作って、

javaコマンドでJVMを起動してclassファイルを渡すことでプログラムが起動すると思いますが、

こういったJVMで動くプログラムは、起点となるメソッドは必ずmainメソッドですか?

例えばTomcatを起動すると、JVM上で様々なスレッドが実行されますが、
これらのスレッドを生み出した起点となるのはmainメソッドなのでしょうか?

どなたかご教授お願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+2

unz.horiさんの回答に補足。

コードリーディング Tomcatのソースを読んでみよう 起動編 - BlueWell2より。

変数MAINCLASSにセットしている部分からメインクラスが
Bootstrapであることがわかります。

さあBootstrapクラスのコードを見てみましょう。

public final class Bootstrap {

  private Object catalinaDaemon = null;
  protected ClassLoader commonLoader = null;
  protected ClassLoader catalinaLoader = null;
  protected ClassLoader sharedLoader = null;

  public static void main(String args[]) {
    if (daemon == null) {
      Bootstrap bootstrap = new Bootstrap();
      // 初期化
      bootstrap.init();
      daemon = bootstrap;
    }

Tomcatのサービス自体はやはり「mainメソッド」が起点となって実行されます。
Servletやjspは、このTomcatのサービス上にLoadされて実行されるのです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/02/26 15:39

    「JVMは起動したらmainメソッドを実行するスレッドが動くよ」←私は言い切ってよいと思っています。

    キャンセル

  • 2018/02/26 15:42

    貴重な意見ありがとうございます。
    今後の参考にします。

    お二方のどちらも的確な回答を下さいましたが、
    先に回答いただいたunz.horiさんをベストアンサーにさせて下さい。

    キャンセル

  • 2018/02/26 15:44

    https://teratail.com/questions/11712
    ↑こちらも参考まで。

    キャンセル

+2

これらのスレッドを生み出した起点となるのはmainメソッドなのでしょうか?

NOです

ちょっとmainメソッドを含むプログラムを書いてIDE上で動かしてみて下さい。mainメソッドの先頭のブレークポイントで止めた状態でスレッドの一覧を見ると「その時点で既に沢山のスレッドが動いている」のが観察できます。

スレッドを動かしているのはJVMのスタートアップ処理的な部分ではないでしょうか?そのなかでJava VMとして動作するために必要なGCスレッドとかいくつかのシステムスレッドが起動され「準備ができたら」おもむろにメインクラスがロードされてmainスレッドからmainメソッドが起動されるのだろうと思います。

つまりJVMの仕組み上は単に「準備ができた状態のJVMでアプリケーションを始めるための起点がmainメソッド」であるにすぎないと思います。

Tomcatも一つのアプリケーションですから普通にmainメソッドから始まるようです。(これは他の回答者さんの回答どおりかと思います)


ちなみに、

https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-5.html#jvms-5.2

のあたりを見ればJVMのスタートアップの仕様をうかがい知ることができると思います。自分は普段そういうレベルを意識したことがないので中身を詳しくみたことはありませんが興味があるなら読んでみてはいかがでしょうか?

ちなみにJNIを用い、C/C++でmain処理を書いてそこからJVMを起動すればmainメソッド以外からスタートするようなこともできそうに思えます。サンプル見るとpublic static void main(String[])というシグナチャーのメソッドを探してそれを起動するってのをCで意識的に書いてますので・・・

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/02/26 15:59

    > つまりJVMの仕組み上は単に「準備ができた状態のJVMでアプリケーションを始めるための起点がmainメソッド」であるにすぎないと思います。

    > サンプル見るとpublic static void main(String[])というシグナチャーのメソッドを探してそれを起動するってのをCで意識的に書いてますので・・・

    これらは非常に興味深いですね。
    リンクもありがとうございます。

    今度読んでみようと思います。

    キャンセル

checkベストアンサー

+1

普通にJavaで作成した単独で動く起点はmainメソッドですが、Tomcatなどで表示されるスレッドはコンテナ(Tomcat)のクラスです。いわゆるWEBアプリケーションではディレクトリ階層が規定されていてその中にユーザアプリケーションを配置してTomcatが認識することにより起動されているためmainメソッドではありません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/02/26 15:25 編集

    ご回答ありがとうございます。

    Tomcatを起動した瞬間、JVMが立ち上がりますよね。
    そのとき一番最初に起動するスレッドはmainメソッドを実行しますか?

    >いわゆるWEBアプリケーションではディレクトリ階層が規定されていてその中にユーザアプリケーションを配置してTomcatが認識することにより起動されている

    こちらは、tomcatのディスパッチスレッドがサーブレットをキックしていることだと思いますが、
    そもそもtomcatのスレッドがどこから生まれたのか知りたいです。

    キャンセル

  • 2018/02/26 15:29

    情報が古いですが、こんなサイトを見つけました。参考にどうぞ。
    http://telecastravinsky.blog.fc2.com/blog-entry-9.html

    キャンセル

  • 2018/02/26 15:37

    ありがとうございます。

    ほー。やはりmainメソッドが起点になっているようですね。
    「JVMは起動したらmainメソッドを実行するスレッドが動くよ」と言い切って良いものかと悩んでいましたが、問題ないんでしょうかね。

    キャンセル

  • 2018/02/26 15:42

    問題ないと思います。例えばJarの中の複数クラスにmainメソッドが複数ある場合のエントリポイント指定もどのクラスのmainメソッドを起点とするかを指定するので、mainメソッドが起点というのは正しいです。

    キャンセル

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

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

関連した質問

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