一章概述内存分配机制.pdfVIP

  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文档。上传文档
查看更多

JVM内存分配机制

Java程序运行在JVM(JavaVirtualMachine,Java虚拟机)上,可以把JVM理解成Java程序

和操作系统之间的桥梁,JVM实现了Java的平台无关性,由此可

见JVM的重要性。所以在学习Java内存分配原理的时候一定要牢记这一切都是在JVM中进

行的,JVM是内存分配原理的基础与前提。

一个完整的Java程序运行过程会涉及以下内存区域:

寄存器:JVM虚拟寄存器,存取速度非常快,程序不制。

栈:保存局部变量的值,包括:a.用来保存基本数据类型的值;b.保存类的实例,即堆区对

象的(指针)。也可以用来保存加载方法时的帧。

堆:用来存放动态产生的数据,比如new出来的对象。注意创建出来的对象只包含属于各自

的成员变量,并不包括成员方法。因为同一个类的对象拥有各自的成员变量,在各自的堆

中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法一次。

常量池:JVM为每个已加载的类型一个常量池,常量池就是这个类型用到的常量的一个

有序集合。包括直接常量(基本类型,String)和对其他类型、方法、字段的符号(1)。池中

的数据和数组一样通过索引。由于常量池包含了一个类型所有的对其他类型、方法、字段

的符号,所以常量池在Java的动态中起了作用。常量池存在于堆中。

代码段:用来存放从硬盘上的源程序代码。

数据段:用来存放static定义的静态成员。

下图表示内存分配图:

对于java和内存之间,有如下几点需要注意:

1.一个Java文件,只要有main方法,我们就认为这是一个Java程序,可以单独编译

运行。

2.无

论是普通类型的变量还是类型的变量(俗称实例),都可以作为局部变量,他们都可以出

现在栈中。只不过普通类型的变量在栈中直接保存它所对应的值,而引

用类型的变量保存的是一个指向堆区的指针,通过这个指针,就可以找到这个实例在堆区对

应的对象。因此,普通类型变量只在栈区占用一块内存,而类型变量

要在栈区和堆区各占一块内存。

3.分清什么是实例什么是对象。Classa=newClass();此时a叫实例,而不能说a是对象。

实例在栈中,对象在堆中,操作实例实际上是通过实例的指针间接操作对象。多个实例可以指

向同一个对象。

4.栈中的数据和堆中的数据销毁并不是同步的。方法一旦结束,栈中的局部变量立即销毁,

但是堆中对象不一定销毁。因为可能有其他变量也指向了这个对象,直到栈中没有变量指向堆

中的对象时,它才销毁,而且还不是马上销毁,要等回收扫描时才可以被销毁。

5.以上的栈、堆、代码段、数据段等等都是相对于应用程序而言的。每一个应用程序都对应

唯一的一个JVM实例,每一个JVM实例都有自己的内存区域,互不影响。并且这些内存区域

是所有线程共享的。这里提到的栈和堆都是整体上的概念,这些堆栈还可以细分。

6.类的成员变量在不同对象中各不相同,都有自己的空间(成员变量在堆中的对象中)。

而类的方法却是该类的所有对象共享的,只有一套,对象使用方法的时候方法才被压入栈,方

法不使用则不占用内存。

文档评论(0)

四季豆 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档