对内存机制进一步理解

说真的,学到最后很容易把一些前面java基础原理给忘了,其实那些东西很重要都是平时没注意的,特别是java内存机制,java中有两个内存,栈内存和堆内存,栈内存是临时的,随时释放,这样的数据一定要考虑生命周期和作用域,访问栈内存的数据容易出错的地方就是超出变量的生命周期和作用域,堆内存是持久的一但创建了就不会释放,容易导致内存溢出.比如匿名内部类不能访问方法局部变量,想访问必须final,因为内部内是一个类,是在堆内存里,创建对象也在堆内存,静态代码块静态变量都在堆内存,在内部内访问方法的局部变量就是栈内存的局部变量,用堆内存的数据去访问栈内存的数据是访问不到的,因为内存比栈内存存活时间长,所以加上final则变量就变成常量,常量是放在常量池也在堆内存,所以存活时间一样长.栈内存有方法栈,方法栈有压栈和弹栈.递归也就是这一原理,一个方法如被调用一百次,就相当与开了100个方法栈,第一次调用时,这个方法调用完后紧接着在第一个方法内部在调用自己这个方法,又来了一个方法栈就把刚才那个方法压下去了,一直往下压,最后就从上面开始弹栈.所以压栈和弹栈就像打子弹一样,最先压进去的最后射出来也就是先进后出.下面有个例子进一步说明一下内存机制原理:

public class Demo {

publicstatic void main(String[] args) {

intresult=run();

System.out.println(result);

}

 

privatestatic int run() {

intnum=1;

return num;

//return num++;

}

}

这个程序方法是先出栈后赋值,方法出栈了,num就为空了。所以java中的返回值是专门有一个容器来承载的,在run方法里面return其实干了两件事,第一件事是让方法出栈,结束掉,第二件事返回一个值,它首先将那个返回值扔到那个箱子里,然后就让那个方法出栈了,num就没有了,但已经将那个值存放那个箱子里了,然后这个方法就会弹栈,弹栈就会把箱子留下,虚拟机就会把箱子赋值这个result结果,其内部借用第三方变量来实现的。result赋值的值就是run方法返回箱子里的值。所以当返回num是,其结果为1,返回num++结果仍然是1,因为方法结束后不是num给它赋值而是箱子给它赋值,那个箱子里存放的值是1,所以num加上2没关系,结果仍然是1.


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值