当前位置: 首页 > news >正文

【jvm】栈和堆的区别

目录

          • 1. 用途
          • 2. 线程共享性
          • 3. 内存分配和回收
          • 4. 生命周期
          • 5. 性能特点

1. 用途
  • 1.堆:主要用于存储对象实例数组。在Java中,所有通过new关键字创建的对象都会被分配到堆上。堆是一个大的内存池,用于存储所有的Java对象,包括实例变量和数组。
  • 2.栈:主要用于存储局部变量、操作数栈以及方法调用的上下文信息(如方法返回地址)。每个线程都有自己的栈,用于存储该线程的方法调用和局部变量。
2. 线程共享性
  • 1.堆:是被所有线程共享的内存区域。因此,堆中的对象可以被所有线程访问,但这也需要进行线程安全的管理。
  • 2.栈:是线程私有的,每个线程都有自己的栈空间。这意味着栈中的变量只能在其所属线程中可见和访问。
3. 内存分配和回收
  • 1.堆:堆中的内存分配是动态的,适用于动态对象的存储。堆的大小可以动态地调整,由JVM自动管理,通常会根据当前应用的需求进行分配和释放。堆中的对象生命周期不受代码块的控制,直到没有任何引用指向该对象时,垃圾回收器才会将其回收。
  • 2.栈:栈的内存分配是连续的,适用于临时变量的存储。栈上的内存空间由编译器静态分配,并且在方法的生命周期内保持不变。当方法调用时,会将方法的参数、返回地址和局部变量压入栈顶;当方法返回时,栈顶的内容会被弹出并自动释放内存空间。
4. 生命周期
  • 1.堆:堆中的对象生命周期不受代码块的控制,而是由垃圾回收器根据对象的引用情况来管理。当没有任何引用指向堆中的对象时,该对象就可能成为垃圾回收的目标。
  • 2.栈:栈中的变量生命周期与方法的调用生命周期相同。当方法被调用时,其局部变量被创建并压入栈中;当方法执行完毕并返回时,其局部变量从栈中弹出并被销毁。
5. 性能特点
  • 1.堆:由于堆中的内存分配和回收需要JVM的垃圾回收器进行管理,因此存取速度相对较慢。但堆可以动态地分配内存大小,具有较大的灵活性。
  • 2.栈:栈的存取速度比堆要快,因为栈是线性表结构且由编译器静态分配内存。但栈的缺点是缺乏灵活性,其大小和存储的数据类型在编译时就已确定。

http://www.mrgr.cn/news/4763.html

相关文章:

  • 编译linux内核时,让版本号不跟着git变化
  • c#中Task.Run 和使用 Task 构造函数创建任务的区别
  • PhpStorm环境配置与应用
  • (秋招复习)自动驾驶与机器人中的SLAM技术(三)
  • rust操作rabbitmq
  • Notion使用详解
  • EmguCV学习笔记 VB.Net 2.S 特别示例
  • 【Python】Pydantic:快速上手
  • 【与C++的邂逅】--- 类和对象(中)
  • Web客户端软件测试
  • 通过剪枝与知识蒸馏优化大型语言模型:NVIDIA在Llama 3.1模型上的实践与创新
  • 供应链技术
  • 动态规划篇-代码随想录算法训练营第三十六天l 279.完全平方数,139.单词拆分,多重背包问题
  • 博物馆地图导览:利用GIS与蓝牙定位技术,融合语音解说功能
  • 软考-软件设计师(程序设计语言习题)
  • C# 程序运行内存优化的点
  • 【iOS】——响应者链和事件传递链
  • ES6解构赋值详解;全面掌握:JavaScript解构赋值的终极指南
  • Ubuntu 下 通过 Docker 部署 Vaultwarden 服务器
  • pytorch,半精度判断,半精度和全精度之间的转化。