Spring boot的ClasssLoader加載和卸載jar/class

一.前言

在開發過程中,有時候需要動態加載各種jar/class到程序中,然而又只使用一次,或者加載的jar/class中有改動需要持續升級。程序一直在運行,每次加載進去的jar/class如果過多,對系統會造成很大的壓力,而且已經加載進去的jar/class不能覆蓋,從而造成得不到想要的結果。此時就需要考慮對加載進去的jar/class進行卸載。

 

二.思路

我們知道,當一個java類的完整的生命週期會經歷 加載、連接、初始化、使用、和卸 五個階段,當該類的class對象不再被引用之後,該類的生命週期也就結束了,那麼該類會被GC回收,從而達到卸載的功能。

       

三.案例編寫

編寫一個簡單的自定義classLoad,繼承 URLClassLoader 。

此處特別注意 MyClassLoad 構造函數中調用父級構造的第二個參數

package com.vae.classLoader.loader;

import com.vae.classLoader.Application;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

/**
 * 自定義的ClassLader
 */
public class MyClassLoad extends URLClassLoader {

    public MyClassLoad(String pathName) {
        /**
         * 第一個參數爲jar/class地址
         * 第二個參數是父級classLoader,此處是spring boot 的classLoader,意味着繼承了spring boot
         * 的classLoader,在MyClassLoad中可使用到spring boot的jvm
         */
        super(getMyURLs(pathName), Application.class.getClassLoader());
    }

    private static URL[] getMyURLs(String pathName) {
        URL url = null;
        try {
            url = new File(pathName).toURI().toURL();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        return new URL[]{url};
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        return super.findClass(name);
    }

    @Override
    public Class<?> loadClass(String name) throws ClassNotFoundException {
        return super.loadClass(name, false);
    }

    @Override
    public URL[] getURLs() {
        return super.getURLs();
    }

    @Override
    public void addURL(URL url) {
        super.addURL(url);
    }
}

四、測試

新建一個簡單的project工程,只編寫一個main方法,代碼結構如下圖,打成jar包後放在 F:/v/test.jar,修改打印部分數字爲2再打一個jar包放在 F:/v/v/test.jar(注意目錄層次)

 

 編寫測試方法

package com.vae.classLoader.loader;

import com.vae.classLoader.Application;

import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

public class ClassUnLoadTest {

	/**
	 * 測試class的加載與卸載情況。
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {

            printSupJvm();

	    MyClassLoad loader1 = new MyClassLoad("f:/v/test.jar");
	    Class<?> clazz1 = loader1.loadClass("com.vae.Test");
	    Object a1 = clazz1.newInstance();
            Method method = clazz1.getMethod("main", String[].class);
            method.invoke(null, (Object) new String[]{"2019"});
            for (URL url : loader1.getURLs()){
                System.out.println(url.toString());
            }
	    // 清除相關引用,等待gc回收
	    a1 = null;
	    clazz1 = null;
	    loader1 = null;

            printSupJvm();

            MyClassLoad loader2 = new MyClassLoad("f:/v/v/test.jar");
            Class<?> clazz2 = loader2.loadClass("com.vae.Test");
            Object a2 = clazz2.newInstance();
            Method method2 = clazz2.getMethod("main", String[].class);
            method2.invoke(null, (Object) new String[]{"2019"});
            for (URL url : loader2.getURLs()){
            System.out.println(url.toString());
            }
            a2 = null;
            clazz2 = null;
            loader2 = null;
    
            printSupJvm();
	}

    /**
     * 打印輸出父級SpringBoot中的className
     */
    private static void printSupJvm(){
        URLClassLoader load = (URLClassLoader)Application.class.getClassLoader();
        System.out.println(load.getClass().getName() + "===================================");
        for (URL url : load.getURLs()){
            System.out.println(url.toString());
        }
        System.out.println("================================================================");
    }
}

 運行輸出打印結果如下

打印輸出結構:

"C:\Program Files\Java\jdk1.8.0_144\bin\java.exe" ...

sun.misc.Launcher$AppClassLoader===================================

