天天看點

JVM

java腦圖

談談對java的了解

平台無關性

特點

類測試complie

編譯運作

反編譯

不同系統解析class檔案成為不同機器碼

為什麼不直接編譯成機器碼

jvm如何加載.class檔案

native

談談反射

了解

代碼效果

代碼

robot

reflectsample

談談classloader

類從編譯到執行的過程

追一下源碼

classloader種類

bootstrap

ext

app

自定義

代碼實作效果

zhangsan.java

myclassloader

myclassloaderchecker

使用場景展望

類加載器雙親委派機制

跟源碼

了解調用

如何确定層級調用關系的?

還是不信調用c++?

為啥要用雙親委派機制去加載類?

你了解java的記憶體模型嗎?

記憶體模型

程式計數器

虛拟機棧

口語指令分析代碼

遞歸為什麼會引發異常1

異常2

本地方法棧

元空間與永久代差別

堆(heap)

jvm存儲角度

三大性能調優參數-xms -xmx -xss含義

java記憶體模型中堆和棧的差別

記憶體配置設定政策

堆和棧的差別

元空間、堆、線程、獨占部分間的聯系-記憶體角度

不同jdk的intern()方法差別-jdk6 vs jkd6+

重制jdk6永久代記憶體異常

對比不同jdk的intern()

JVM
JVM
語言特性 泛型、反射、lamda表達式 面向對象 封裝、繼承、多态 類庫 集合、并發庫、io、網絡、nio 異常處理
編譯 生成.class 二進制檔案 javac xxx.java 運作 java xxx 指令反編譯幫助 javap -help 反彙編 javap -c xxx
JVM

連結遠端

ssh [email protected]

上傳本地檔案

JVM

建立相同包目錄

mkdir -p 目錄

複制檔案

cp 檔案 指定目錄

JVM
準備工作:無需重複校驗文法 可擴充:位元組碼可由不同語言生成
JVM
JVM
JVM

native接口

JVM
JVM
JVM
JVM
JVM

抽象類

JVM

最重要的方法:給定類名去加載一個類

JVM

parent成員變量

JVM

屬于classloader,由此可見有多種類

JVM
JVM

jvm核心庫,c++編寫

繼承制url

JVM

通過路徑擷取檔案

檔案用到才加載

JVM

extensions

/users/bennyrhys/library/java/extensions:/library/java/javavirtualmachines/adoptopenjdk-8.jdk/contents/home/jre/lib/ext:/library/java/extensions:/network/library/java/extensions:/system/library/java/extensions:/usr/lib/java
JVM
/users/bennyrhys/documents/idea_demo/test/out/production/test 會到此路徑找我們的class進行加載
JVM
/library/java/javavirtualmachines/adoptopenjdk-8.jdk/contents/home/jre/lib/charsets.jar:/l ibrary/java/javavirtualmachines/adoptopenjdk-8.jdk/contents/home/jre/lib/ext/cldrdata.jar:/library/java/javavirtualmachines/adoptopenjdk-8.jdk/contents/home/jre/lib/ext/dnsns.jar:/library/java/javavirtualmachines/adoptopenjdk-8.jdk/contents/home/jre/lib/ext/jaccess.jar:/library/java/javavirtualmachines/adoptopenjdk-8.jdk/contents/home/jre/lib/ext/localedata.jar:/library/java/javavirtualmachines/adoptopenjdk-8.jdk/contents/home/jre/lib/ext/nashorn.jar:/library/java/javavirtualmachines/adoptopenjdk-8.jdk/contents/home/jre/lib/ext/sunec.jar:/library/java/javavirtualmachines/adoptopenjdk-8.jdk/contents/home/jre/lib/ext/sunjce_provider.jar:/library/java/javavirtualmachines/adoptopenjdk-8.jdk/contents/home/jre/lib/ext/sunpkcs11.jar:/library/java/javavirtualmachines/adoptopenjdk-8.jdk/contents/home/jre/lib/ext/zipfs.jar:/library/java/javavirtualmachines/adoptopenjdk-8.jdk/contents/home/jre/lib/jce.jar:/library/java/javavirtualmachines/adoptopenjdk-8.jdk/contents/home/jre/lib/jsse.jar:/library/java/javavirtualmachines/adoptopenjdk-8.jdk/contents/home/jre/lib/management-agent.jar:/library/java/javavirtualmachines/adoptopenjdk-8.jdk/contents/home/jre/lib/resources.jar:/library/java/javavirtualmachines/adoptopenjdk-8.jdk/contents/home/jre/lib/rt.jar:/library/java/javavirtualmachines/adoptopenjdk-8.jdk/contents/home/lib/dt.jar:/library/java/javavirtualmachines/adoptopenjdk-8.jdk/contents/home/lib/jconsole.jar:/library/java/javavirtualmachines/adoptopenjdk-8.jdk/contents/home/lib/sa-jdi.jar:/library/java/javavirtualmachines/adoptopenjdk-8.jdk/contents/home/lib/tools.jar:/users/bennyrhys/documents/idea_demo/test/out/production/test:/applications/intellij idea.app/contents/lib/idea_rt.jar
(base) bennyrhysdemacbook-pro:reflect bennyrhys$ pwd /users/bennyrhys/documents/idea_demo/test/out/production/test/reflect (base) bennyrhysdemacbook-pro:reflect bennyrhys$ ls reflectsample.class robot.class

