classLoader的卸载机制
目前创新互联已为上千家的企业提供了网站建设、域名、网页空间、网站托管、企业网站设计、思明网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
jvm中没有提供class及classloader的unload方法.那热部署及osgi中是通过什么机制来实现的呢?实现思路主要是通过更换classLoader进行重新加载.之前的classloader及加载的class类在没有实例引用的情况下,在perm区gc的情况下会被回收掉。
perm区gc时回收掉没有引用的class是一个怎样的过程呢?
◆ perm区达到回收条件后,对class进行引用计算,对于没有引用的class进行回收。
◆ classLoader实例什么时候被回收呢?(很有可能会进入old gen).perm区回收一般情况下触发full gc是否目的就是清除没有实例引用此classloader?
内存问题
◆ 如果有实例类有对classloader的引用,perm区class将无法卸载,导致perm区内存一直增加,进而导致perm space error
- public static Map pool = new HashMap();
- public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException{
- for (int i=0;i<10000000;i++){
- test(args);
- }
- }
- public static void test(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
- ClassLoader cl = new MyLoader(Main.class.getClassLoader());
- String className = "RealPerson";
- @SuppressWarnings("unchecked")
- Class
clazz = (Class ) cl.loadClass(className); - Person p = clazz.newInstance();
- p.setName("qiang");
- pool.put(System.nanoTime(), p);
- cl = p.getClass().getClassLoader();
- }
推测:
osgi的bundle进行热部署时有个条件:export class 必须是兼容的.否则需要重启整个应用才会生效,为什么呢?
osgi的export class是被bundle的parent classloader加载的,bundle内部其他类是bundle的classloader加载的,bundle更换后,重新创建classloader,并对bundle进行加载,之前的加载靠jmv gc回收掉。
那osgi 中explort class如果有实例引用的话,是否会导致class无法被gc掉?
如果osgi中没有做过处理,应该会出现此问题.具体osgi的实现还需要深入研究下, 也许osgi中关于此部分的实现使用了jvm内部的JMTI的相关接口,来对内存的引用关系进行了修改。
原文链接:http://www.cnblogs.com/redcreen/archive/2011/06/02/2068758.html
【编辑推荐】
当前标题:classLoader卸载与JVM热部署
URL标题:http://www.shufengxianlan.com/qtweb/news0/237550.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联