JVM中的堆与栈的异同点.
JVM中的堆与栈的异同点.
一 .
首先,个人认为,JVM中的堆和栈就像存放物品的两个"篮子",他们都有存储功能
.但是这两个"篮子"组成结构不同,所拥有的存储量不同,能存放的物品也不相同.
二.
JVM的栈是一种
(1)先进先出(FIFO) 的数据结构. 它存储局部变量和方法的调用.
(2)在栈中创建或释放存储空间所需的时间远远小于堆,因为只需要移动栈顶的指针就可以完成这种操作.
(3)但是栈的存储空间远远小于堆的存储空间
(因为栈负责存储方法调用,可以得出,在C语言中用递归写Fib函数,如果递归次数过多,就可能出现爆栈的情况,也会在JAVA中出现.)
(4)使用栈存储会牺牲灵活性,因为他不是动态的分配存储空间,用栈存储的时候需要确切的知道存储对象的各种属性.(所以JAVA中 一般用 堆来存储对象)
(5)栈满抛出的异常是java.lang.Stack.OverFlowError.
(6)栈内存属于单个线程,(一个进程可以有多个线程) 每个线程都有一个独立 栈内存. 因为线程之间不能相互干扰 (JAVA并发编程)
PS:本人才学到并发的基础,最后一句的解释不懂会不会太绝对.
JVM中的堆
(1)堆不是数据结构中所说的堆(完全二叉树) 堆负责存储实例化的对象 和数组的.
(2)因为JAVA采用了 动态内存分配的方式, 所以new 生成的对象就是存放于堆中,但是由于堆中创建的对象,编译器对其的生命周期一无所知,会导致内存泄漏(C++的弊端) 但是由于JAVA的垃圾回收器GC,很好的避免了这个问题.
(3)堆分配的内存的花费时间远远大于栈.
(4)堆满抛出的异常是 java.lang.OutOfMemoryError
(5)堆的动态创建方式带来了很大的灵活性,解决了很多问题.
(6)堆内存中的所有对象对所有线程可见.
参考资料:
<<JAVA编程思想>>中的 1.10-对象创建与生命期, P13
JAVA 官方文档说明
GO语言JHP[趣味教程 <<并发不是并行>>