在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。

当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。

堆内存用来存放由new创建的对象和数组。

在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。

在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。

引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。

java中变量在内存中的分配

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

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

3、局部变量:局部变量,由声明在某方法,或某代码段里(比如for循环),执行到它的时候在栈中开辟内存,当局部变量一但脱离作用域,内存立即释放

附:java的内存机制

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

  堆内存用来存放由 new 创建的对象和数组,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或者对象,引用变量就相当于是为数组或者对象起的一个名称。引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。

  这也是 Java 比较占内存的原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!

转载于:https://www.cnblogs.com/tanjianwen/p/5245404.html

【转载】关于Java堆和栈的解释,收藏下来以后学习相关推荐

  1. Java堆和栈的基本理解

    Java 堆和栈的区别 参考背景: 堆内存:用来存放由new创建的对象和数组: 栈内存:存放基本类型的变量,对象的引用变量: 堆存放的原因:由于在堆中创建对象(或数组)后,可在栈中定义一个特殊变量,让 ...

  2. Java:堆和栈的区别

    文章目录 前言 一.Java堆栈常见问题 二.问题理解 1.为什么要区分堆和栈 静态分配 动态分配 Java中的堆 2.堆和栈的区别 3.为什么堆是线程共享的而栈不是? 4.我们平时说的堆栈信息.堆栈 ...

  3. Java堆和栈的区别/联系详解

    Java堆和栈的区别/联系详解 关于Java中堆栈内存的知识,算是基础知识,和C语言中的指针有一些类似,面试中也经常会被问到,特别是跟Java和C都有关的开发工作. 一.堆栈的联系 在Java中,内存 ...

  4. Java堆和栈的一些区别。。。

    栈与堆都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. Java的堆是一个运行时数据区,类的(对象从中分配空间.这些对象通过new.newa ...

  5. Java堆、栈、内存分析

    在 JAVA 中,有六个不同的地方可以存储数据: 1. 寄存器( register ).这是最快的存储区,因为它位于不同于其他存储区的地方--处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根 ...

  6. java堆和栈 常量池_GitHub - han-guang-xue/difference-of-stack-heap-pool: Java中堆、栈和常量池的区别...

    Java中堆.栈和常量池的区别 栈 堆 常量池的概念 首先我们先了解一下概念,Java把内存分成两种,一种叫做栈内存,一种叫做堆内存. 栈内存 存放基本类型的变量数据和对象类型的引用(请注意存放的是引 ...

  7. java堆和栈的区别_JAVA中堆和栈的区别

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

  8. java堆、栈、堆栈,常量池的区别,史上最全总结

    先说一下栈和堆栈,我们听老一辈的程序员一般都会说堆栈,其实栈就是堆栈的意思,连着叫只是由于历史的原因.博主04年学数据结构的时候,书上都是说的堆栈,FILO(先进后出),也经常拿堆栈和队列,FIFO( ...

  9. 【转载】iOS堆和栈的理解

    操作系统iOS 中应用程序使用的计算机内存不是统一分配空间,运行代码使用的空间在三个不同的内存区域,分成三个段:"text segment ","stack segmen ...

最新文章

  1. linux 查看 内存 占用,Linux终端:用smem查看内存占用情况
  2. down 网卡端口周期性的up_Linux 中如何启用和禁用网卡?
  3. RVDS4.0上开发cortex A8 NEON程序
  4. 南京晓庄学院计算机网络试卷,南京晓庄学院计算机网络8套卷(完整含答案)
  5. elementui el-upload 删除指定文件
  6. 字符串匹配——C++使用Regex
  7. 捕鱼达人 FishMaster 记录(Done)
  8. SQLite数据库可视化工具【SQLiteStudio】的下载及安装
  9. 简单几步教你爬取IOS手机端APP数据
  10. 新颖的自我介绍_新颖的自我介绍6篇
  11. mysql help_深入理解mysql帮助命令(help)
  12. java写快递柜管理系统
  13. 如何生成EAN13流水号条形码
  14. double函数和int函数
  15. Adobe Illustrator教程
  16. ORACLE中的各种SCN查询
  17. java飞机大战飞机背景滚动_飞机大战背景/音效动起来
  18. Kotlin ListView设置Adapter
  19. Excel VBA实例
  20. 云服务器维护成本,云服务器维护成本

热门文章

  1. Android异步处理二:AsynTask介绍和使用AsyncTask异步更新UI界面
  2. Linux日志系统-08:定时执行脚本
  3. linux中pthread_kill函数详解
  4. 已解决:IAR编译时出现duplicate definitions for IAR报错
  5. 利用STM32 的串口来发送和接收数据实验
  6. letcode 41. 缺失的第一个正数
  7. Web的诞生和网络基础 | 读《图解HTTP》
  8. @GetMapping和@PostMapping接收参数的格式
  9. 美国宇航局:十年内VR/AR设备将成为标配
  10. 使用virtualbox nat方式中的端口映射使用ssh服务