スタック領域
日本語 | 積み上げ領域 |
英語 | stack area |
ふりがな | すたっくりょういき |
フリガナ | スタックリョウイキ |
メモリ上の、ローカル変数やメソッドの情報を格納する領域のこと。
単に「スタック」と言うことも多い。
JVMが使用するメモリ領域は、ローカル変数の情報を置くための「スタック領域」と、インスタンスの情報を置くための「ヒープ領域」とに分けられる。
スタック領域には、ローカル変数やメソッドの情報が、その名の通り「スタック」状に格納される。
スタックは「後入れ先出し」の構造を持っている。ローカル変数やメソッドの呼び出しがスタック構造をしているため、スタック領域はスタックの構造をしているのである。
メソッドAが呼びだされた場合、スタック領域にはまずメソッドAの情報とメソッドAのローカル変数が格納される。
次にメソッドAからメソッドBを呼びだした場合、スタック領域にはメソッドBの情報とメソッドBのローカル変数が格納される。
メソッドBから抜ける時にはスタック領域からメソッドBのローカル変数とメソッドBの情報が削除される。
つまり、「後入れ」されたメソッドBの情報とローカル変数が、「先出し」されて削除されるわけである。
この順番が変わることは決してない。メソッドの呼び出し順とはそもそもスタックの構造をしているからである。
そのため、メソッドの呼び出し順を出力したものを「スタックトレース」という。
スタック領域のサイズはデフォルトでは512Kバイトあり、javaコマンドのオプション「-Xss」で設定することができる。
だが、スタック領域にはローカル変数くらいしか格納するものはないため、まず足りなくなることはないだろう。
単に「スタック」と言うことも多い。
JVMが使用するメモリ領域は、ローカル変数の情報を置くための「スタック領域」と、インスタンスの情報を置くための「ヒープ領域」とに分けられる。
スタック領域には、ローカル変数やメソッドの情報が、その名の通り「スタック」状に格納される。
スタックは「後入れ先出し」の構造を持っている。ローカル変数やメソッドの呼び出しがスタック構造をしているため、スタック領域はスタックの構造をしているのである。
メソッドAが呼びだされた場合、スタック領域にはまずメソッドAの情報とメソッドAのローカル変数が格納される。
次にメソッドAからメソッドBを呼びだした場合、スタック領域にはメソッドBの情報とメソッドBのローカル変数が格納される。
メソッドBから抜ける時にはスタック領域からメソッドBのローカル変数とメソッドBの情報が削除される。
つまり、「後入れ」されたメソッドBの情報とローカル変数が、「先出し」されて削除されるわけである。
この順番が変わることは決してない。メソッドの呼び出し順とはそもそもスタックの構造をしているからである。
そのため、メソッドの呼び出し順を出力したものを「スタックトレース」という。
スタック領域のサイズはデフォルトでは512Kバイトあり、javaコマンドのオプション「-Xss」で設定することができる。
だが、スタック領域にはローカル変数くらいしか格納するものはないため、まず足りなくなることはないだろう。
参考サイト
- (参考サイトはありません)
// Sample.java
public class Sample
{
public static void main( String[] args )
{
// int型のローカル変数をひとつ作ります。
int i1;
// これで、スタック領域にi1が追加されました。
// method()メソッドを呼びだします。
method();
// method()メソッドから抜けました。
// そのため、まず変数i2がスタック領域から削除されました。
// スタックは「後入れ先出し」なので、i2が先に削除される
// わけです。
// そして、method()メソッドの情報もスタック領域から
// 削除されます。
// メソッドの呼び出し順は、決して変わりません。
// method()メソッドの呼び出し中にmain()メソッドから抜けて
// i1変数が削除される、なんてことは決して起きません。
// このように、メソッドの呼び出し、ローカル変数の
// 格納方法は「スタック」という形になっているわけです。
}
/**
* メソッド。
*/
private static void method()
{
// method()メソッドが呼びだされたことで、
// スタック領域にmethod()の情報が追加されます。
// 現在のスタックトレースを出力します。
Thread.dumpStack();
//
//
//
//
// このように、呼びだされた順にメソッドの情報が
// 「積まれて」います。この構造が「スタック」のため、
// 「スタック領域」と呼ばれます。
// int型のローカル変数をひとつ作ります。
int i2;
// これで、スタック領域にi2が追加されました。
// スタック領域には、i2とi1があります。
// スタック上では、i2が「後入れ」されているので、
// 取り出す(ポップ)時もi2が先になります。
// i1が先に取り出されて削除されることは決して
// ありません。
}
}
public class Sample
{
public static void main( String[] args )
{
// int型のローカル変数をひとつ作ります。
int i1;
// これで、スタック領域にi1が追加されました。
// method()メソッドを呼びだします。
method();
// method()メソッドから抜けました。
// そのため、まず変数i2がスタック領域から削除されました。
// スタックは「後入れ先出し」なので、i2が先に削除される
// わけです。
// そして、method()メソッドの情報もスタック領域から
// 削除されます。
// メソッドの呼び出し順は、決して変わりません。
// method()メソッドの呼び出し中にmain()メソッドから抜けて
// i1変数が削除される、なんてことは決して起きません。
// このように、メソッドの呼び出し、ローカル変数の
// 格納方法は「スタック」という形になっているわけです。
}
/**
* メソッド。
*/
private static void method()
{
// method()メソッドが呼びだされたことで、
// スタック領域にmethod()の情報が追加されます。
// 現在のスタックトレースを出力します。
Thread.dumpStack();
//
//
//
//
// このように、呼びだされた順にメソッドの情報が
// 「積まれて」います。この構造が「スタック」のため、
// 「スタック領域」と呼ばれます。
// int型のローカル変数をひとつ作ります。
int i2;
// これで、スタック領域にi2が追加されました。
// スタック領域には、i2とi1があります。
// スタック上では、i2が「後入れ」されているので、
// 取り出す(ポップ)時もi2が先になります。
// i1が先に取り出されて削除されることは決して
// ありません。
}
}
// Sample.java public class Sample { public static void main( String[] args ) { // int型のローカル変数をひとつ作ります。 int i1; // これで、スタック領域にi1が追加されました。 // method()メソッドを呼びだします。 method(); // method()メソッドから抜けました。 // そのため、まず変数i2がスタック領域から削除されました。 // スタックは「後入れ先出し」なので、i2が先に削除される // わけです。 // そして、method()メソッドの情報もスタック領域から // 削除されます。 // メソッドの呼び出し順は、決して変わりません。 // method()メソッドの呼び出し中にmain()メソッドから抜けて // i1変数が削除される、なんてことは決して起きません。 // このように、メソッドの呼び出し、ローカル変数の // 格納方法は「スタック」という形になっているわけです。 } /** * メソッド。 */ private static void method() { // method()メソッドが呼びだされたことで、 // スタック領域にmethod()の情報が追加されます。 // 現在のスタックトレースを出力します。 Thread.dumpStack(); // // // // // このように、呼びだされた順にメソッドの情報が // 「積まれて」います。この構造が「スタック」のため、 // 「スタック領域」と呼ばれます。 // int型のローカル変数をひとつ作ります。 int i2; // これで、スタック領域にi2が追加されました。 // スタック領域には、i2とi1があります。 // スタック上では、i2が「後入れ」されているので、 // 取り出す(ポップ)時もi2が先になります。 // i1が先に取り出されて削除されることは決して // ありません。 } }