Java内结存构详解.docVIP

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
   Java内存结构详解   广州疯狂软件学院拥有三大课程体系包括:java课程,android课程,ios课程,疯狂软件年终钜惠,报名java就业班,免费赠送基础班,名额有限,本月火热报名中,欢迎有志之士电话020者QQ544627560咨询。   Java把内存分成:栈内存,堆内存,方法区,本地方法区和寄存器等。   下面分别介绍栈内存,堆内存,方法区各自一些特性:   1、栈内存   (1)一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。   (2)每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。   (3)栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。   (4)当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后   ,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。   (5)当数据使用完,所占空间会自动释放。   2、堆内存   (1)堆内存用于存放由new创建的对象和数组。   (2)每一个实体都有一个内存地址值   (3)实体中的变量都有默认初始化值   (4)实体不再被使用,会在不确定的时间内被垃圾回收器回收   补充:数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!   3、方法区   1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。   2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。   方法区存放装载的类数据信息包括:   (1)基本信息:   1)每个类的全限定名   2)每个类的直接超类的全限定名(可约束类型转换)   3)该类是类还是接口   4)该类型的访问修饰符   5)直接超接口的全限定名的有序列表   (2)每个已装载类的详细信息:   1)运行时常量池:   存放该类型所用的一切常量(直接常量和对其它类型、字段、方法的符 号引用),它们以数组形式通过索引被访问,是外部调用与类联系及类型对象化的桥梁。它是类文件(字节码)常量池的运行时表示。(还有一种静态常量池,在字节码文件中)。   2)字段信息:   类中声明的每一个字段的信息(名,类型,修饰符)。   3)方法信息:   类中声明的每一个方法的信息(名,返回类型,参数类型,修饰符,方法的字节码和异常表)。   4)静态变量   5)到类 classloader 的引用:即到该类的类装载器的引用。   6)到类 class 的引用: 虚拟机为每一个被装载的类型创建一个 class 实例, 用来代表这个被装载的类   以上为栈内存,堆内存,方法区的一些特性,其中   栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义:   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的值。   注意:这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况a的修改并不会影响到b, 它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。   下面举例说明Java程序在内存中的分配:   拿String举例,其中String是一个特殊的包装类数据。可以用:   String str = new String(abc);   String str = abc;   两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。   而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放abc,如果没有,则将abc存放进栈,并令str指向abc,如果已经有abc 则直接令str指向abc.   比较类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==,下面用例子说明上

文档评论(0)

shaoye348 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档