博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Big Data 每日一题20181111】为什么有栈内存和堆内存之分
阅读量:4216 次
发布时间:2019-05-26

本文共 896 字,大约阅读时间需要 2 分钟。

为什么有栈内存和堆内存之分?

        数组引用变量只是一个引用,这个引用变量可以指向任何有效的内存,只有当该引用指向有效内存,才可以通过该数组变量来访问数组。

       实际的数组对象被储存在堆(heap)内存中;如果引用该数组对象引用变量是一个局部变量,那么它被储存在栈(stack)内存中。

        当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁了。因此,所有在方法中定义的变量都是放在栈内存中的;当我们在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(因为对象的创建成本通常较大),这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(方法的参数传递时很常见),则这个对象依然不会被销毁。只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在合适的时候回收它。

       如果堆内存中数组不再有任何引用变量指向自己,则这个数组将成为垃圾,该数组所占的内存将会被系统的垃圾回收机制回收。因此,为了让垃圾回收机制回收一个数组所占的内存空间,则可以将该数组变量赋为null,也就切断了数组引用变量和实际数组之间的引用关系,实际数组也就成了垃圾。

数组是一种引用数据类型,数组引用变量只是一个引用,数组元素和数组变量在内存里是分开存放的。下面将深入介绍数组在内存中的运行机制。

数组引用变量只是一个引用,这个引用变量可以指向任何有效的内存,只有当该引用指向有效内存后,才可通过该数组变量来访问数组元素。

与所有引用变量相同的是,引用变量是访问真实对象的根本方式。也就是说,如果我们希望在程序中访问数组,则只能通过这个数组的引用变量来访问它。

实际的数组元素被存储在堆(heap)内存中;数组引用变量是一个引用类型的变量,被存储在栈(stack)内存中。数组在内存中的存储示意图如图4.2所示: 

图4.2 数组在内存中的存储示意图 
如果需要访问图4.2中堆内存中的数组元素,程序中只能通过p[index]的形式实现。也就是说,数组引用变量是访问堆内存中数组元素的唯一方式。

转载地址:http://iyvmi.baihongyu.com/

你可能感兴趣的文章
让网站性能最佳的34条黄金守则
查看>>
老紫竹JAVA基础培训(5),IF语句的使用
查看>>
JAVA生成EXCEL文件
查看>>
java读取xml配置文件(小结)
查看>>
Java新手的通病[4]:异常处理使用不当
查看>>
java编程中的常见异常
查看>>
java读写文件大全
查看>>
Java垃圾回收器的工作机制
查看>>
SQL优化34条 java面试题
查看>>
java sql常见面试题
查看>>
Java同步、异步相关知识点
查看>>
java线程总结
查看>>
Java性能优化[1]:基本类型 vs 引用类型
查看>>
Java 短路运算符和非短路运算符
查看>>
XML的两种解析方式Dom和SAX的区别
查看>>
使用 SAX 处理 XML 文档
查看>>
session与cookie的区别
查看>>
java中数据类型转换
查看>>
Java运算符、 &&与&、||与|区别
查看>>
Java 算术运算符
查看>>