JAVA中的堆栈问题

Java将内存分为两类- '堆' 和 '栈' .

无论是堆或栈,都是一种数据结构,不过他们有自身的特性.
先说说堆,堆这种数据结构类似于煤堆,可以随意操作里面的数据.

堆区存储着Java中的对象以及对象自身的成员变量
堆中的内存由Java自动回收,当某对象孤立时,它的内存被回收释放.
由于数据结构具有有限的存储空间,所以可能会出现堆溢出.
堆溢出的条件:程序中对象及成员变量占用的内存过大!
解决方法: java -Xms 设置最大堆内存.

再说说栈,栈这种数据结构类似于井,先扔进去的石头最后才能取出来.
扔石头的动作叫做压栈,取石头的动作叫做弹栈.

栈区一般存储Java中的成员函数以及局部变量!
调用函数时,将函数帧进行压栈,函数调用结束后,函数帧弹栈,内存释放.
由于栈空间有限,所以有一种情况会发生栈溢出.
栈溢出的一种情况:函数递归调用自身,陷入循环.
演示一下这种情况:


代码如下:

class Stackoverflow{
    public static int n=0;
    public static void main(String[] xargs){
    out();
    }
    public static void out(){
        System.out.println(n);
        n++;
        out();
    }

}

结果:

JAVA中的堆栈问题_第1张图片

栈我在测试时默认大小大概为1M,如需运行前改变栈大小,
可使用命令java -Xss5m来改变栈内存为5M

你可能感兴趣的:(JAVA中的堆栈问题)