名扬数据:说说classLoader卸载与JVM热部署

对内存的引用关系进行了修改也许osgi中关于此部分的实现使用了jvm内部的JMTI相关接口.perm区gc情况下会被回收掉。jvm中没有提供class及classloadunload方法.那热部署及osgi中是通过什么机制来实现的呢?实现思路主要是通过更换classLoad进行重新加载.之前的classload及加载的class类在没有实例引用的情况下.

perm区gc时回收掉没有引用的class一个怎样的过程呢?

对class进行引用计算, perm区达到回收条件后.对于没有引用的class进行回收。classLoad实例什么时候被回收呢?很有可能会进入oldgen.perm区回收一般情况下触发fullgc否目的就是清除没有实例引用此classload,perm区class将无法卸载,如果有实例类有对classload引用.导致perm区内存一直增加,进而导致permspaceerror

publstaticMappool=newHashMap;

InstantiationException,publicstaticvoidmainString[]argthrowClassNotFoundException.IllegalA ccessException{

forinti=0;i<10000000;i++{

testarg;

}

InstantiationException,publicstaticvoidtestString[]argthrowClassNotFoundException.IllegalA ccessExcept{

ClassLoadcl=newMyLoadMain.class.getClassLoad;

StringclassNam="RealPerson";

@SuppressWarn"unchecked"

Class<Person>clazz=Class<Person>cl.loadClassclassNam;

Personp=clazz.newInst;

p.setNam"qiang";

p;pool.putSystem.nanoTim.

cl=p.getClass.getClassLoad;

}

推测:为什么呢?osgibundl进行热布置时有个条件:exportclass必需是兼容的.否则需要重启整个应用才会生效.bundl内部其他类是bundlclassload加载的,osgiexportclass被bundlparentclassload加载的.bundl更换后,重新创立classloader,并对bundl进行加载,之前的加载靠jmvgc回收掉。否会导致class无法被gc掉?那osgi中explortclass如果有实例引用的话.