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[趣味教程 <<并发不是并行>>

https://blog.csdn.net/qq_41675686/article/details/80400775

posted @ 2018-09-14 13:59  zz2108828  阅读(673)  评论(0编辑  收藏  举报