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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JVM

JVM(Java Virtual Machine)があれば、一連のコンピューターソフトウェアプログラムとデータストラクチャが、仮想マシンモデルを使って他のコンピュータプログラムやスクリプトを拡張できます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

424閲覧

JVMのスレッドの起点

sachito

総合スコア13

JVM

JVM(Java Virtual Machine)があれば、一連のコンピューターソフトウェアプログラムとデータストラクチャが、仮想マシンモデルを使って他のコンピュータプログラムやスクリプトを拡張できます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2018/02/26 06:11

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

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

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sachito

2018/02/26 06:59

> つまりJVMの仕組み上は単に「準備ができた状態のJVMでアプリケーションを始めるための起点がmainメソッド」であるにすぎないと思います。 > サンプル見るとpublic static void main(String[])というシグナチャーのメソッドを探してそれを起動するってのをCで意識的に書いてますので・・・ これらは非常に興味深いですね。 リンクもありがとうございます。 今度読んでみようと思います。
guest

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

tkturbo

総合スコア5572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

unz.hori

2018/02/26 06:31

参考サイトが被りましたw
sachito

2018/02/26 06:38

ありがとうございます。 「JVMは起動したらmainメソッドを実行するスレッドが動くよ」と言い切って良いと思いますか?
tkturbo

2018/02/26 06:39

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

2018/02/26 06:42

貴重な意見ありがとうございます。 今後の参考にします。 お二方のどちらも的確な回答を下さいましたが、 先に回答いただいたunz.horiさんをベストアンサーにさせて下さい。
guest

0

ベストアンサー

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

投稿2018/02/26 06:17

unz.hori

総合スコア1057

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sachito

2018/02/26 06:27 編集

ご回答ありがとうございます。 Tomcatを起動した瞬間、JVMが立ち上がりますよね。 そのとき一番最初に起動するスレッドはmainメソッドを実行しますか? >いわゆるWEBアプリケーションではディレクトリ階層が規定されていてその中にユーザアプリケーションを配置してTomcatが認識することにより起動されている こちらは、tomcatのディスパッチスレッドがサーブレットをキックしていることだと思いますが、 そもそもtomcatのスレッドがどこから生まれたのか知りたいです。
sachito

2018/02/26 06:37

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

2018/02/26 06:42

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問