开发者社区> 问答> 正文

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

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

展开
收起
李博 bluemind 2018-12-13 14:47:13 2707 0
6 条回答
写回答
取消 提交回答
  • 功能特性不同,存放的数据也不同;方法执行是出入栈的过程,基本类型变量也在栈中,一个线程对应一个栈;
    堆存放实例对象,实例对象的生命周期是可以跨越线程生命周期的,GC也是基于此才出现的

    2019-07-17 23:20:43
    赞同 展开评论 打赏
  • 阿里高级开发工程师 长期招聘 Java 高级开发工程师/技术专家。欢迎赐简历:chongyue.jxy@alibaba-inc.com

    参看 JVM 的内存模型

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

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

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

    2019-07-17 23:20:43
    赞同 展开评论 打赏
  • 宇宙虽有其起源,却没有终结。无限。 星球虽也有起源,却因其自身之力走向毁灭。有限。

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

    2019-07-17 23:20:43
    赞同 展开评论 打赏
  • 内存区域不一样

    2019-07-17 23:20:43
    赞同 展开评论 打赏
滑动查看更多
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载