java中的堆与栈
2017-06-09 本文已影响0人
秋灯锁忆
关键词:堆与栈的定义,生存周期
定义
在运行java程序时,java把内存划分成两种:一种是栈内存,一种是堆内存。
- 栈:存取速度较快,内存容量小,遵循先进后出的存取规则
- 堆:存取数度较慢,内存容量较大,存取数据采用逻辑连续的链式存取(即数据实际存取有可能在不连续的内存块中)
堆栈内存大小是JVM自动分配的,由于JVM版本不同,大小可能会有差异。
功能
栈:程序执行,堆:数据存取。
-
存取数据类型:
- 栈:函数调用过程是在栈中完成的,所以局部变量,形式参数都是在栈中分配内存的,当参数类型是非基础类型对象时栈中分配对象的引用,同时,8大基础类型的引用与值均在栈中分配(这里主要基于运行速度的考量)。
- 堆:主要存取对象实例。
-
数据生命周期
- 栈:运行时数据自动入栈,当数据出栈后,自动销毁。这也就说明了局部变量的作用范围。(在调用分配前,数据区的大小是已知的,该过程是在编译时完成的)
- 堆:程序员使用new等获取内存空间请求,程序运行后分配给内存。同时当存储对象失去所有栈中的索引后,列入可清理的内存清单,在之后的某一时刻被java垃圾回收机制GC回收。(这里是不知道数据内存大小的,不知道数据的具体回收时间的)
-
数据共享
- 栈:栈中数据是共享的。上面提到基本数据类型的引用以及值均是存储在栈中的,如果遇见int a=3;栈中创建a的引用,同时查找栈中是否存在3,若存在,建立明确指引方向;若不存在,存进3。
- 堆:由于其本身仅存储数据,所以没有数据共享。(注意:这里有一个String包装,请参考[java字符串池][1])
[1]:[http://www.jianshu.com/p/92085ebbfa71]
(标注:这里还差线程。。。。。。。。。。。。。)