Java 堆栈详解

java堆内存:是存放对象本身,不存放对象的引用也不存放基本数据类型,jvm中只有一个堆(heap)所有线程共享。

java栈内存:用来存放局部变量(方法中定义的基本数据类型和对象的引用),线程私有,超过变量的作用域,java会自动释放掉为该变量分配你的内存空间替工给其他变量使用。

Java自动管理栈和堆,程序员不能直接地设置栈或堆。
Java 堆栈详解_第1张图片

堆栈溢出

堆溢出,不断的创建新的 对象,没有及时回收导致堆溢出,还有一个创建很大的对象导致堆溢出

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堆内存的最大可用内存)

你可能感兴趣的:(#,死磕java)