- 1、本文档共12页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
从JVM内存管理的角度谈谈静态方法和静态属性和 java对象引用与JVM自动内存管理分类:?JAVA2010-08-04 11:17?1559人阅读?评论(2)?收藏?举报jvmjavareferenceclassloader编译器applet试着从JVM的内存管理原理的角度来谈一下静态方法和静态属性的问题,不对的地方请指正。 (/blog/264695)JVM的内存分为两部分:stack和heap?:?(code seg) (data seg)从硬盘load到code seg中之后如下所述stack(栈)是JVM的内存指令区。stack管理很简单,push一定长度字节的数据或者指令,stack指针压栈相应的字节位移;pop一定字节长度数据或者指令,stack指针弹栈。stack的速度很快,管理很简单,并且每次操作的数据或者指令字节长度是已知的。所以Java?基本数据类型,Java?指令代码,常量都保存在stack中。?heap?(堆)是JVM的内存数据区。heap?的管理很复杂,每次分配不定长的内存空间,专门用来保存对象的实例。在heap?中分配一定的内存来保存对象实例,实际上也只是保存对象实例的属性值,属性的类型和对象本身的类型标记等,并不保存对象的方法(方法是指令,保存在stack中),在heap?中分配一定的内存保存对象实例和对象的序列化比较类似。而对象实例在heap?中分配好以后,需要在stack中保存一个4字节的heap?内存地址,用来定位该对象实例在heap?中的位置,便于找到该对象实例。?由于stack的内存管理是顺序分配的,而且定长,不存在内存回收问题;而heap?则是随机分配内存,不定长度,存在内存分配和回收的问题;因此在JVM中另有一个GC进程,定期扫描heap?,它根据stack中保存的4字节对象地址扫描heap?,定位heap?中这些对象,进行一些优化(例如合并空闲内存块什么的),并且假设heap?中没有扫描到的区域都是空闲的,统统refresh(实际上是把stack中丢失了对象地址的无用对象清除了),这就是垃圾收集的过程。?我们首先要搞清楚的是什么是数据,什么是指令?然后要搞清楚对象的方法和对象的属性分别保存在哪里??为了便于描述,我简单的统称:?1)方法本身是指令的操作码部分,保存在stack中;?2)方法内部变量作为指令的操作数部分,跟在指令的操作码之后,保存在stack中(实际上是简单类型保存在stack中,对象类型在stack中保存地址,在heap?中保存值);?上述的指令操作码和指令操作数构成了完整的Java?指令。?3)对象实例包括其属性值作为数据,保存在数据区heap?中。?非静态的对象属性作为对象实例的一部分保存在heap?中,而对象实例必须通过stack中保存的地址指针才能访问到。因此能否访问到对象实例以及它的非静态属性值完全取决于能否获得对象实例在stack中的地址指针。?先分析一下非静态方法和静态方法的区别:?非静态方法有一个和静态方法很重大的不同:非静态方法有一个隐含的传入参数this,该参数是JVM给它的,和我们怎么写代码无关,这个隐含的参数就是对象实例在stack中的地址指针。因此非静态方法(在stack中的指令代码)总是可以找到自己的专用数据(在heap?中的对象属性值)。当然非静态方法也必须获得该隐含参数,因此非静态方法在调用前,必须先new一个对象实例,获得stack中的地址指针,否则JVM将无法将隐含参数传给非静态方法。?而静态方法无此隐含参数,因此也不需要new对象,只要class文件被ClassLoader load进入JVM的stack,该静态方法即可被调用。当然此时静态方法是存取不到heap?中的对象属性的。?总结一下该过程:当一个class文件被ClassLoader load进入JVM后,方法指令保存在stack中,此时heap?区没有数据。然后程序技术器开始执行指令,如果是静态方法,直接依次执行指令代码,当然此时指令代码是不能访问heap数据区的;如果是非静态方法,由于隐含参数没有值,会报错。因此在非静态方法执行前,要先new对象,在heap中分配数据,并把stack中的地址指针交给非静态方法,这样程序技术器依次执行指令,而指令代码此时能够访问到heap?数据区了。?再说一下静态属性和动态属性:?前面提到对象实例以及动态属性都是保存在heap?中的,而heap?必须通过stack中的地址指针才能够被指令(类的方法)访问到。因此可以推断出:静态属性是保存在stack中的,而不同于动态属性保存在heap?中。正因为都是在stack中,而stack中指令和数据都是定长的,因此很容易算出偏移量,也因此不管什么指令(类的方法),都可以访问到类的静态属性。也正因
您可能关注的文档
- Xmanager Enterprise 5配置XDMCP与Xstart无法远程连接RHEL5.11的解决方法.pdf
- XML及数据库交互技术的研究及实现.pdf
- XP_C_DXJSJJC第三篇.ppt
- XPE终端系统管理员指导.pdf
- XPwin7vista操作系统,IE8浏览器安装控件不成功处理方法.pdf
- xp系统C盘释放空间.doc
- Xp下grub4dos硬盘安装与启动FreeBSD-8.0-i386+GNOME桌面.pdf
- XP下驱动安装的顺序和IDE改AHCI后系统蓝屏安装IMSM解决的方法.pdf
- XP与WIN7两种恢复未保存word的方法(excel等类似).doc
- XX网站设计及实现.doc
最近下载
- 客车空调系统课件 第2章 空气调节的热力学基础.pptx VIP
- 客车空调系统课件 第7章 气流组织与风道设计.pptx VIP
- 客车空调系统课件 第3章 空调设备的结构与工作原理.pptx VIP
- 公路施工组织设计通用.docx VIP
- 客车空调系统课件 第6章 客车空调系统的布置.pptx VIP
- 客车空调系统课件 第11章 客车空调系统性能试验.pptx VIP
- 客车空调系统课件 第8章 空调客车的隔热和保温.pptx VIP
- 2024年基础医学《中药炮制学》考试题库及答案 .pdf VIP
- 客车空调系统课件 第10章 计算流体力学在客车空调系统设计中的应用.pptx VIP
- 新时代明德大学英语_Book1-Unit1电子教案.pdf VIP
文档评论(0)