什么是class文件
是jvm編譯java代碼后生成的字節(jié)碼文件硼一,包含java程序執(zhí)行的字節(jié)碼澄步;數(shù)據(jù)嚴格按照格式緊湊排列在class文件中的二進制流,中間無任何分隔符掖桦;文件開頭有一個0xcafebabe(16進制)特使的一個標志。
如何查看class文件內容夺颤?
javap -v Target.class
jvm運行時數(shù)據(jù)區(qū)
jvm運行時數(shù)據(jù)區(qū)分為線程共享部分和線程獨占部分痢缎。線程共享是指所有線程都能訪問這塊內存數(shù)據(jù),隨虛擬機或者GC而創(chuàng)建或者銷毀世澜,線程共享部分包括方法區(qū)独旷、堆內存;線程獨占是指每個線程都會有它自己的獨立空間寥裂,隨線程生命周期創(chuàng)建或者銷毀嵌洼,線程獨占部分包括虛擬機棧、本地方法棧封恰、程序計數(shù)器麻养。
方法區(qū):是JVM用來存儲加載的類信息、常量俭驮、靜態(tài)變量回溺、編譯后的代碼等數(shù)據(jù)春贸,是虛擬機規(guī)范中劃分的邏輯區(qū)域混萝,具體實現(xiàn)根據(jù)不同虛擬機來實現(xiàn)。
堆內存可細分為老年代萍恕、新生代(Eden逸嘀、From Survivor、To Survivor)
虛擬機棧:每個線程都在這個空間有一個私有的空間允粤,線程棧由多個棧幀組成崭倘;一個線程會執(zhí)行一個或多個方法、一個方法對應一個棧幀类垫。
棧幀內容包括局部變量表司光、操作數(shù)棧、動態(tài)鏈接悉患、方法返回地址残家、附加信息等。棧內存默認最大是1M售躁,超出則跑出StackOverflowError坞淮。
本地方法棧:和虛擬機棧功能類似,虛擬機棧是衛(wèi)虛擬機執(zhí)行JAV方法兒準備的陪捷,本地方法棧是為虛擬機使用native本地方法而準備的回窘。虛擬機規(guī)范沒有規(guī)定具體實現(xiàn),由不同的虛擬機廠商去實現(xiàn)市袖。
程序計數(shù)器:記錄當前線程執(zhí)行字節(jié)碼的位置啡直,存儲的是字節(jié)碼指令地址,如果執(zhí)行native方法,則計數(shù)器值為空付枫。
每個線程都在這個空間有一個私有的空間烹玉,占用內存空間很少。
CPU同一時間阐滩,只會執(zhí)行一條線程中的指令二打。JVM多線程會輪流切換并分配CPU執(zhí)行時間的方式。在線程切換后需要通過程序計數(shù)器來恢復正確的執(zhí)行位置掂榔。