天天看點

Java面試題-jvm2

作者:Java農夫

又是一年招聘季,整理一些面試題,為自己也為大家整理點資料,希望大家成功上岸。這些整理的是針對面試。因平台單日有釋出數量限制,超出限制的隻能粉絲檢視,需要的請關注後自行擷取,謝謝。

類加載器有哪些?

類加載器ClassLoader:在裝載(Load)階段,其中第(1)步:通過類的全限定名擷取其定義的二進制位元組流,需要借助類裝載器完成,顧名思義,就是用來裝載Class檔案的。圖解:

Java面試題-jvm2
  • 1)Bootstrap ClassLoader 負責加載 JAVA_HOME中 jre/lib/rt.jar 裡所有的class或Xbootclassoath選項指定的jar包。由C++實作,不是ClassLoader子類。
  • 2)Extension ClassLoader 負責加載java平台中擴充功能的一些jar包,包括`$JAVA_HOME中jre/lib/*.jar 或 -Djava.ext.dirs指定目錄下的jar包。
  • 3)App ClassLoader 負責加載classpath中指定的jar包及 Djava.class.path 所指定目錄下的類和jar包。
  • 4)Custom ClassLoader 通過java.lang.ClassLoader的子類自定義加載class,屬于應用程式根據自身需要自定義的ClassLoader,如tomcat、jboss都會根據j2ee規範自行實作ClassLoader。

雙親委派以及打破雙親委派 父類委托機制

protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
        synchronized (getClassLoadingLock(name)) {
            // First, check if the class has already been loaded
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                long t0 = System.nanoTime();
                try {
                    if (parent != null) {
                        c = parent.loadClass(name, false);
                    } else {
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                    // ClassNotFoundException thrown if class not found
                    // from the non-null parent class loader
                }

                if (c == null) {
                    // If still not found, then invoke findClass in order
                    // to find the class.
                    long t1 = System.nanoTime();
                    c = findClass(name);

                    // this is the defining class loader; record the stats
                    sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                    sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                    sun.misc.PerfCounter.getFindClasses().increment();
                }
            }
            if (resolve) {
                resolveClass(c);
            }
            return c;
        }
           
Java面試題-jvm2

向上檢查 向下委派

打破雙親委派:JDBC、JNDI、Tomcat等

有興趣的同學可以參考這篇:Java中的雙親委派機制以及如何打破_打破雙親委派機制的場景_zzy9607的部落格-CSDN部落格

繼續閱讀