jvm分析

jvm分析:

一個java類在jvm中有三種形態:
1) source:源碼形態  ->編譯過程(javac)
2) class:字節碼形態
3)runtime:運行時形態    加載到內存,內存存在形態

jvm中最核心的一個類就是ClassLoader,從分析源碼發現該類在加載類的時候採用的雙親委派機制雙親委派:是JDK的一種安全機制,會檢測類是否被加載過,只有沒有加載過的才允許加載,父類能加載的就不給子類加載,同一時間、同一個類只允許一個線程加載到內存裏一次
該類最核心方法:

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;
        }
    }


比如:JDK內含java.util.List類  我們自定義一個 java.util.List類,這樣的代碼能通過編譯,但是由於JDK爲保護程序運行時安全的安全機制,
不允許我們運行。但是若果我們直接更換JDK內的List類編譯後的二進制.class文件是可以執行的,黑客入侵可以通過這種方式。
文件的安全是由操作系統來保護的,JDK只是管理程序的運行時的安全,不關心文件是否被替換。

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