JavaA2Z

KAB-studio > プログラミング > JavaA2Z > スタック領域とは

スタック領域

日本語 積み上げ領域
英語 stack area
ふりがな すたっくりょういき
フリガナ スタックリョウイキ

解説

メモリ上の、ローカル変数メソッドの情報を格納する領域のこと。
単に「スタック」と言うことも多い。
 
JVMが使用するメモリ領域は、ローカル変数の情報を置くための「スタック領域」と、インスタンスの情報を置くための「ヒープ領域」とに分けられる。
スタック領域には、ローカル変数メソッドの情報が、その名の通り「スタック」状に格納される。
 
スタックは「後入れ先出し」の構造を持っている。ローカル変数メソッド呼び出しスタック構造をしているため、スタック領域はスタックの構造をしているのである。
 
メソッドAが呼びだされた場合、スタック領域にはまずメソッドAの情報とメソッドAのローカル変数が格納される。
次にメソッドAからメソッドBを呼びだした場合、スタック領域にはメソッドBの情報とメソッドBのローカル変数が格納される。
メソッドBから抜ける時にはスタック領域からメソッドBのローカル変数メソッドBの情報が削除される。
つまり、「後入れ」されたメソッドBの情報とローカル変数が、「先出し」されて削除されるわけである。
この順番が変わることは決してない。メソッド呼び出し順とはそもそもスタックの構造をしているからである。
そのため、メソッド呼び出し順を出力したものを「スタックトレース」という。
 
スタック領域のサイズはデフォルトでは512Kバイトあり、javaコマンドのオプション「-Xss」で設定することができる。
だが、スタック領域にはローカル変数くらいしか格納するものはないため、まず足りなくなることはないだろう。

参考サイト

  • (参考サイトはありません)

(KAB-studioからのおしらせです)

サンプルプログラム(とか)サンプルを別ウィンドウで表示サンプルをクリップボードへコピー(WindowsでIEの場合のみ)

// 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が先に取り出されて削除されることは決して
        // ありません。
    }
}
// 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が先に取り出されて削除されることは決して
        // ありません。
    }
}

この単語を含むページ

「みだし」に含まれているページ

「解説」に含まれているページ

「サンプルプログラムとか」に含まれているページ

はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
Yahoo!ブックマーク 詳細を表示 users
del.icio.us 登録する RSSに登録
サンプルを別ウィンドウで表示
サンプルをクリップボードへコピー(WindowsでIEの場合のみ)
update:2005/12/10
このページは、Javaプログラミング言語についての用語を網羅した辞書「JavaA2Z」の一ページです。
詳しくは「JavaA2Z」表紙の説明をご覧ください。