Javaでプログラムを書いて、コンパイルしてclassファイルを作って、
javaコマンドでJVMを起動してclassファイルを渡すことでプログラムが起動すると思いますが、
こういったJVMで動くプログラムは、起点となるメソッドは必ずmainメソッドですか?
例えばTomcatを起動すると、JVM上で様々なスレッドが実行されますが、
これらのスレッドを生み出した起点となるのはmainメソッドなのでしょうか?
どなたかご教授お願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
これらのスレッドを生み出した起点となるのは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 06:54
総合スコア18394
0
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 06:29
総合スコア5572
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/26 06:38
2018/02/26 06:39
2018/02/26 06:42
2018/02/26 06:44
0
ベストアンサー
普通にJavaで作成した単独で動く起点はmainメソッドですが、Tomcatなどで表示されるスレッドはコンテナ(Tomcat)のクラスです。いわゆるWEBアプリケーションではディレクトリ階層が規定されていてその中にユーザアプリケーションを配置してTomcatが認識することにより起動されているためmainメソッドではありません。
投稿2018/02/26 06:17
総合スコア1057
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/26 06:27 編集
2018/02/26 06:29
2018/02/26 06:37
2018/02/26 06:42
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/26 06:59