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