メソッドのローカル変数とパラメーターがスタックに存在することは知っていますが、Java の場合、メソッドが実際にどこに存在するかわかりませんか?
次のようなスレッドオブジェクトを宣言すると:
Thread t=new Thread();
t.start();
したがって、メイン メソッドとは別にメソッドの呼び出しを個別に作成したことを意味します。どういう意味ですか?スタックメモリを介してメソッドの個別のシーケンスを呼び出すことを意味しますか? 私は正しいですか?
メソッドのローカル変数とパラメーターがスタックに存在することは知っていますが、Java の場合、メソッドが実際にどこに存在するかわかりませんか?
次のようなスレッドオブジェクトを宣言すると:
Thread t=new Thread();
t.start();
したがって、メイン メソッドとは別にメソッドの呼び出しを個別に作成したことを意味します。どういう意味ですか?スタックメモリを介してメソッドの個別のシーケンスを呼び出すことを意味しますか? 私は正しいですか?
各スレッドには独自のスタックが割り当てられます。
この記事では、Java プロセス内でのメモリ分離について適切に紹介しています。
Java 仮想マシン内では、各スレッドに Java スタックが割り当てられます。Java スタックには、ローカル変数、パラメーター、スレッドが呼び出した各メソッドの戻り値など、他のスレッドがアクセスできないデータが含まれています。スタック上のデータは、プリミティブ型とオブジェクト参照に限定されます。JVM では、実際のオブジェクトのイメージをスタックに置くことはできません。すべてのオブジェクトはヒープ上にあります。
クライアントが、各スレッドがほとんど実行しないことに基づいて非常にスレッド化されたサーバーを実装し、メモリに問題が発生するシナリオを数多く見てきました。これは、各スレッドに独自のスタックが割り当てられており、これが (明らかに) 加算されるためです。デフォルト値はスレッドあたり 512kだと思いますが、その標準的なソースは見つかりませんでした。
私の記憶が正しければ、メソッド コード自体はメモリのコード部分に存在し、内部で宣言された変数はスタックに存在し、オブジェクトはヒープ上に作成されます。Java では、変数ポインターとプリミティブはスタックに存在し、作成されたオブジェクトはヒープに存在します。
(貧弱な) ASCII 表現の場合:
-------
|STACK|
-------
|FREE |
-------
|HEAP |
-------
|CODE |
-------
ここで、STACK はスタックを表し、FREE は空きメモリを表し、HEAP はヒープを表し、CODE はコード スペースを表します。
これは私の記憶によると、詳細の一部が間違っている可能性があります。