美文网首页
JAVA中的堆栈问题

JAVA中的堆栈问题

作者: 懵智的大仁哥 | 来源:发表于2016-02-26 15:48 被阅读296次

    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

    相关文章

      网友评论

          本文标题:JAVA中的堆栈问题

          本文链接:https://www.haomeiwen.com/subject/pblwkttx.html