黑马程序员技术交流社区

标题: 类被加载之后何时消失? [打印本页]

作者: 第一枭雄    时间: 2013-5-11 21:14
标题: 类被加载之后何时消失?
本帖最后由 第一枭雄 于 2013-5-15 22:08 编辑

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

求各位牛人详细解答~!!!
作者: Jacky_Chen1990    时间: 2013-5-11 21:33
坐等回答~~~
作者: 明天,你好    时间: 2013-5-12 00:34
当程序主动加载某个类时,如果该类还未被加载到内存中,系统会通过加载连接初始化三个步骤来对该类进行初始化。类加载是将类的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的核心类。因为我们程序中主要的还是核心库里的一些东西
当然还有其他的类加载器,
你可以看一看类加载这方面的知识。
作者: 第一枭雄    时间: 2013-5-12 19:07
明天,你好 发表于 2013-5-12 00:34
当程序主动加载某个类时,如果该类还未被加载到内存中,系统会通过加载连接初始化三个步骤来对该类进行初始 ...

很好,学习了,多谢了啊,我才刚学基础,所以还没去深入研究这样的问题,多谢了
意思就是我说的第三条:(3到全程序运行结束才消失?那岂不是随着程序的运行,加载的类越来越多,内存占用越来越大?)只不过它是存放在缓存了呗?

作者: 刘胜寒    时间: 2013-5-13 09:03
注意结贴。。。查看你们的帖子真的很耗时时间。。真心希望你们及时结贴。。真的很累。。
谢谢合作
作者: DMY2008    时间: 2013-5-13 10:50
上面的说的很好了!
作者: ㄨ≮諾≯ㄟ    时间: 2013-5-13 13:23
当一个对象不再被使用时,它应该释放内存,避免内存溢出。在Java中,收集和释放内存是一个叫自动废品回收站的线程的责任。程序员无法干预,只能建议Java虚拟机回收。这就是JAVA的垃圾回收机制。
作者: 王靖远    时间: 2013-5-13 20:20
明天,你好 发表于 2013-5-12 00:34
当程序主动加载某个类时,如果该类还未被加载到内存中,系统会通过加载连接初始化三个步骤来对该类进行初始 ...

受教了,十分感谢
作者: Sword    时间: 2013-5-13 22:33
如果问题未解决,请继续追问,如果问题解决了,请点击你的帖子下面的"编辑"重新编辑帖子,将分类改为“已解决”,谢谢合作!
作者: 第一枭雄    时间: 2013-5-13 23:20
Sword 发表于 2013-5-13 22:33
如果问题未解决,请继续追问,如果问题解决了,请点击你的帖子下面的"编辑"重新编辑帖子,将分类改为“已解 ...

还不胜清楚,放心,我基本天天都上论坛,会记得及时结贴的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2