java内存分配

一.Java内存分配主要包括以下几个区域:

1. 寄存器:我们在程序中无法控制

2. 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中

3. 堆:存放用new产生的数据  注意:创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一次

4. 静态域(数据段):存放在对象中用static定义的静态成员

5. 常量池:存放常量

6.代码段:用来存放从硬盘上读取的源程序代码。

内存示意图

二.栈内存
栈内存是先进后出,栈主要是用来执行程序的
在函数中定义的一些基本类型的变量数据对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当该变量退出该作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。

1.栈空间内存分配
java 栈中保存的主要内容是栈帧。每一次函数调用都会有对应的栈帧被压进去 java 栈,执行完毕的时候被弹出 java 栈。如下图所示。


函数1对应栈帧1,函数2对应栈帧2.函数3对应栈帧3.以此类推。

函数1调用函数2,函数2调用函数3,函数3调用函数4,以此类推。

函数1被调用的时候栈帧1入栈,函数2被调用的时候栈帧2入栈,以此类推。

所以最后被调用的函数在栈顶,也是最先被弹出栈的。

每一个栈帧保存着函数的局部变量、中间运算结果等数据。

函数返回的时候,栈帧从java栈弹出。什么时候函数返回呢?两种情况:

1.正常的return的时候。

2.程序抛出异常。


每一次函数调用生成栈帧,从而肯定会占用一定的栈空间。所以栈空间内存不足的时候,函数调用无法进行。当请求的栈深度大于最大栈深度的时候系统会抛出StackOverflowError异常。(内存溢出异常)

函数嵌套的层数很大程度上有栈的大小决定的。栈越大,函数调用的次数就越多。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值