A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 第一枭雄 中级黑马   /  2013-5-11 21:14  /  3911 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 第一枭雄 于 2013-5-15 22:08 编辑

我知道类是运行那调运的那一步才加载的,对象也是运行到了才加载,
对象是没有引用的时候就变成了垃圾,然后会被虚拟机的回收机制在不确定的时间自动回收。
但是类呢?它是什么时候消失的呢?
1、当前使用完就消失?那岂不是下次用到还要加载,类中的静态代码块不是还要再执行一次,这岂不是和“静态代码块只加载一次”相违?
2、jvm会自动检测后面的代码,如果后面确定用不到此类了就消失?  我感觉不太实际啊
3、到全程序运行结束才消失?那岂不是随着程序的运行,加载的类越来越多,内存占用越来越大?

求各位牛人详细解答~!!!

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

9 个回复

倒序浏览
坐等回答~~~
回复 使用道具 举报
当程序主动加载某个类时,如果该类还未被加载到内存中,系统会通过加载连接初始化三个步骤来对该类进行初始化。类加载是将类的class文件读入内存中并为之创建一个Class对象,同时类加载器通常无须等到首次使用该类才加载该类,java虚拟机允许预先加载某些类。一旦一个类被加载到jvm中同一个类就不会被再次载入了。jvm类加载时使用缓存机制,缓存机制将会保证所有被加载过的Class都会被缓存,当程序中需要使用某个Class时类加载机制先ongoing缓存中搜寻该Class只有当缓存中不存在该Class对象时,系统才会重读取该类对应的二进制数据,并将其转换成Class对象,并存入cache。当Java程序运行结束时,jvm进程结束,该进程在内存中的状态将会丢失。其实当我们调用Java命令运行某个Java程序时该命令将会启动一条Java虚拟机进程。不管Java程序多么复杂,改程序启动了多少个线程,他们都处于该Java虚拟机进程里,同一个jvm的多有线程所有变量都处于同一个进程里他们都是用该jvm进程的内存区。其实内存中的class对象占用的内存空间很小,因为我们所需要的很多类都已经预先加载到内存中,当我们启动jvm执行java.exe命令时,根加载器负责加载Java的核心类。因为我们程序中主要的还是核心库里的一些东西
当然还有其他的类加载器,
你可以看一看类加载这方面的知识。

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
明天,你好 发表于 2013-5-12 00:34
当程序主动加载某个类时,如果该类还未被加载到内存中,系统会通过加载连接初始化三个步骤来对该类进行初始 ...

很好,学习了,多谢了啊,我才刚学基础,所以还没去深入研究这样的问题,多谢了
意思就是我说的第三条:(3到全程序运行结束才消失?那岂不是随着程序的运行,加载的类越来越多,内存占用越来越大?)只不过它是存放在缓存了呗?
回复 使用道具 举报
注意结贴。。。查看你们的帖子真的很耗时时间。。真心希望你们及时结贴。。真的很累。。
谢谢合作
回复 使用道具 举报
上面的说的很好了!
回复 使用道具 举报
当一个对象不再被使用时,它应该释放内存,避免内存溢出。在Java中,收集和释放内存是一个叫自动废品回收站的线程的责任。程序员无法干预,只能建议Java虚拟机回收。这就是JAVA的垃圾回收机制。
回复 使用道具 举报
明天,你好 发表于 2013-5-12 00:34
当程序主动加载某个类时,如果该类还未被加载到内存中,系统会通过加载连接初始化三个步骤来对该类进行初始 ...

受教了,十分感谢
回复 使用道具 举报
Sword 金牌黑马 2013-5-13 22:33:52
9#
如果问题未解决,请继续追问,如果问题解决了,请点击你的帖子下面的"编辑"重新编辑帖子,将分类改为“已解决”,谢谢合作!
回复 使用道具 举报
Sword 发表于 2013-5-13 22:33
如果问题未解决,请继续追问,如果问题解决了,请点击你的帖子下面的"编辑"重新编辑帖子,将分类改为“已解 ...

还不胜清楚,放心,我基本天天都上论坛,会记得及时结贴的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马