java里如何判断一个class文件是否被重新装载?

dreamers 发布于 2013/08/23 14:12
阅读 1K+
收藏 0
如标题。谢谢。
加载中
0
pf_miles
pf_miles

请定义清晰一下什么叫做“重新装载”?

一个classloader,对于同一个全限定类名(full qualified class name)的类装载请求,只会装载一次;装载好之后,该class就以一个class对象的形式存在于内存中;从此该classloader不会再去装载该类第二次;

且只要该classloader本身还存在于内存中,那么被他所加载的类就是不会被丢掉的的;想要丢掉那些已经被加载的类,那只能把这些类连同这个classloader一齐丢掉;

不知道你所说的重新加载是什么意思?是指第一次加载后的classloader和class都被丢掉了之后,第二次又由另一个不同的classloader加载了这个类么?

dreamers
dreamers
@了一下你,期待你的解答。谢谢。
0
坏孩子
坏孩子
在类的static块里面写代码,类被装载的时候会运行,就是,类被重新装载的情况不多见
0
fhp0917
fhp0917
再装一次报错说明已经装过
0
dreamers
dreamers

@pf_miles  那请问这段话如何理解?

dreamers
dreamers
回复 @pf_miles : 我觉得应该是同一个类的,比如一个项目里,热启动的次数多了的话就会报Perm内存溢出。一个项目里的类应该是相对固定了的吧。
pf_miles
pf_miles
表示内存中加载的类过多,这通常不是同一个类被加载多次造成的,而是很多很多不同的类被加载造成的,你应该通过参数调整PermGen的大小
0
pf_miles
pf_miles

引用来自“yangzhiyong”的答案

@pf_miles  那请问这段话如何理解?

回复 @yangzhiyong : 那说明这个热加载做得不完善,或者你们的程序通过某种方式长期持有了想要被热替换的类实例;因为热加载的原理是,将原来加载的类,连同其classloader一起扔掉(也就是断掉所有与其的引用); 这时候如果热加载机制不完善,这种引用扔不干净,那么老的类就会还会继续存在于内存中,然后同样一个类被不同的(注意,是“不同的”)classloader加载到内存中,实际上这个类被两个不同的classloader加载了共2份到内存中;这种情况一多,就会慢慢消耗掉permGen,导致永生代OOM; 至于具体是哪个类在内存中占据大量资源,以及哪里长期持有了这些类的引用,你可以使用jmap -heap命令观察永生代大小,在它快要OOM的时候,用jmap -dump命令导出其内存,然后使用MAT来分析其引用情况,从而找出问题
卞杰
卞杰
回复 @pf_miles : 积累前辈的方法。类加载机制已经掌握,但是还没有像前辈说的这样分析过永久代进而查出热加载的不足,优化代码。
pf_miles
pf_miles
回复 @yangzhiyong : 只要是java程序,都可以向这么分析;tomcat也是java程序
dreamers
dreamers
它是Tomcat。。。。
0
fhp0917
fhp0917
在一个classloader中只能装载某个class一次,这是java的安全铁律
fhp0917
fhp0917
严格地说是在一条委派链上的classloader只会装载同一个class一次且仅一次
返回顶部
顶部