zoukankan      html  css  js  c++  java
  • 栈和堆的区别

      栈和堆有啥区别?这是一个很容易混淆的问题。首先从数据结构层面来看,堆是完全二叉树,栈是后进先出的线性表。从java虚拟机层面看,这两者都是内存中的运行时数据区域,具体区别如下:

    1、栈(stack)是线程私有的,随某一线程出生和死亡;堆(heap)是所有线程共享的,随虚拟机启动出生、关闭死亡。

    2、栈通过栈帧来存放方法执行时信息,包括局部变量(基本数据类型和对象引用)、方法出口等,方法调用时入栈,方法结束时出栈并回收内存;堆存放对象实例,栈里的对象引用指向堆里的对象实例,对象引用出栈后该对象实例仍然存活,可以被其他线程使用,但最终会被堆通过垃圾回收杀死回收内存。

    3、堆是虚拟机中分配出来最大内存的运行时数据区域,栈没得比。

    4、如果线程申请的栈深度大于虚拟机所允许的深度,将报StackOverflowError;如果实例分配超过了堆中剩余空间,会报内存溢出(OutOfMemoryError)。

    5、题外话,内存溢出很好理解,内存泄漏(memory leak)是某块内存申请后没有回收,比如某个方法打开文件后忘了关闭,这就是内存泄漏,如果多次调用该方法那么会出现什么状况呢?有再多内存都会被耗光,造成内存溢出。

  • 相关阅读:
    计算机中丢失MSVCP110.dll
    应用程序无法正常启动0xc000007b
    查看80端口被占用
    重装系统后搭建php环境
    修改、设置root密码
    安装虚拟机时出现The Microsoft Runtime DLL
    linux网络配置
    Java拾遗
    哈希中的那些序问题
    笔记本电脑安装jupyterthemes
  • 原文地址:https://www.cnblogs.com/wuxun1997/p/6533119.html
Copyright © 2011-2022 走看看