java堆内存:是存放对象本身,不存放对象的引用也不存放基本数据类型,jvm中只有一个堆(heap)所有线程共享。
java栈内存:用来存放局部变量(方法中定义的基本数据类型和对象的引用),线程私有,超过变量的作用域,java会自动释放掉为该变量分配你的内存空间替工给其他变量使用。
Java自动管理栈和堆,程序员不能直接地设置栈或堆。
堆栈溢出
堆溢出,不断的创建新的 对象,没有及时回收导致堆溢出,还有一个创建很大的对象导致堆溢出
public class Heap{
public static void main(String[] args) {
ArrayList list=new ArrayList();
while(true) {
list.add(new Heap());
}
}
}
或者
public class Heap{
public static void main(String[] args) {
byte[][] array=new byte[1024*1024][1024*1024];
}
}
会报错:java.lang.OutOfMemoryError: Java heap space
栈溢出:一般是递归不断的创建变量造成栈内存不足。
public class Stack{
public static void main(String[] args) {
new Stack().test();
}
public void test() {
test();
}
}
报错:
java.lang.StackOverflowError
避免内存泄露:
是在声明对象引用之前,明确内存对象的有效作用域。在一个函数内有效的内存对象,应该声明为 local 变量,与类实例生命周期相同的要声明为实例变量……以此类推。第二,在内存对象不再需要时,记得手动将其引用置空。
堆栈溢出解决:
此时可以通过增大jvm的堆内存来解决这个问题,当然了这个是最直接的方式,如果可以优化代码也是可以的,比如使用单例模式去优化代码。
在运行Java程序时,有两个参数可以用于对jvm堆内存的调整:
-Xms(用于设置jvm堆内存的初始大小)
-Xmx(用于设置jvm堆内存的最大可用内存)
本文同步分享在 博客“程序员爱酸奶(QuellanAn)”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。