对内存的引用关系进行了修改也许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如果有实例引用的话.