介绍Java语言有关内存分配的知识。Java语言把内存分为两种:栈内存堆内存

栈内存

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

堆内存

堆内存用来存放由 new 运算符创建的数组或对象,在堆中分配的内存,由Java虚拟机的垃圾回收器来自动管理。在堆中创建了一个数组或对象后,同时还在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,引用变量实际上保存的是数组或对象在堆内存中的首地址(也称为对象的句柄),以后就可以在程序中使用栈的引用变量来访问堆中的数组或对象。

引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。引用变量就相当于是为数组或对象起的一个名称。而数组或对象本身在堆内存中分配,即使程序运行到使用 new 运算符创建数组或对象的语句所在的代码块之外,数组或对象本身所占据的内存也不会被释放,数组或对象在没有引用变量指向它时,会变为垃圾,不能再被使用,但仍然占据内存空间不放,在随后一个不确定的时间被垃圾回收器收走(释放掉),这也是Java比较占内存的原因。

Java有一个特殊的引用型常量null,如果将一个引用变量赋值为null,则表示该引用变量不指向(引用)任何对象。


下面通过一个数组案例进行演示,以对栈内存和堆内存有更深的了解。

一维数组是最简单的数组,其逻辑结构是线性表。要使用一维数组,需要先声明数组;分配空间;创建数组元素并赋值。

数据类型 [] 数组名;             //声明一维数组数组名 = new 数据类型[个数];    //分配内存给数组

在数组的声明格式里,“数据类型”是声明数组元素的数据类型,可以是Java语言中任意的数据类型,包括基本类型和引用类型。

与C/C++语言不同,Java语言在数组的定义中并不为数组元素分配内存,因此“[]”中不用给出数组中元素的个数(即数组的长度),但必须在为它分配内存空间后才可使用。

数组声明之后,接下来就要分配数组所需的内存,这时必须用运算符new,利用new运算符为数组元素分配内存空间的方式称为动态内存分配方式

int [] x;    //声明名称为x的int型数组
x = new int[10]; //x数组中包含有10个元素,并为这10元素分配内存空间

在声明数组时,也可以将两个语句合并成一行,格式如下:

数据类型 [] 数组名 = new 数据类型[个数];
int [] x = new int[10];

等号左边的 “int [] x ”相当于定义了一个特殊的变量x,x的数据类型是一个对 int 型数组对象的引用,x就是一个数组的引用变量,其引用的数组元素个数不定。等号右边的 “new int[10]” 就是在堆内存中创建一个具有10个int型变量的数组对象。其意义就是将右边的数组对象赋值给左边的数组引用变量。

这里我们先声明一个数组,例如:

int [] x;  //定义了一个数组x

这条语句执行完成后的内存状态如图下所示。

这时只声明了数组,而没有对其分配内存空间。现在我们为数组元素分配内存空间。

x = new int[10];  //初始化数组

这条语句执行完后的内存状态如图下所示。

声明数组并分配相应的内存空间,引用变量指向数组对象

执行“x=new int[10];”后,在堆内存里创建了一个数组对象,为这个数组对象分配了10个整数单元,并将数组对象赋给了数组引用变量x。引用变量就相当于C语言中的指针变量,而数组对象就是指针变量指向的那个内存块。所以在Java内部还是有指针,只是把指针的概念对用户隐藏起来了,而用户所使用的是引用变量。

用户也可以改变x的值,让它指向另外一个数组对象,或者不指向任何数组对象。要想让x不指向任何数组对象,只需要将常量null赋给x即可。如执行“x = null;”语句后的内存状态如图下所示。

执行完“x = null;”语句后,原来通过new int[10]产生的数组对象不再被任何引用变量所引用,变成了所谓的“垃圾”,直到垃圾回收器来将它释放掉。


感谢大家的耐心阅读,如有建议请私信或评论留言

