2017-02-08 3 views
2

プリミティブのみがスタックメモリに格納され、オブジェクトはヒープメモリに格納されていることを読んでいます。次のプログラムでは、stackoverflowエラーが発生する前に最大スタックサイズを確認するメソッドを再帰的に呼び出しています。ここでメソッドのHashsetオブジェクトを作成すると、Javaのスタックメモリが減少する

public class MaxStackSize { 
static int i =0; 
public static void main(String[] args) { 
    method1(); 
} 

public static void method1() 
{ 
    i++; 
    System.out.println(i); 
    method1(); 
} 
} 

最大出力 'i' は53481.

である私はメソッドにHashSetのオブジェクトを追加し、それを移入した場合のために:

public class MaxStackSize { 
static int i =0; 
public static void main(String[] args) { 
    method1(); 
} 
public static void method1() 
{ 
    HashSet<String> set = new HashSet<String>(); 
    set.add("one"); 
    set.add("two"); 
    set.add("three"); 
    set.add("four"); 
    set.add("five"); 
    set.add("six"); 
    set.add("seven"); 
    set.add("eight"); 
    set.add("nine"); 

    i++; 
    System.out.println(i); 
    method1(); 
} 
} 

を 'I' の最大出力は25403です

両方の場合、VM argは-Xss5mです。

プリミティブのみがスタックに格納されている場合、なぜHashSetのオブジェクトが作成されると、スタックサイズが小さくなるのですか?

+3

あなたは 'method1()'を再帰的に呼び出しています。それがなぜ 'HashSet'ではなく増加しているのでしょうか? – msagala25

答えて

2

プリミティブはスタックに格納されます。ローカル変数はオブジェクトです。インスタンス化するHashSetはヒープ上にありますが、各HashSetへの参照、変数setがスタックに入ります。

+0

こんにちは、 'set.add()'メソッドの呼び出しを意味しますか?私も混乱しています。ありがとう – msagala25

+1

いいえ、 'HashSet set = new HashSet ();'それぞれの呼び出しは 'set'の値を格納するためにスタック内のスペースをとります。 –

+0

@ LKTN.25で指摘されているように、最終的には参照変数に関係なくスタックオーバーフローが発生します。 – shmosel

関連する問題