主要区别如下:

一、空间分配:

1.堆(操作系统):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式类似于链表。PS:java中都是系统GC,程序员无法进行GC。

2.栈(操作系统):由操作系统自动分配释放,存放函数的参数值,局部变量值等。操作方式与数据结构中的栈相类似。

二、缓存方式:

1.堆:使用二级缓存,生命周期与虚拟机的GC算法有关(并不是引用为空就立即被GC),调用速度相对较低。

2.栈:使用一级缓存,被调用时通常处于存储空间中,调用后被立即释放。

三、数据结构:

1、堆(数据结构):类似于树结构,可以类比于堆排序

2、栈(数据结构):先进后出(FILO)

JAVA中的区别:

堆(heap)与栈(stack)都是java在RAM中用来存放数据的地方。与C++不同的是,java自动管理堆(heap)和(栈),程序员不能直接的设置堆和栈。

  栈:在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被用作他用。

堆:对内存用来存放由new创建的对象和数组,在堆中分配的内存,由java虚拟机的自动垃圾回收器来管理。在堆中产生一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。

Java中变量在内存中的分配:

1.类变量(static修饰的变量,静态变量):在程序加载时系统就为他在队中开辟了内存,堆中的内存地址存放于栈以便于高速访问。静态变量的生命周期——一直到系统关闭。

2.实例变量(实例化对象):当你使用java关键字new时,系统在堆中开辟并不一定是连续的空间分配给变量,然后根据零散的堆内存地址,通过哈希算法换算为一长串数字以表征这个变量在堆中的“物理位置”。实例变量的生命周期——实例变量的引用丢失后,将被GC列入到可回收名单中,但不是马上回收释放。

3.局部变量:生命在某个方法或者某段代码里面,执行到他的时候在栈中开辟内存,局部变量一旦脱离作用域,内存立即释放。

参考链接:https://www.jianshu.com/p/4cc13cb3aa9a

最新文章

  1. java web 插件式开发
  2. 【翻译】使用CSS3和jQuery制作跟随鼠标方位的Hover特效
  3. pig中变量
  4. Android(java)学习笔记223:上下文的区分
  5. Xcode 静态库调试策略
  6. WeakReference and WeakHashMap
  7. Idea在导入有maven项目时,不能自动识别pom.xml
  8. 关于在IJ中使用maven projects 的Lifecycle中打包package报expected START_TAG or END_TAG not TEXT
  9. Centos 7 安装 ifconfig 管理命令
  10. Spring MVC @SessionAttributes注解
  11. SpringBoot中常用注解@Controller/@RestController/@RequestMapping的区别
  12. flask的orm框架(SQLAlchemy)-一对多查询以及多对多查询
  13. Django之MVC框架与MTV框架详解
  14. 在asp.net中使用瀑布流,无限加载
  15. Node学习笔记2:建立HTTP服务器和客户端之间的通信
  16. NLP文本相似度(TF-IDF)
  17. Lua初学
  18. JavaScript:正则表达式 前瞻 找位置
  19. powerDesigner16x64安装步骤
  20. LG4768 [NOI2018]归程

热门文章

  1. mongodb的安装及使用
  2. 关于IC电源管脚去耦电容
  3. vue2.0中 怎么引用less?
  4. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_16-异常处理-可预知异常处理-自定义异常类型和抛出类
  5. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_20-CMS前端页面查询开发-页面原型-页面内容完善
  6. git clone https://chromium.googlesource.com/失败
  7. MVVM的项目学习和笔记
  8. RabbitMQ简单实现,exchange四种模式,持久化
  9. python之selenium多窗口切换
  10. Java工程师学习指南第1部分:夯实Java基础系列