JVM 2-classLoadjava
Java編譯過程web
JVM 能夠跨平臺執行,目前有不少語言都基於JVM進行執行,例如scala,grovy等,jvm只與class文件交互,只要一門語言編譯後的結果是class文件,就能在jvm上進行執行。設計模式
經常使用JVM實現tomcat
HotSpot oracle官方安全
TaobaoVm服務器
J9 --IBMoracle
Microsoft VMapp
JDK JRE JVMjvm
jdk包含 JRE與JVM ide
JRE包含JVM
Class 文件結構(不重要)
經過javap -v class文件能夠進行查看
一:類加載-初始化Loading
classLoad 用的設計模式是 模板模式(父類把大部分方法都實現了,子類只實現一部分方法)只須要本身實現findClass實現便可
classLoad 裏面 每一個實現類都有個final Parent的 對象,每次classLoad加載類對象,在findClass裏,就須要從parent對象裏去查找類對象,若是找不到,就要從parent的parent對象裏去查找,找到就遞歸返回,找不到就返回ClassNotFind異常,讓子類去加載對象。。直到某個classLoader加載到了該類,或者最終拋出classNotFind異常。上面的這個過程就是雙親委派模型
擴展:類加載器範圍
Bootstrap:jdk最核心的lib sun.boot.class.path
Exetension: jdklib下ext包下的jar java.ext.dirs
AppClassLoader: classPath路徑下的jar, java.class.path
自定義ClassLoader:例如tomcat的WebApplication的classloader,就是本身實現的,破壞了雙親委派,實現了熱加載。
雙親委派模型
爲何要搞雙親委派?
主要是爲了安全(杜絕一些自定義java.lang.String與jdk提供的同包同名的狀況)
如何破壞雙親委派模式(熱加載)
像Tomcat這類web服務器有熱加載功能的是怎麼實現的?
其實tomcat本身實現了一套classLoader(不光重寫了findClass方法,還從新複寫了loadClass方法),若是有新的類或者修改的類在tomcat裏進行了編號,tomcat會使用classLoader 從新把全部classLoad從新load一下(直接去加載Webapp下全部文件,再也不去找父類的loadClass裏繼續查找),把從新load後的類複製給堆內存,以前的load的內容引用變成空,會被GC回收。
二:類 連接過程(Linking分三步)
Verification:校驗裝進來的class格式是否是符合class標準
Preparation:把class文件靜態變量賦默認值
Resolution:把class文件裏的常量池裏面用到的符號引用,轉換成直接內存地址能夠直接訪問的內容
三:類初始化(Initlalizing)
靜態變量這時候賦值才被賦值爲初始值
四:申請對象堆內存
五:成員變量福默認值
六:調用構造方法<init>
成員變量順序賦初始值
執行構造方法語句
對象在內存裏是怎麼佈局的
對象頭 8個字節
classPoint指針:-XX:+UseCompressedClassPointers 4個字節,不開啓8字節
實例數據(實例對象)
引用類型:
Padding對齊,8的倍數
使用agent(Instrumentation)能夠測試大小,