浅谈Java栈内存和堆内存相关推荐

  1. java方法区对象类型_浅谈Java内存区域与对象创建过程

    一.java内存区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区域则 ...

  2. 浅谈Java中的栈和堆

    人们常说堆栈堆栈,堆和栈是内存中两处不一样的地方,什么样的数据存在栈,又是什么样的数据存在堆中? 这里浅谈Java中的栈和堆 首先,将结论写在前面,后面再用例子加以验证. Java的栈中存储以下类型数 ...

  3. Java栈内存、堆内存、方法区对对象和引用的关系

    问题:Java栈内存.堆内存.方法区对对象和引用的关系 答案: 1.单个对象 如图所示: (1)首先类加载器加载要运行的类,首先将main方法加载进方法区,并进栈内存,顺序执行代码,创建对象,将对象的 ...

  4. java中栈和堆都存哪些东西_java中栈内存与堆内存(JVM内存模型)

    java中栈内存与堆内存(JVM内存模型) Java中堆内存和栈内存详解1 和 Java中堆内存和栈内存详解2 都粗略讲解了栈内存和堆内存的区别,以及代码中哪些变量存储在堆中.哪些存储在栈中.内存中的 ...

  5. 浅谈Java内存模型、并发、多线程

    浅谈Java内存模型.并发.多线程 Java内存模型(Java Memory Model)是围绕着在并发编程中如何处理原子性,可见性,有序性三个特性而建立的模型. 下面我简单描述一下这三个特性: 原子 ...

  6. java 内存堆和栈_java中堆内存与栈内存的知识点总结

    一.概述 在Java中,内存分为两种,一种是栈内存,另一种就是堆内存. 二.堆内存 1.什么是堆内存? 堆内存是Java内存中的一种,它的作用是用于存储Java中的对象和数组,当我们new一个对象或者 ...

  7. Java中的栈内存和堆内存

    共两篇文章 第一篇 1.Java中对象都是分配在heap(堆)中.从heap中分配内存所消耗的时间远远大于从stack产生存储空间所需的时间. (1)每个应用程序运行时,都有属于自己的一段内存空间,用 ...

  8. java 堆内存和栈内存的区别_java中栈内存和堆内存有什么区别

    栈内存和堆内存的区别: 1.栈内存用来存放基本类型的变量和引用变量,堆内存用来存储java中的对象,无论是成员变量,局部变量,还是类变量,他们指向的对象都存储在堆内存中. (视频教程推荐:java视频 ...

  9. python释放变量内存_Python尚学堂高淇|1113引用的本质栈内存,堆内存,内存的示意图,标识符,变量的声明初始化,垃圾回收机制...

    011-引用的本质-栈内存和堆内存-内存的示意图在Python当中,变量也成为:对象的引用,因为,变量的存储就是对象的地址变量通过地址引用了对象变量位于堆内存(压栈,出栈等细节,后续再介绍)对象位于: ...

  10. 栈内存和堆内存的区别

    总结: 1 栈:为编译器自动分配和释放,如函数参数.局部变量.临时变量等等 2 堆:为成员分配和释放,由程序员自己申请.自己释放.否则发生内存泄露.典型为使用new申请的堆内容. 除了这两部分,还有一 ...

最新文章

  1. 简单完整地讲解tensorflow模型的保存和恢复
  2. 斯坦福CRFM遭业界炮轰:深度学习做不了基础模型!
  3. 如何判断浏览器的请求头是不是结束
  4. STM32 进阶教程 2 - micropython 使用
  5. nginx下rewrite规则中参数超过10 $10 解决方案
  6. 树(5)-----判断两颗树一样或者一棵树是否是另外一颗的子树
  7. 立刻、马上对你的电脑做这三件事!
  8. 黑帽大会:苹果网络服务器比微软易入侵
  9. 动态新增表字段_动态称重检测系统助力智慧治超
  10. 深入剖析BIO到NIO演变史
  11. 中华优秀传统文化教育的有效渗透
  12. 如何理解静态库与动态库
  13. 集合例题3.:现在有一个map集合如下:Map<Integer,String> map = new HashMap<Integer, String>();map.put(1, “张三丰“);map.
  14. 文档服务器 件排名,全国服务器排名
  15. Tushare Day7—— 第19章投资组合理论及拓展
  16. Node.js 动手实现简单的模板引擎(列表渲染)
  17. mysql查询手机号199开头_从今天起,你将能用上199开头的手机号了……
  18. 日语资料和电子版教材无偿分享
  19. oracle dba_waiters中的lockid是什么,查询Oracle中的阻塞锁(以及阻塞在哪个数据上)的SQL...
  20. 阿里巴巴李云的一封信

热门文章

  1. java opts配置_JAVA_OPTS设置参数
  2. oracle数据库自动修复,【案例】Oracle数据库由于存在坏块导致无法启动的恢复过程...
  3. 最小角回归算法(LARS)
  4. formidable词根词缀_SAT词根词缀汇总内容(6)
  5. Python搭建QQ机器人,监控QQ发言与进群退群,自动@新成员并屏蔽脏话踢人
  6. 利用Excel绘制超好看的直方图与正态分布曲线
  7. 小郡肝火锅点餐系统代码实现(部分)
  8. libx264开发笔记(一):libx264介绍、海思平台移植编译
  9. vue设置必填项和判断必填项是否填入的弹窗提示
  10. element-ui ele-calendar 清除选中 事件