JVM 一 ClassLoad

JVM 2-classLoadjava

Java編譯過程web

圖片


JVM 能夠跨平臺執行,目前有不少語言都基於JVM進行執行,例如scala,grovy等,jvm只與class文件交互,只要一門語言編譯後的結果是class文件,就能在jvm上進行執行。設計模式

經常使用JVM實現tomcat

  1. HotSpot  oracle官方安全

  1. TaobaoVm服務器

  1. J9 --IBMoracle

  1. Microsoft VMapp

JDK JRE JVMjvm

  1. jdk包含 JRE與JVM   ide

  1. 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分三步)

  1. Verification:校驗裝進來的class格式是否是符合class標準

  1. Preparation:把class文件靜態變量賦默認值

  1. Resolution:把class文件裏的常量池裏面用到的符號引用,轉換成直接內存地址能夠直接訪問的內容

三:類初始化(Initlalizing)

靜態變量這時候賦值才被賦值爲初始值

四:申請對象堆內存

五:成員變量福默認值

六:調用構造方法<init>

  1. 成員變量順序賦初始值

  1. 執行構造方法語句

對象在內存裏是怎麼佈局的

  1. 對象頭  8個字節

  1. classPoint指針:-XX:+UseCompressedClassPointers 4個字節,不開啓8字節

  1. 實例數據(實例對象)

    1. 引用類型:

  1. Padding對齊,8的倍數

使用agent(Instrumentation)能夠測試大小,

相關文章
相關標籤/搜索