新聞中心
classLoader的卸載機(jī)制

目前創(chuàng)新互聯(lián)已為上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁(yè)空間、網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計(jì)、思明網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
jvm中沒(méi)有提供class及classloader的unload方法.那熱部署及osgi中是通過(guò)什么機(jī)制來(lái)實(shí)現(xiàn)的呢?實(shí)現(xiàn)思路主要是通過(guò)更換classLoader進(jìn)行重新加載.之前的classloader及加載的class類在沒(méi)有實(shí)例引用的情況下,在perm區(qū)gc的情況下會(huì)被回收掉。
perm區(qū)gc時(shí)回收掉沒(méi)有引用的class是一個(gè)怎樣的過(guò)程呢?
◆ perm區(qū)達(dá)到回收條件后,對(duì)class進(jìn)行引用計(jì)算,對(duì)于沒(méi)有引用的class進(jìn)行回收。
◆ classLoader實(shí)例什么時(shí)候被回收呢?(很有可能會(huì)進(jìn)入old gen).perm區(qū)回收一般情況下觸發(fā)full gc是否目的就是清除沒(méi)有實(shí)例引用此classloader?
內(nèi)存問(wèn)題
◆ 如果有實(shí)例類有對(duì)classloader的引用,perm區(qū)class將無(wú)法卸載,導(dǎo)致perm區(qū)內(nèi)存一直增加,進(jìn)而導(dǎo)致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();
- }
推測(cè):
osgi的bundle進(jìn)行熱部署時(shí)有個(gè)條件:export class 必須是兼容的.否則需要重啟整個(gè)應(yīng)用才會(huì)生效,為什么呢?
osgi的export class是被bundle的parent classloader加載的,bundle內(nèi)部其他類是bundle的classloader加載的,bundle更換后,重新創(chuàng)建classloader,并對(duì)bundle進(jìn)行加載,之前的加載靠jmv gc回收掉。
那osgi 中explort class如果有實(shí)例引用的話,是否會(huì)導(dǎo)致class無(wú)法被gc掉?
如果osgi中沒(méi)有做過(guò)處理,應(yīng)該會(huì)出現(xiàn)此問(wèn)題.具體osgi的實(shí)現(xiàn)還需要深入研究下, 也許osgi中關(guān)于此部分的實(shí)現(xiàn)使用了jvm內(nèi)部的JMTI的相關(guān)接口,來(lái)對(duì)內(nèi)存的引用關(guān)系進(jìn)行了修改。
原文鏈接:http://www.cnblogs.com/redcreen/archive/2011/06/02/2068758.html
【編輯推薦】
- JVM分代垃圾回收策略的基礎(chǔ)概念
- 高手深度解析:JVM是什么
- Java七步創(chuàng)建以JDBC連接數(shù)據(jù)庫(kù)的程序
- 面試Java前必須了解的10個(gè)概念
- Java中關(guān)于OOM的場(chǎng)景及解決方法
文章標(biāo)題:classLoader卸載與JVM熱部署
URL網(wǎng)址:http://m.fisionsoft.com.cn/article/dhgdgjg.html


咨詢
建站咨詢
