[@小川游鱼][¥20]Java 中堆和栈有什么区别?-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

[@小川游鱼][¥20]Java 中堆和栈有什么区别?

李博 bluemind 2018-12-13 14:47:13 1413

问题来自Java技术沙龙的李博
Java线下沙龙报名链接:https://yq.aliyun.com/activity/796

Java
分享到
取消 提交回答
全部回答(6)
  • chankan
    2019-07-17 23:20:43

    功能特性不同,存放的数据也不同;方法执行是出入栈的过程,基本类型变量也在栈中,一个线程对应一个栈;
    堆存放实例对象,实例对象的生命周期是可以跨越线程生命周期的,GC也是基于此才出现的

    0 0
  • jxiaoyu
    2019-07-17 23:20:43

    参看 JVM 的内存模型

    0 0
  • peter517517
    2019-07-17 23:20:43

    尽量使用局部变量,调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢。另外,依赖于具体的编译器/JVM,局部变量还可能得到进一步优化

    0 0
  • 宏卓
    2019-07-17 23:20:43

    在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。
    从Java的这种分配机制来看,堆栈又可以这样理解:堆栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有先进后出的特性。

    每一个Java应用都唯一对应一个JVM实例,每一个实例唯一对应一个堆。应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有的线程 共享.跟C/C++不同,Java中分配堆内存是自动初始化的。Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在堆栈中分配,也就是说在建立一个对象时从两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在堆栈中分配的内存只是一个指向这个堆对象的指针(引用)而已。

    0 0
  • 世界线跳跃者
    2019-07-17 23:20:43

    首先假定题目中的栈指java虚拟机栈,堆指Java堆。
    最主要的区别是职责区别:前者最主要的用途是执行方法,后者主要用途是分配(给对象)内存。
    当然还有非常多小区别,比如前者是线程私有的,后者是共有的
    前者基于栈的栈帧的形式处理方法的上下文,从而不需要GC去管理内存,而后者需要通过GC管理内存的回收
    等等等等还有很多,不过主要还是职责定义

    0 0
滑动查看更多
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题
推荐课程