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()
語言特性 泛型、反射、lamda表達式 面向對象 封裝、繼承、多态 類庫 集合、并發庫、io、網絡、nio 異常處理
編譯 生成.class 二進制檔案 javac xxx.java 運作 java xxx 指令反編譯幫助 javap -help 反彙編 javap -c xxx
連結遠端
上傳本地檔案
建立相同包目錄
mkdir -p 目錄
複制檔案
cp 檔案 指定目錄
準備工作:無需重複校驗文法 可擴充:位元組碼可由不同語言生成
native接口
抽象類
最重要的方法:給定類名去加載一個類
parent成員變量
屬于classloader,由此可見有多種類
jvm核心庫,c++編寫
繼承制url
通過路徑擷取檔案
檔案用到才加載
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
/users/bennyrhys/documents/idea_demo/test/out/production/test 會到此路徑找我們的class進行加載
/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對象
找類
抛出類找不到異常
可以在此處定義如何找到類
重新定義類
自定義類加載 從網絡中擷取标準二進制流,進行類加載 可以對敏感的.class加密,在findclass裡面解密 對生成的二進制流添加一些類資訊 甚至思考一下aop用這種方法實作
java位元組碼增強技術之asm asm是一款基于java位元組碼層面的代碼分析和修改工具;無需提供源代碼即可對應用嵌入所需debug代碼,用于應用api性能分析,代碼優化和代碼混淆等工作。asm的目标是生成,轉換和分析已編譯的java class檔案,可使用asm工具讀/寫/轉換jvm指令集。 asm工具提供兩種方式來産生和轉換已編譯的class檔案,它們分别是基于事件和基于對象的表示模型。其中,基于事件的表示模型使用一個有序的事件序清單示一個class檔案,class檔案中的每一個元素使用一個事件來表示,比如class的頭部,變量,方法聲明jvm指令都有相對應的事件表示,asm使用自帶的事件解析器能将每一個class檔案解析成一個事件序列。而基于對象的表示模型則使用對象樹結構來解析每一個檔案。
多種classloader互相協作
loadclass
按理來說parent都是url,但為啥層級實際關系不是這樣
但實際上是有層級的
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
程序受限
程序受限于作業系統提供的可尋址空間。 可尋址空間由作業系統的位數決定 32位 4g
位址空間劃分
核心空間 作業系統程式,c運作,連結計算機硬體,提供聯網,虛拟記憶體 可以通路所有記憶體 使用者空間 java實際運作
32位 程序最大通路3g 64位 程序最大通路512g
中間核心部分
java運作在虛拟機,運作時,會劃分不同資料區域,友善記憶體空間友善管理
c編譯器在劃分記憶體的時候 資料段: 堆、棧、靜态資料區 代碼段:
棧的記憶體不需要gc,移除棧幀自動釋放
口語化指令
當虛拟機棧可以動态擴充時,無法申請足夠多的記憶體 容易導緻系統假死
jdk8以後把中繼資料資料放到本地堆記憶體叫元空間 該區域在jdk7及以前屬于永久代 元空間和永久代都是用來存儲class資訊 (包括class的methed和field等) 元空間和永久代均是方法區的實作,隻是實作有所不同。 方法區是jvm的一種規範 jdk1.7之後位于方法區的字元串常量池,已被移動到了java堆中 jdk1.8中元空間替代了永久代 解決了運作空間不足可能産生的異常
線程共享的堆 存儲對象執行個體 可以處在實體上不連續的空間,邏輯連續即可,可擴充的
調整jvm,堆、線程,所占記憶體的大小
通過棧中的引用變量通路堆中的位址 棧存儲堆中首位址(引用變量) 到其作用域之外後釋放 堆,數組首位址、執行個體對象 占據的記憶體不會被釋放。隻有在沒有引用變量之後才會被視為垃圾回收,不确定的時間被垃圾回收機制釋放掉
切換到1.7、1.8
1.7
1.6