java 堆栈详解_Java 堆栈详解 - 程序员爱酸奶的个人空间 - OSCHINA - 中文开源技术交流社区...

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

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

Java自动管理栈和堆,程序员不能直接地设置栈或堆。

74defa8b60f9414d5c584e02b2b7219f.png

堆栈溢出

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

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源创计划”,欢迎正在阅读的你也加入,一起分享。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值