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

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

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

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

在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。 引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。

java中变量在内存中的分配

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

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

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

附:java的内存机制

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

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

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

堆和栈区别 java_JAVA中堆和栈的区别相关推荐

  1. ajax的post跟get区别,Ajax中post与get的区别

    get和post都是向服务器发送一种请求,只是发送机制不同 . 1. GET可以通过在请求URL上添加请求参数, 而POST请求则是作为HTTP消息的实体内容发送给WEB服务器. 2. get方式请求 ...

  2. 堆和栈区别 java_Java中的堆和栈以及堆栈的区别

    在正式内容开始之前要说明一点,我们经常所说的堆栈堆栈是堆和栈统称,堆是堆,栈是栈,合在一起统称堆栈; 堆主要用来存放对象,栈用来执行程序.dnf自动收货工具的原理就是一个程序比如自动收货,先设置收的东 ...

  3. c语言中栈堆,全程剖析C语言中堆和栈的区别

    C语言中堆和栈的区别 1.申请方式 (1)栈(satck):由系统自动分配.例如,声明在函数中一个局部变量int b;系统自动在栈中为b开辟空间. (2)堆(heap):需程序员自己申请(调用mall ...

  4. php栈内存和堆内存的区别,内存中堆和栈的区别

    堆和栈的区别: ·      1> 堆空间的内存是动态分配的,一般存放对象,并且需要手动释放内存. ·      2> 栈空间的内存由系统自动分配,一般存放局部变量等,不需要手动管理内存. ...

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

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

  6. 栈和堆存储在计算机RAM中,堆内存和栈内存及C++内存分配

    1.现代操作系统内存管理主流的操作系统(Windows,Linux)都采用虚拟内存管理的方式,具体说就是:页式管理.段式管理.段页式管理. 操作系统分配资源的单位是进程,所以,内存管理的过程也是以进程 ...

  7. 周志朋java_java中堆和垃圾回收机制的介绍

    java中堆和垃圾回收机制的介绍 发布时间:2020-07-03 14:55:53 来源:亿速云 阅读:113 作者:元一 这篇文章将为大家详细讲解有关java中堆和垃圾回收机制的介绍,文章内容质量较 ...

  8. 继承和实现区别java_java中继承和实现有什么区别,分别给程序带来了怎样的好处?...

    一.诉讼中的财产保全与执行程序中的财产保全有什么区别 一个明显的区别是依据不同:诉讼中的财产保全,是在生效判决尚未产生之前:而执行程序中的财产保全,已经是在执行生效判决了.至于启动主体,原则上都是应当 ...

  9. 栈空间_Linux中的进程栈和线程栈

    1. 进程栈 进程栈是属于用户态栈,和进程虚拟地址空间 (Virtual Address Space) 密切相关.那我们先了解下什么是虚拟地址空间:在 32 位机器下,虚拟地址空间大小为 4G.这些虚 ...

最新文章

  1. 老焦专栏 | 如何做一个有说服力的方案?
  2. 工作总结 Rezor 里面的一些小知识----自定义类型 放在标签值中 会直接跳过去...
  3. following symbols must have non local/private scope错误问题解决方法
  4. 为什么计算机硬盘要从c盘开始,电脑分区为何从C盘开始?英特尔科普
  5. c++语言程序设计——头文件和引用系统头文件、用户头文件的定义及使用方法
  6. npm install 卡住的时候的处理
  7. 新大陆java工程师笔试题_完美世界,中兴,新大陆支付面经
  8. 用C语言进行BMP文件的读写
  9. spring authorization server授权服务器教程,资源服务器搭建接入认证服务器
  10. 满足AUTOSAR基础软件要求的硬件安全模块(HSM)加密运算
  11. Python文本处理——中文标点符号处理
  12. 低阶的Newton-Cotes求积公式 | 梯形求积公式、Simpson求积公式、Cotes求积公式
  13. VBA编程_Selection总结
  14. MySQL联合主键解释
  15. 【金融大屏项目】—— Echarts水滴图(echarts-liquidfill)
  16. 最简单明了的QQ在线客服代码
  17. 程序员春招是什么时候?什么是金三银四?
  18. 什么是特斯拉?他和爱迪生相爱相杀。
  19. 无人驾驶视觉-单目视觉里程计
  20. 开放式组织无需为Kool-Aid服务

热门文章

  1. mysql返回对象_使用mysql_fetch_object()以对象的形式返回查询结果
  2. java计算两列数据差_DAX计算列基于其他表中的两列
  3. 计算机二级只有前十套简单,计算机二级Access上机十套试题详细解析(经典版).
  4. jvisualvm离线安装visualgc插件
  5. css的类选择器#和id选择器.
  6. echarts 不显示标题_图标echarts使用
  7. websocket连接出现 HTTP Authentication failed; no valid credentials available
  8. ORACLE表空间使用量查询SQL
  9. c语言 __FILE__,__DATE__,__TIME__ (宏)
  10. 实现连接池技术的样例