JAVA 类加载 随记
生活随笔
收集整理的這篇文章主要介紹了
JAVA 类加载 随记
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
視頻:?https://www.bilibili.com/video/av29502877
1 JVM把Class加載到內存當中,檢驗解析初始化。默認使用的懶加載方式。
以下步驟是并行執行?
可以把加載源看成JAVA配置文件。
解析:
符號引用:?類名,基本類型
直接引用:內存地址
初始化:
1 類初始化是線程安全的,多個線程同時觸發類初始化時,只有一個類可以執行,其他類阻塞
2 類初始化時執行<clinit>方法,<clinit>按照書寫順序加載并執行類的static代碼。
自上而下,由父到子。自加載器將加載任務上拋,直到頂層。父類加載器加載失敗拋出異常,把加載任務轉給子類加載器。
這樣可以防止重復加載。比如:自定義一個java.lang.Object類,加載時先放到頂層父加載器中,發現已經加載過jdk的java.lang.Object類。此時就不會在加載自定義Object。
下面是java中類加載雙親委派的源碼?
java.lang.ClassLoader#loadClass(java.lang.String, boolean)
protected Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException{synchronized (getClassLoadingLock(name)) {// 檢查全類名是否已經加載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 statssun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);sun.misc.PerfCounter.getFindClasses().increment();}}if (resolve) {resolveClass(c);}return c;}}?
轉載于:https://www.cnblogs.com/sw008/p/11054281.html
總結
以上是生活随笔為你收集整理的JAVA 类加载 随记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 红米手机用什么蓝牙耳机比较好,适合红米手
- 下一篇: 洛谷 P2463 [SDOI2008]S