[2017年整理]Java内存结构详解

上传人:豆浆 文档编号:910297 上传时间:2017-05-21 格式:DOC 页数:3 大小:30.50KB
返回 下载 相关 举报
[2017年整理]Java内存结构详解_第1页
第1页 / 共3页
[2017年整理]Java内存结构详解_第2页
第2页 / 共3页
[2017年整理]Java内存结构详解_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《[2017年整理]Java内存结构详解》由会员分享,可在线阅读,更多相关《[2017年整理]Java内存结构详解(3页珍藏版)》请在金锄头文库上搜索。

1、 Java 内存结构详解广州疯狂软件学院拥有三大课程体系包括:java 课程,android 课程,ios课程,疯狂软件年终钜惠,报名 java 就业班,免费赠送基础班,名额有限,本月火热报名中,欢迎有志之士电话 020-28309358 或者 QQ544627560 咨询。Java 把内存分成:栈内存,堆内存,方法区,本地方法区和寄存器等。下面分别介绍栈内存,堆内存,方法区各自一些特性:1、栈内存(1)一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。(2)每个栈中的数据 (原始类型和对象引用) 都是私有的,其他栈不能访问。(3)栈分为 3 个部分:基本类型变量区、执行环境上下文、

2、操作指令区(存放操作指令)。(4)当在一段代码块中定义一个变量时,java 就在栈中为这个变量分配内存空间,当超过变量的作用域后,java 会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。(5)当数据使用完,所占空间会自动释放。2、堆内存(1)堆内存用于存放由 new 创建的对象和数组。(2)每一个实体都有一个内存地址值(3)实体中的变量都有默认初始化值(4)实体不再被使用,会在不确定的时间内被垃圾回收器回收补充:数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是 java 比较占内存的主要原

3、因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针 !3、方法区1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的 class 和static 变量。2.方法区中包含的都是在整个程序中永远唯一的元素,如 class,static 变量。方法区存放装载的类数据信息包括:(1)基本信息:1) 每个类的全限定名2) 每个类的直接超类的全限定名(可约束类型转换)3) 该类是类还是接口4) 该类型的访问修饰符5) 直接超接口的全限定名的有序列表(2)每个已装载类的详细信息:1) 运行时常量池:存放该类型所用的一切常量(直接常量和对其它类型、字段、方法的符 号引用),它们以数组

4、形式通过索引被访问,是外部调用与类联系及类型对象化的桥梁。它是类文件(字节码)常量池的运行时表示。(还有一种静态常量池,在字节码文件中)。2) 字段信息:类中声明的每一个字段的信息(名,类型,修饰符)。3) 方法信息:类中声明的每一个方法的信息(名,返回类型,参数类型,修饰符,方法的字节码和异常表)。4) 静态变量5) 到类 classloader 的引用:即到该类的类装载器的引用。6) 到类 class 的引用: 虚拟机为每一个被装载的类型创建一个 class 实例,用来代表这个被装载的类以上为栈内存,堆内存,方法区的一些特性,其中栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们

5、同时定义:int a = 5;int b = 5;编译器先处理 int a = 5;首先它会在栈中创建一个变量为 a 的引用,然后查找栈中是否有 5 这个值,如果没找到,就将 5 存放进来,然后将 a 指向 5.接着处理 int b = 5;在创建完 b 的引用变量后,因为在栈中已经有 5 这个值,便将 b 直接指向 5.这样,就出现了 a 与 b 同时均指向 5 的情况。这时,如果再令 a=8;那么编译器会重新搜索栈中是否有 8 值,如果没有,则将 8 存放进来,并令 a 指向 8;如果已经有了,则直接将 a 指向这个地址。因此 a 值的改变不会影响到 b 的值。注意:这种数据的共享与两个对

6、象的引用同时指向一个对象的这种共享是不同的,因为这种情况 a 的修改并不会影响到 b, 它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。下面举例说明 Java 程序在内存中的分配:拿 String 举例,其中 String 是一个特殊的包装类数据。可以用:String str = new String(abc);String str = abc;两种的形式来创建,第一种是用 new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。而第二种是先在栈中创建一个对 String 类的对象引用变量 str,然后查找栈中有没

7、有存放abc,如果没有,则将abc 存放进栈,并令 str 指向abc, 如果已经有abc 则直接令 str 指向abc.比较类里面的数值是否相等时,用 equals()方法; 当测试两个包装类的引用是否指向同一个对象时,用=,下面用例子说明上面的理论。String str1 = abc;String str2 = abc;System.out.println(str1=str2); /true/可以看出 str1 和 str2 是指向同一个对象的。String str1 =new String (abc);String str2 =new String (abc);System.out.pr

8、intln(str1=str2); / false/用 new 的方式是生成不同的对象。每一次生成一个。因此用第一种方式创建多个abc字符串,在内存中其实只存在一个对象而已。这种写法有利与节省内存空间。 同时它可以在一定程度上提高程序的运行速度,因为 JVM 会自动根据栈中数据的实际情况来决定是否有必要创建对象。而对于 String str = new String(abc);的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是有必要创建新对象,从而加重了程序的负担。另一方面, 要注意: 我们在使用诸如 String str = abc;的格式定义类时,总是想当然地认为,创建了 Str

9、ing 类的对象 str.当心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的对象。只有通过 new()方法才能保证每次都创建一个新的对象。疯狂 Java 培训专注软件开发培训,提升学员就业能力,重点提升实践动手能力。技术知识沉淀深厚的老师,让你感受 Java 的魅力,激发你对于编程的热爱,让你在半年的时间内掌握 8-10 万的代码量,掌握 Java 核心技术,成为真正的技术高手;通过大量全真企业项目疯狂训练,迅速积累项目经验。让你成为技能型的现代化高端人才,迅速获得高薪就业!时间不等人,赶紧联系我们吧!疯狂 java 培训中心地址:广州天河区车陂沣宏大厦 3 楼。疯狂 Java 培训专注软件开发培训 (疯狂软件学院咨询 QQ:707552864 电话020-28309378 详情请咨询官网),提升学员就业能力,重点提升实践动手能力。疯狂软件开设了 java 课程,ios 课程,android 课程,为你提供一个学习 java 技能的好机会,疯狂软件特大优惠活动,加疯狂软件微信号(疯狂软件),抢优惠,优惠100 元+赠送 iOS 教材一本 详情请看疯狂 java 培训官网。IT 从业着仍是社会所需要的高端人才,广州疯狂软件之力于培养企业所需要的中高端 IT 人才,让你成为备受企业青睐的人才。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号