在方法中创建Hashset对象会减少java中的堆栈内存

时间:2017-02-08 06:40:28

标签: java

我已经读过,只有基元存储在堆栈内存中,对象存储在堆内存中。在下面的程序中,我递归调用一个方法来检查堆栈溢出错误发生之前的最大堆栈大小。

SET @query = 'SELECT product_id, '+@COLS_ISNULL+' FROM 
             (

                select b.product_id,  convert(CHAR(10), datelist, 120) PivotDate,  product_ammount  
                from #datatable b
                left join #temp d
                on d.datelist between  @tanggal_awal and @tanggal_akhir
                and d.datelist = b.product_date


            ) x
            pivot 
            (
                sum(product_ammount)
                for PivotDate in (' +@cols+ ')
            ) p'

这是' i'的最大输出是53481。

如果我将HashSet对象添加到方法并填充它:

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'的最大输出是25403。

对于这两种情况,VM arg是-Xss5m。

如果只有基元存储在堆栈上,为什么在创建HashSet对象时堆栈大小会减少。

1 个答案:

答案 0 :(得分:2)

基元存储在堆栈中。局部变量也是对象引用。您实例化的HashSet在堆上,但对每个HashSet变量set的引用都在堆栈上。