2018/8/3 JAVA中堆和栈的区别 - 路人浅笑 - 博客园
https://www.cnblogs.com/perfy/p/3820594.html 1/3
路人浅笑
博客园 首页 新随笔 联系 订阅 管理
随笔 - 244 文章 - 1 评论 - 16
JAVA中堆和栈的区别
在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。
当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自
动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。
堆内存用来存放由new创建的对象和数组。
在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。
在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象
在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。
引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组
或对象。
java中变量在内存中的分配
1、类变量(static修饰的变量):在程序加载时系统就为它在堆中开辟了内存,堆中的内存地址存放于栈以便于
高速访问。静态变量的生命周期--一直持续到整个"系统"关闭
2、实例变量:当你使用java关键字new的时候,系统在堆中开辟并不一定是连续的空间分配给变量(比如说类实
例),然后根据零散的堆内存地址,通过哈希算法换算为一长串数字以表征这个变量在堆中的"物理位置"。 实例
变量的生命周期--当实例变量的引用丢失后,将被GC(垃圾回收器)列入可回收“名单”中,但并不是马上就释放
堆中内存
3、局部变量:局部变量,由声明在某方法,或某代码段里(比如for循环),执行到它的时候在栈中开辟内存,
当局部变量一但脱离作用域,内存立即释放
附:java的内存机制
Java 把内存划分成两种:一种是栈内存,另一种是堆内存。
在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一
个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配
的内存空间,该内存空间可以立即被另作它用。
< 2018年8月 >
日 一 二 三 四 五 六
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8
昵称:路人浅笑
园龄:6年6个月
粉丝:109
关注:2
+加关注
公告
找找看
谷歌搜索
搜索
常用链接
我的随笔
我的评论
我的参与
最新评论
我的标签
我的标签
sql(2)
eclipse(2)
maven(1)
PORTC(1)
sql、join(1)
String(1)
workspace(1)
wxWidgets(1)
变量(1)
标量值函数(1)
更多
随笔分类(195)
Android(10)
Ardunio(9)
C/C++(13)
C51(13)
Eglish(3)
Freescale(4)
GPRS(3)
J2EE(38)
JSON(2)
Linux(44)