天天看點

jvm學習《inside in jvm》,深入java虛拟機

1.java的體系結構

  java虛拟機

  類裝載器的體系結構

  java class 問題就

  java API

  java程式設計語言

2.平台無關性

 基于java平台的版本

 如果使用了本地方法,這樣的話就跟平台相關

 保證程式的最佳可移植性而采取的途徑:

a.選擇程式要運作的主機和裝置的集合

b.在目标主控端中選擇自認為足夠好的java平台版本,在改版本java平台上編寫、運作程式

c.對每個目标主控端,選擇一些程式将要運作的java平台實作

d.編寫程式,使它隻通過java API 的标準運作庫來通路計算機(不要使用本地方法,或者開發商專有的那些調用本地的方法庫)

e.編寫程式,使它不依賴垃圾收集器及時終結的正确性,也不依賴線程的優先級

f.努力設計一個使用者界面,使它在你所有的目标主控端上都能正常工作

g. 在所有的目标運作時的環境和所有的目标主控端上測試程式

3.安全

 組成java沙箱的基本元件有:

a.類裝載器結構

b.class檔案檢驗器

c.内置于java虛拟機的安全性

d.安全管理器及java API

使用者可以自定義沙箱

a.在java沙箱中,類裝載器體系結構是第一道防線,

類裝載器體系結構作用:放在惡意代碼去幹涉善意的代碼(通過由不同的類裝載器載入的類提供不同的命名空間實作的),守護了被信任的類庫的邊界(通過分别使用不同的類裝載器可靠的包和不可靠的包來實作,還可以通過簡單的拒絕裝載特定的禁止類型就可以了),将代碼歸入某類,該類确定了代碼可以進行的操作

b.class檔案檢查器

 class檔案檢查器保證裝載的class檔案内容有正确的内容結構,并且這些class檔案互相間協調一緻

 class檔案檢查器要進行四趟獨立的掃描來完成他的操作:第一趟:class檔案的結構檢查,第二趟:類型資料的語義檢查,第三趟:位元組碼驗證,第四趟:符号引用的驗證

c.内置于java虛拟機的安全性(類型轉換等)

d.安全管理器和java API

 abc起到一個共同的目的:保持java虛拟機的執行個體和它正在運作的應用程式的内部完整性,使得他們不被下載下傳的惡意或有漏洞的代碼侵犯。安全管理器主要用于飽和虛拟機的外部資源不被虛拟機内運作的惡意或有害的代碼侵犯,定義了沙箱外部邊界可以被定制

4.網絡移動性

5.java虛拟機

   a.java虛拟機是什麼(抽象的規範,一個具體的實作,一個運作的虛拟機執行個體)

   b.java虛拟機的生命周期

       一個運作時的java虛拟機執行個體的天職就是:負責運作一個java程式。當啟動一個java程式時,一個虛拟機執行個體也就誕生了,當該程式關閉退出,這個虛拟機執行個體也就随之消亡。如果在同一台計算機上同時運作三個java程式,将得到三個java虛拟機執行個體。每個java程式都運作于自己的java虛拟機執行個體中。

       java虛拟機執行個體通過調用某個初始類的main()方法來運作一個java程式。而這個main()方法必須是共有的(public)、靜态的(static)、傳回值為void、并且接受一個字元串數組作為參數。任何擁有這樣一個main()方法的類都可以作為java程式運作的起點。

        java虛拟機内部有兩種線程:守護線程與非守護線程。守護線程通常是由虛拟機自己使用的,比如執行垃圾收集任務的線程。但是java程式也可以把它建立的任何線程标記為守護線程,而java程式中的初始線程(main())是非守護線程。隻要有任何非守護線程在運作,那麼這個java程式也在繼續運作,當該程式中的所有非守護線程都終止時,虛拟機執行個體将自動退出

c.java虛拟機的體系結構

一個虛拟機執行個體的行為是分别按照子系統、記憶體區、資料類型及指令

 c.1 資料類型(基本類型和引用類型),基本類型的變量持有原始值(真正的原始資料),引用類型的變量持有引用值(“引用值指的是某個對象的引用,而不是該對象本身”)

c.2 字長的考量

c.3 類裝載子系統,java虛拟機有兩種類裝載器:啟動類裝載器和使用者自定義裝載器。類裝載器子系統任務:1裝載(查找并裝載類型的二進制資料),2連接配接(執行驗證(確定被導入類型的正确性),準備(為類變量配置設定記憶體,并将其初始化為預設值),解析(把類型中的符号引用轉換為直接引用)),3初始化(吧類變量初始化為正确初始值)。

c.4方法區 對每個裝載的類型,虛拟機都會在方法區中存儲以下類型的資訊:這個類型的全限定名,這個類型的直接超類的全限定名(除非這個類型是java.lang.Object,他沒有超類),這個類型是類類型還是接口類型,這個類型的通路修飾符,任何直接超接口的全限定名的有序清單。除了列出的基本類型資訊外,虛拟機還得為每個被裝載的類型存儲以下資訊:該類型的常量池,字段資訊,方法資訊,除了常量以外的所有類變量,一個到類classloader的引用

常量池:虛拟機必須為每個被裝載的類型維護一個常量池,常量池就是該類型所用常量的一個有序集合,包括直接常量(string,integer,floating point常量)和對其他類型、字段和方法的符号引用。池中的資料項就像數組一樣是通過引索通路的,

字段資訊:字段資訊清單如下:字段名,字段類型,字段的修飾符

方法資訊:方法名,傳回類型,方法參數的數量和類型,方法的修飾符

類變量:

 c.4堆

 c.5程式計數器

 c.6java棧