 Application的classLoad中所有的jar/class列表......
================================================================
Hello World!__ 1 __
file:/f:/v/test.jar
sun.misc.Launcher$AppClassLoader===================================
 Application的classLoad中所有的jar/class列表......
================================================================
Hello World!__ 2 __
file:/f:/v/v/test.jar
sun.misc.Launcher$AppClassLoader===================================
 Application的classLoad中所有的jar/class列表......
================================================================

Process finished with exit code 0

"C:\Program Files\Java\jdk1.8.0_144\bin\java.exe" "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2018.3.6\lib\idea_rt.jar=52595:D:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2018.3.6\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_144\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\rt.jar;D:\workRepository\example\case-classLoader\target\classes;D:\maven\repository\idea\org\springframework\boot\spring-boot-starter\2.0.1.RELEASE\spring-boot-starter-2.0.1.RELEASE.jar;D:\maven\repository\idea\org\springframework\boot\spring-boot\2.0.1.RELEASE\spring-boot-2.0.1.RELEASE.jar;D:\maven\repository\idea\org\springframework\spring-context\5.0.5.RELEASE\spring-context-5.0.5.RELEASE.jar;D:\maven\repository\idea\org\springframework\spring-aop\5.0.5.RELEASE\spring-aop-5.0.5.RELEASE.jar;D:\maven\repository\idea\org\springframework\spring-beans\5.0.5.RELEASE\spring-beans-5.0.5.RELEASE.jar;D:\maven\repository\idea\org\springframework\spring-expression\5.0.5.RELEASE\spring-expression-5.0.5.RELEASE.jar;D:\maven\repository\idea\org\springframework\boot\spring-boot-autoconfigure\2.0.1.RELEASE\spring-boot-autoconfigure-2.0.1.RELEASE.jar;D:\maven\repository\idea\org\springframework\boot\spring-boot-starter-logging\2.0.1.RELEASE\spring-boot-starter-logging-2.0.1.RELEASE.jar;D:\maven\repository\idea\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;D:\maven\repository\idea\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;D:\maven\repository\idea\org\apache\logging\log4j\log4j-to-slf4j\2.10.0\log4j-to-slf4j-2.10.0.jar;D:\maven\repository\idea\org\apache\logging\log4j\log4j-api\2.10.0\log4j-api-2.10.0.jar;D:\maven\repository\idea\org\slf4j\jul-to-slf4j\1.7.25\jul-to-slf4j-1.7.25.jar;D:\maven\repository\idea\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;D:\maven\repository\idea\org\springframework\spring-core\5.0.5.RELEASE\spring-core-5.0.5.RELEASE.jar;D:\maven\repository\idea\org\springframework\spring-jcl\5.0.5.RELEASE\spring-jcl-5.0.5.RELEASE.jar;D:\maven\repository\idea\org\yaml\snakeyaml\1.19\snakeyaml-1.19.jar;D:\maven\repository\idea\org\apache\commons\commons-lang3\3.5\commons-lang3-3.5.jar;D:\maven\repository\idea\org\apache\tomcat\embed\tomcat-embed-core\8.5.29\tomcat-embed-core-8.5.29.jar;D:\maven\repository\idea\org\apache\tomcat\tomcat-annotations-api\8.5.29\tomcat-annotations-api-8.5.29.jar;D:\maven\repository\idea\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;D:\maven\repository\idea\log4j\log4j\1.2.17\log4j-1.2.17.jar" com.vae.classLoader.loader.ClassUnLoadTest
sun.misc.Launcher$AppClassLoader===================================
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/charsets.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/deploy.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/access-bridge-64.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/cldrdata.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/dnsns.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/jaccess.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/jfxrt.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/localedata.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/nashorn.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/sunec.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/sunjce_provider.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/sunmscapi.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/sunpkcs11.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/zipfs.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/javaws.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/jce.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/jfr.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/jfxswt.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/jsse.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/management-agent.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/plugin.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/resources.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/rt.jar
file:/D:/workRepository/example/case-classLoader/target/classes/
file:/D:/maven/repository/idea/org/springframework/boot/spring-boot-starter/2.0.1.RELEASE/spring-boot-starter-2.0.1.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/boot/spring-boot/2.0.1.RELEASE/spring-boot-2.0.1.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/spring-context/5.0.5.RELEASE/spring-context-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/spring-aop/5.0.5.RELEASE/spring-aop-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/spring-beans/5.0.5.RELEASE/spring-beans-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/spring-expression/5.0.5.RELEASE/spring-expression-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/boot/spring-boot-autoconfigure/2.0.1.RELEASE/spring-boot-autoconfigure-2.0.1.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/boot/spring-boot-starter-logging/2.0.1.RELEASE/spring-boot-starter-logging-2.0.1.RELEASE.jar
file:/D:/maven/repository/idea/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar
file:/D:/maven/repository/idea/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar
file:/D:/maven/repository/idea/org/apache/logging/log4j/log4j-to-slf4j/2.10.0/log4j-to-slf4j-2.10.0.jar
file:/D:/maven/repository/idea/org/apache/logging/log4j/log4j-api/2.10.0/log4j-api-2.10.0.jar
file:/D:/maven/repository/idea/org/slf4j/jul-to-slf4j/1.7.25/jul-to-slf4j-1.7.25.jar
file:/D:/maven/repository/idea/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar
file:/D:/maven/repository/idea/org/springframework/spring-core/5.0.5.RELEASE/spring-core-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/spring-jcl/5.0.5.RELEASE/spring-jcl-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/yaml/snakeyaml/1.19/snakeyaml-1.19.jar
file:/D:/maven/repository/idea/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5.jar
file:/D:/maven/repository/idea/org/apache/tomcat/embed/tomcat-embed-core/8.5.29/tomcat-embed-core-8.5.29.jar
file:/D:/maven/repository/idea/org/apache/tomcat/tomcat-annotations-api/8.5.29/tomcat-annotations-api-8.5.29.jar
file:/D:/maven/repository/idea/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar
file:/D:/maven/repository/idea/log4j/log4j/1.2.17/log4j-1.2.17.jar
file:/D:/Program%20Files/JetBrains/IntelliJ%20IDEA%20Community%20Edition%202018.3.6/lib/idea_rt.jar
================================================================
Hello World!__ 1 __
file:/f:/v/test.jar
sun.misc.Launcher$AppClassLoader===================================
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/charsets.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/deploy.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/access-bridge-64.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/cldrdata.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/dnsns.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/jaccess.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/jfxrt.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/localedata.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/nashorn.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/sunec.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/sunjce_provider.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/sunmscapi.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/sunpkcs11.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/zipfs.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/javaws.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/jce.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/jfr.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/jfxswt.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/jsse.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/management-agent.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/plugin.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/resources.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/rt.jar
file:/D:/workRepository/example/case-classLoader/target/classes/
file:/D:/maven/repository/idea/org/springframework/boot/spring-boot-starter/2.0.1.RELEASE/spring-boot-starter-2.0.1.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/boot/spring-boot/2.0.1.RELEASE/spring-boot-2.0.1.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/spring-context/5.0.5.RELEASE/spring-context-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/spring-aop/5.0.5.RELEASE/spring-aop-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/spring-beans/5.0.5.RELEASE/spring-beans-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/spring-expression/5.0.5.RELEASE/spring-expression-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/boot/spring-boot-autoconfigure/2.0.1.RELEASE/spring-boot-autoconfigure-2.0.1.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/boot/spring-boot-starter-logging/2.0.1.RELEASE/spring-boot-starter-logging-2.0.1.RELEASE.jar
file:/D:/maven/repository/idea/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar
file:/D:/maven/repository/idea/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar
file:/D:/maven/repository/idea/org/apache/logging/log4j/log4j-to-slf4j/2.10.0/log4j-to-slf4j-2.10.0.jar
file:/D:/maven/repository/idea/org/apache/logging/log4j/log4j-api/2.10.0/log4j-api-2.10.0.jar
file:/D:/maven/repository/idea/org/slf4j/jul-to-slf4j/1.7.25/jul-to-slf4j-1.7.25.jar
file:/D:/maven/repository/idea/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar
file:/D:/maven/repository/idea/org/springframework/spring-core/5.0.5.RELEASE/spring-core-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/spring-jcl/5.0.5.RELEASE/spring-jcl-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/yaml/snakeyaml/1.19/snakeyaml-1.19.jar
file:/D:/maven/repository/idea/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5.jar
file:/D:/maven/repository/idea/org/apache/tomcat/embed/tomcat-embed-core/8.5.29/tomcat-embed-core-8.5.29.jar
file:/D:/maven/repository/idea/org/apache/tomcat/tomcat-annotations-api/8.5.29/tomcat-annotations-api-8.5.29.jar
file:/D:/maven/repository/idea/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar
file:/D:/maven/repository/idea/log4j/log4j/1.2.17/log4j-1.2.17.jar
file:/D:/Program%20Files/JetBrains/IntelliJ%20IDEA%20Community%20Edition%202018.3.6/lib/idea_rt.jar
================================================================
Hello World!__ 2 __
file:/f:/v/v/test.jar
sun.misc.Launcher$AppClassLoader===================================
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/charsets.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/deploy.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/access-bridge-64.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/cldrdata.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/dnsns.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/jaccess.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/jfxrt.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/localedata.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/nashorn.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/sunec.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/sunjce_provider.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/sunmscapi.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/sunpkcs11.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/zipfs.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/javaws.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/jce.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/jfr.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/jfxswt.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/jsse.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/management-agent.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/plugin.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/resources.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/rt.jar
file:/D:/workRepository/example/case-classLoader/target/classes/
file:/D:/maven/repository/idea/org/springframework/boot/spring-boot-starter/2.0.1.RELEASE/spring-boot-starter-2.0.1.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/boot/spring-boot/2.0.1.RELEASE/spring-boot-2.0.1.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/spring-context/5.0.5.RELEASE/spring-context-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/spring-aop/5.0.5.RELEASE/spring-aop-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/spring-beans/5.0.5.RELEASE/spring-beans-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/spring-expression/5.0.5.RELEASE/spring-expression-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/boot/spring-boot-autoconfigure/2.0.1.RELEASE/spring-boot-autoconfigure-2.0.1.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/boot/spring-boot-starter-logging/2.0.1.RELEASE/spring-boot-starter-logging-2.0.1.RELEASE.jar
file:/D:/maven/repository/idea/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar
file:/D:/maven/repository/idea/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar
file:/D:/maven/repository/idea/org/apache/logging/log4j/log4j-to-slf4j/2.10.0/log4j-to-slf4j-2.10.0.jar
file:/D:/maven/repository/idea/org/apache/logging/log4j/log4j-api/2.10.0/log4j-api-2.10.0.jar
file:/D:/maven/repository/idea/org/slf4j/jul-to-slf4j/1.7.25/jul-to-slf4j-1.7.25.jar
file:/D:/maven/repository/idea/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar
file:/D:/maven/repository/idea/org/springframework/spring-core/5.0.5.RELEASE/spring-core-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/spring-jcl/5.0.5.RELEASE/spring-jcl-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/yaml/snakeyaml/1.19/snakeyaml-1.19.jar
file:/D:/maven/repository/idea/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5.jar
file:/D:/maven/repository/idea/org/apache/tomcat/embed/tomcat-embed-core/8.5.29/tomcat-embed-core-8.5.29.jar
file:/D:/maven/repository/idea/org/apache/tomcat/tomcat-annotations-api/8.5.29/tomcat-annotations-api-8.5.29.jar
file:/D:/maven/repository/idea/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar
file:/D:/maven/repository/idea/log4j/log4j/1.2.17/log4j-1.2.17.jar
file:/D:/Program%20Files/JetBrains/IntelliJ%20IDEA%20Community%20Edition%202018.3.6/lib/idea_rt.jar
================================================================

Process finished with exit code 0

由上述可以看出,每次加載進去的jar,與父級SpringBoot的Application的classLoad中的jar是隔離的,每次new出來的MyClassLaoder都是一個新的classLoad,把每次new出來的自定義的classLoad置爲null,等待GC回收,實現卸載jar/class功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章