已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1.Java的内存机制Java 把内存划分成两种:一种是栈内存,另一种是堆内存。在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后(比如,在函数A中调用函数B,在函数B中定义变量a,变量a的作用域只是函数B,在函数B运行完以后,变量a会自动被销毁。分配给它的内存会被回收),Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。堆内存用来存放由 new 创建的对象和数组,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或者对象,引用变量就相当于是为数组或者对象起的一个名称。引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。这也是 Java 比较占内存的原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!代码实例Test01:单个对象创建 View Code class Person String name; int age; public void tell() System.out.println(姓名:+name+年龄+age); public class Test01 public static void main(String args) Person per=new Person(); 在上述程序中实例化了一个对象per,在实例化对象的过程中需要在内存中开辟空间,这其中就包括栈内存和对内存。具体的内存分配如下图所示:我们可以从上图中发现,对象名称per被保存在了栈内存中(更加准确的说法是,在栈内存中保存的是堆内存空间的访问地址),而对象的具体内容,比如属性name和age,被保存在了堆内存中。因为per对象只是被实例化,还没有具体被赋值,所以都是默认值。字符串的默认值为null,int类型的默认值为0。前面也已经提到,堆内存空间必须使用new关键字才能开辟。代码实例Test02:多个对象创建 View Code class Person String name; int age; public void tell() System.out.println(姓名:+name+,年龄:+age); public class Test02 public static void main(String args) Person per1=new Person(); Person per2=new Person(); =张三; per1.age=30; =李四; per2.age=33; per1.tell(); per2.tell(); 关键概念:类跟数组一样,都是属于引用类型,引用类型就是指一堆对内存可以同时被多个栈内存指向。下面来看一下引用传递的简单实例。代码实例Test03:对象引用传递1View Codeclass Person String name; int age; public void tell() System.out.println(姓名:+name+,年龄:+age); public class Test03 public static void main(String args) Person per1=new Person(); Person per2=per1; =张三; per1.age=30; per2.age=33; per1.tell(); per2.tell(); 程序运行结果为:姓名:张三,年龄:33姓名:张三,年龄:33从程序的运行结果可以发现,两个对象输出的内容一样,实际上所谓的引用传递,就是将一个堆内存空间的使用权交个多个栈内存空间,每个栈内存空间都可以修改堆内存空间的内容,此程序的内存分配图如下所示:注意:上述实例中对象per2没有堆内存空间,这是因为对象per2只进行了声明操作,也没有进行实例化操作。只有使用new关键字实例化以后才会有对内存空间。代码实例Test04:对象引用传递2 View Code class Person String name; int age; public void tell() System.out.println(姓名:+name+,年龄:+age); public class Test04 public static void main(String args) Person per1=new Person(); Person per2=new Person(); =张三; per1.age=30; =李四; per2.age=33; per2=per1; per1.tell(); per2.tell(); 上述程序运行结果为:姓名:张三,年龄:30姓名:张三,年龄:30从程序的输出结果可以发现可Test03一样。不过内存分配发生了一些变化,具体如下所示:注意点:1. Java本身提供垃圾收集机制(Garbage Collection,GC),会不定期施放不用的内存空间,只要对象不用了,就会等待GC释放空间,如上面堆内存中的name=李四;age=33。2. 一个栈内存只能指向一个对内存空间,如果要想再指向其他的堆内存空间,则必须先断开已有的指向才能分配新的指向。java中常用的内存区域在ja
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年遂宁市中考物理试卷(含答案)
- 智研咨询重磅发布:中国叶黄素行业供需态势、市场现状及发展前景预测报告
- 石家庄市井陉矿区招聘社区网格员备考题库附答案详解
- 初中英语关系代词暑假预科精讲|新年级新课提前学
- 《小学数学专注力培养课|培养专注 提升效率》
- 第五讲 人造地球卫星教学设计高中物理华东师大版上海拓展型课程II-华东师大版上海2010
- 部编版中考九年级下册语文素材作文指导教案+中考满分作文:书中有个“我”(7篇)
- 2026年郑州黄河护理职业学院单招职业适应性测试题库及参考答案详解
- 六升七 化学化学变化课|认识化合分解置换
- 泾川县飞云乡招聘社区网格员真题附答案详解
- 2026春小学信息技术四年级下册期末练习卷(清华版贵州)含参考答案
- 2026年人教版四年级语文下册期末考试题及答案
- 2024-2025学年广东省五校高一下学期期末联考化学试题含答案
- 中国生育报告2026
- 2026中国焦糖色素市场营销前景展望及投资价值创新性研究报告
- 2026五年级道德与法治下册 历史教育课程
- 2026年危险货物水路运输从业人员资格复习提分资料带答案详解(研优卷)
- 无锡中考历史试卷2024整张
- 血透室质量管理工作制度
- 2025年东南大学强基计划招生数学试卷试题真题(含答案详解)
- 北京人朝初一分班考英语试题及答案
评论
0/150
提交评论