• 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

  • 相关阅读:
    saltstack状态判断unless与onlyif
    saltstack搭建LAMP架构案例
    saltstack编写自定义模块
    saltstack数据系统Pillar
    saltstack数据系统Grains
    自动重连套路
    golang切片
    开源库evio源码学习
    计算机操作系统
    常用数据结构的时间复杂度
  • 原文地址:https://www.cnblogs.com/--zz/p/9646176.html
Copyright © 2020-2023  润新知