2016-01-15 29 views
0

在hotspot jvm中,在内存区域有堆和方法区,在方法中有'堆'和'方法区'等。对象I new设置为堆,类,字段,接口由类加载器加载设置为方法区域。“方法区域”中的加载类将由GC卸载吗?

我想gc不应该收集方法区域中的类信息。然而一篇中文文章显示,it does't mean gc wouldn't handle method area, it is just very few. When it happens, the constants and loaded class, field etc will be collected.

我怀疑它是否会发生。如果是,何时?我想弄明白,因为我正在研究一个方法钩子策略,如果加载的类将由GC收集,我不知道什么时候,我挂钩的方法将失败,并加载一个新的,脱钩的)

回答

0

我怀疑它是否会发生。如果是,何时?

当收集到一个类时,还会收集与该类相关的所有内容(包括PermGen/metaspace中的代码)。

当不再有对该类的引用时,将收集一个类。

如果一个类是由一个类加载器加载的,则只有在类加载器被卸载时才会清除该类。如果任何类的任何实例指向一个类加载器,则该类加载器中的每个类仍然有一个对它的引用,这就是为什么许多应用程序从不清理这些类。

你可以有类,例如生成的类不与类加载器关联,并且这些类在不再使用时会死掉。