ImageVerifierCode 换一换
格式:DOC , 页数:2 ,大小:23.50KB ,
资源ID:9366479      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-9366479.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Java类存管理.doc)为本站会员(kpmy5893)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

Java类存管理.doc

1、从 JVM 内存管理的角度谈谈静态方法和静态属性我试着从 JVM 的内存管理原理的角度来谈一下静态方法和静态属性的问题,不对的地方请指正。 JVM 的内存分为两部分:stack 和 heap: stack(栈)是 JVM 的内存指令区。stack 管理很简单,push 一定长度字节的数据或者指令,stack 指针压栈相应的字节位移;pop 一定字节长度数据或者指令,stack 指针弹栈。stack 的速度很快,管理很简单,并且每次操作的数据或者指令字节长度是已知的。所以 Java 基本数据类型,Java 指令代码,常量都保存在 stack 中。 heap(堆)是 JVM 的内存数据区。heap

2、 的管理很复杂,每次分配不定长的内存空间,专门用来保存对象的实例。在 heap 中分配一定的内存来保存对象实例,实际上也只是保存对象实例的属性值,属性的类型和对象本身的类型标记等,并不保存对象的方法(方法是指令,保存在 stack 中),在 heap 中分配一定的内存保存对象实例和对象的序列化比较类似。而对象实例在 heap 中分配好以后,需要在 stack 中保存一个4 字节的 heap 内存地址,用来定位该对象实例在 heap 中的位置,便于找到该对象实例。 由于 stack 的内存管理是顺序分配的,而且定长,不存在内存回收问题;而 heap 则是随机分配内存,不定长度,存在内存分配和回收

3、的问题;因此在 JVM 中另有一个 GC 进程,定期扫描 heap,它根据 stack 中保存的 4 字节对象地址扫描 heap,定位 heap 中这些对象,进行一些优化(例如合并空闲内存块什么的) ,并且假设 heap 中没有扫描到的区域都是空闲的,统统 refresh(实际上是把 stack 中丢失了对象地址的无用对象清除了) ,这就是垃圾收集的过程。 我们首先要搞清楚的是什么是数据,什么是指令?然后要搞清楚对象的方法和对象的属性分别保存在哪里?为了便于描述,我简单的统称: 1)方法本身是指令的操作码部分,保存在 stack 中; 2)方法内部变量作为指令的操作数部分,跟在指令的操作码之后

4、,保存在 stack 中(实际上是简单类型保存在 stack 中,对象类型在 stack 中保存地址,在 heap 中保存值) ; 上述的指令操作码和指令操作数构成了完整的 Java 指令。 3)对象实例包括其属性值作为数据,保存在数据区 heap 中。 非静态的对象属性作为对象实例的一部分保存在 heap 中,而对象实例必须通过 stack 中保存的地址指针才能访问到。因此能否访问到对象实例以及它的非静态属性值完全取决于能否获得对象实例在 stack 中的地址指针。 先分析一下非静态方法和静态方法的区别: 非静态方法有一个和静态方法很重大的不同:非静态方法有一个隐含的传入参数,该参数是 JV

5、M 给它的,和我们怎么写代码无关,这个隐含的参数就是对象实例在 stack 中的地址指针。因此非静态方法(在 stack中的指令代码)总是可以找到自己的专用数据(在 heap 中的对象属性值) 。当然非静态方法也必须获得该隐含参数,因此非静态方法在调用前,必须先 new 一个对象实例,获得 stack 中的地址指针,否则 JVM将无法将隐含参数传给非静态方法。 而静态方法无此隐含参数,因此也不需要 new 对象,只要 class 文件被 ClassLoader load 进入 JVM 的stack,该静态方法即可被调用。当然此时静态方法是存取不到 heap 中的对象属性的。 总结一下该过程:当

6、一个 class 文件被 ClassLoader load 进入 JVM 后,方法指令保存在 stack 中,此时heap 区没有数据。然后程序技术器开始执行指令,如果是静态方法,直接依次执行指令代码,当然此时指令代码是不能访问 heap 数据区的;如果是非静态方法,由于隐含参数没有值,会报错。因此在非静态方法执行前,要先 new 对象,在 heap 中分配数据,并把 stack 中的地址指针交给非静态方法,这样程序技术器依次执行指令,而指令代码此时能够访问到 heap 数据区了。 再说一下静态属性和动态属性: 前面提到对象实例以及动态属性都是保存在 heap 中的,而 heap 必须通过 stack 中的地址指针才能够被指令(类的方法)访问到。因此可以推断出:静态属性是保存在 stack 中的(基本类型保存在 stack 中,对象类型地址保存在 stack,值保存在 heap 中) ,而不同于动态属性保存在 heap 中。正因为都是在 stack 中,而stack 中指令和数据都是定长的,因此很容易算出偏移量,也因此不管什么指令(类的方法) ,都可以访问到类的静态属性。也正因为静态属性被保存在 stack 中,所以具有了全局属性。 总结一下:静态属性保存在 stack 指令内存区,动态属性保存在 heap 数据内存区。 本文来自 CSDN 博客,转载请标明出处:http:/

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报