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();
    }

}

结果:

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容