根據名稱或者位置尋找檔案

進行解析,檔案資料格式,,傳回class對象

JVM
JVM

找類

JVM

抛出類找不到異常

JVM

可以在此處定義如何找到類

重新定義類

JVM
JVM
自定義類加載 從網絡中擷取标準二進制流,進行類加載 可以對敏感的.class加密,在findclass裡面解密 對生成的二進制流添加一些類資訊 甚至思考一下aop用這種方法實作
java位元組碼增強技術之asm asm是一款基于java位元組碼層面的代碼分析和修改工具;無需提供源代碼即可對應用嵌入所需debug代碼,用于應用api性能分析,代碼優化和代碼混淆等工作。asm的目标是生成,轉換和分析已編譯的java class檔案,可使用asm工具讀/寫/轉換jvm指令集。 asm工具提供兩種方式來産生和轉換已編譯的class檔案,它們分别是基于事件和基于對象的表示模型。其中,基于事件的表示模型使用一個有序的事件序清單示一個class檔案,class檔案中的每一個元素使用一個事件來表示,比如class的頭部,變量,方法聲明jvm指令都有相對應的事件表示,asm使用自帶的事件解析器能将每一個class檔案解析成一個事件序列。而基于對象的表示模型則使用對象樹結構來解析每一個檔案。
多種classloader互相協作
JVM

loadclass

JVM
JVM
按理來說parent都是url,但為啥層級實際關系不是這樣
JVM
JVM
但實際上是有層級的
JVM
reflect.myclassloader@1540e19d sun.misc.launcher a p c l s o d e r @ 18 b 4 2 u n . m i h appclassloader@18b4aac2 sun.misc.launcher [email protected]@14ae5a5 null
JVM
JVM
JVM
JVM
JVM
JVM
JVM
JVM
JVM
JVM
JVM

程序受限

程序受限于作業系統提供的可尋址空間。 可尋址空間由作業系統的位數決定 32位 4g
JVM

位址空間劃分

核心空間 作業系統程式,c運作,連結計算機硬體,提供聯網,虛拟記憶體 可以通路所有記憶體 使用者空間 java實際運作
32位 程序最大通路3g 64位 程序最大通路512g
JVM

中間核心部分

JVM
java運作在虛拟機,運作時,會劃分不同資料區域,友善記憶體空間友善管理
c編譯器在劃分記憶體的時候 資料段: 堆、棧、靜态資料區 代碼段:
JVM
JVM
棧的記憶體不需要gc,移除棧幀自動釋放
JVM
JVM
JVM

口語化指令

JVM
JVM
JVM
JVM
JVM
JVM
JVM
JVM
當虛拟機棧可以動态擴充時,無法申請足夠多的記憶體 容易導緻系統假死
JVM
JVM
JVM
jdk8以後把中繼資料資料放到本地堆記憶體叫元空間 該區域在jdk7及以前屬于永久代 元空間和永久代都是用來存儲class資訊 (包括class的methed和field等) 元空間和永久代均是方法區的實作,隻是實作有所不同。 方法區是jvm的一種規範 jdk1.7之後位于方法區的字元串常量池,已被移動到了java堆中 jdk1.8中元空間替代了永久代 解決了運作空間不足可能産生的異常
JVM
JVM
JVM
線程共享的堆 存儲對象執行個體 可以處在實體上不連續的空間,邏輯連續即可,可擴充的
JVM
調整jvm,堆、線程,所占記憶體的大小
JVM
JVM
JVM
通過棧中的引用變量通路堆中的位址 棧存儲堆中首位址(引用變量) 到其作用域之外後釋放 堆,數組首位址、執行個體對象 占據的記憶體不會被釋放。隻有在沒有引用變量之後才會被視為垃圾回收,不确定的時間被垃圾回收機制釋放掉
JVM
JVM
JVM
JVM
JVM
JVM
JVM
JVM

切換到1.7、1.8

JVM
JVM

1.7

JVM
JVM

1.6

JVM
JVM