我读到只有原语存储在堆栈内存中,对象存储在堆内存中。在下面的程序中,我将递归调用一个方法来检查堆栈溢出错误发生之前的最大堆栈大小。
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 参数为 -Xss5m。
如果只有原语存储在堆栈上,为什么在创建 HashSet 对象时堆栈大小会减小。
基元存储在堆栈上。作为对象引用的局部变量也是如此。 你实例化的HashSet
在堆上,但对每个HashSet
(变量set
(的引用在堆栈上。