您好,登錄后才能下訂單哦!
這篇文章主要介紹“JVM的class裝載是什么意思”,在日常操作中,相信很多人在JVM的class裝載是什么意思問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”JVM的class裝載是什么意思”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
主動使用 class時
創建一個類的實例 (new 、反射、克隆、反序列化)
調用類的靜態方法(invokestatic)
使用類或接口的靜態字段(getstatic、putstatic)
使用 reflect反射
初始化子類,先初始化父類
main方法的類
被動引用不會初始化類
package com.mousycoder.mycode.thinking_in_jvm; /** * @version 1.0 * @author: mousycoder * @date: 2019-09-02 16:29 */ public class Parent { static { System.out.println("Parent init"); } public static int v = 100; } package com.mousycoder.mycode.thinking_in_jvm; import sun.jvm.hotspot.memory.ParNewGeneration; /** * @version 1.0 * @author: mousycoder * @date: 2019-09-02 16:29 */ public class Child extends Parent { static { System.out.println("Child init"); } } package com.mousycoder.mycode.thinking_in_jvm; /** * @version 1.0 * @author: mousycoder * @date: 2019-09-02 16:32 */ public class UseParent { public static void main(String[] args) { System.out.println(Child.v); } }
虛擬機參數 -XX:+TraceClassLoading
輸出
[Loaded com.mousycoder.mycode.thinking_in_jvm.Parent from file:/Users/mousycoder/My/code/mycode/target/classes/] [Loaded com.mousycoder.mycode.thinking_in_jvm.Child from file:/Users/mousycoder/My/code/mycode/target/classes/] Parent init 100 [Loaded java.lang.Shutdown from /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/lib/rt.jar] [Loaded java.lang.Shutdown$Lock from /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/lib/rt.jar]
表示 Child被加載了,但是沒有被初始化
final 常量不會引起類初始化
package com.mousycoder.mycode.thinking_in_jvm; /** * @version 1.0 * @author: mousycoder * @date: 2019-09-02 16:41 */ public class FinalFieldClass { public static final String constString = "CONST"; static { System.out.println("FinalFieldClass init"); } } package com.mousycoder.mycode.thinking_in_jvm; public class UseFinalField { public static void main(String[] args) { System.out.println(FinalFieldClass.constString); } }
輸出
CONST
FinalFieldClass 類沒有因為常量 constString 被引用而初始化,而是直接把CONST 放在常量池中
例子:加載String類
package com.mousycoder.mycode.thinking_in_jvm; import java.lang.reflect.Method; import java.lang.reflect.Modifier; /** * @version 1.0 * @author: mousycoder * @date: 2019-09-03 13:38 */ public class StringTest { public static void main(String[] args) throws ClassNotFoundException { Class clzStr = Class.forName("java.lang.String"); Method[] ms = clzStr.getDeclaredMethods(); for (Method m : ms) { String mod = Modifier.toString(m.getModifiers()); System.out.println(mod + " " + m.getName() + " ( "); Class<?>[] ps = m.getParameterTypes(); if (ps.length == 0 ){ System.out.println(')'); } for (int i = 0; i < ps.length; i++) { char end =i==ps.length-1 ? ')':','; System.out.println(ps[i].getSimpleName() + end); } System.out.println(); } } }
輸出 `` public equals ( Object)
public toString ( )
public hashCode ( )
public volatile compareTo ( Object)
public compareTo ( String)
public indexOf ( String, int)` ``
保證加載的字節碼合法
為類分配對應的內存空間,并設置初始值,此階段不會有 java 代碼執行 |類型|默認初始值| |--|--| |int|0| |long|0L| |short|(short)0| |char|\u0000| |boolean|false| |reference|null| |float|0f| |double|0f|
將類、接口、字段、方法的符號引用(字面量的引用)轉成直接引用(找到方法中表的位置)
執行類的初始化方法<clinit>,此方法由編譯器自動生成的,由類靜態成員的賦值語句以及static 語句塊合并產生 其中<clinit>函數是帶鎖線程安全的,可能會導致死鎖。
到此,關于“JVM的class裝載是什么意思”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。