JVM探究(一)談談雙親委派機制和沙箱安全機制

輕狂書生han 發表於 2022-01-14
JVM

JVM探究

  • 請你談談你對JVM的理解?java8虛擬機器和之前的變化gengxin?

  • 什麼是OOM,什麼是棧溢位StackOverFlowError

  • JVM的常用調優引數有哪些?

  • 記憶體快轉如何抓取,怎麼分析Dump檔案?知道嗎?

  • 談談你對JVM中類載入器的認識?

1.JVM的位置

image

2.JVM的體系結構

image

  • 棧裡面肯定不會有垃圾,用完就彈出來了。

  • 堆裡面會有垃圾

  • JVM調優99%都是調方法區和堆

3.類的載入器

  • 作用:載入class檔案~ new Student();

image

package com.qingkuang.reflection;



public class TestCar {

    public int age;

    public static void main(String[] args) {
        TestCar car1 = new TestCar();
        TestCar car2 = new TestCar();
        TestCar car3 = new TestCar();

        car1.age=1;
        car2.age=2;
        car3.age=3;


        System.out.println(car1.hashCode());
        System.out.println(car2.hashCode());
        System.out.println(car3.hashCode());

        Class<? extends TestCar> aClass1 = car1.getClass();
        Class<? extends TestCar> aClass2 = car2.getClass();
        Class<? extends TestCar> aClass3 = car3.getClass();

        System.out.println(aClass1.hashCode());
        System.out.println(aClass2.hashCode());
        System.out.println(aClass3.hashCode());
    }


}

image

​ (1).虛擬機器自帶的載入器

​ (2).啟動類(根)載入器

​ (3.)擴充套件類載入器

​ (4.)應用程式載入器

​ (5)百度雙親委派機制

4.雙親委派機制

image

  • 雙親委派機制:安全

  • 1.APP--->EXC--->BOOT(最終執行)

  • BOOT沒有-->EXC沒有-->APP

image

修改檔案路徑

image

  1. 類載入器收到類載入請求 Application
  2. 講個這請求向上委託給父類載入器去完成,一直向上委託,直到啟動類載入器。
  3. 啟動載入器檢查是否能夠載入當前這個類,能加在就結束,使用當前的載入器,否則,丟擲異常,通知自家在其進行載入
  4. 重複步驟3
  5. Class Not Found

​ null:java呼叫不到~c、c++

​ Java = C++--;去掉繁瑣的東西,指標,記憶體管理

5.沙箱安全機制

​ Java安全模式的核心就是Java沙箱(sandbox),什麼是沙箱,沙箱是一個限制程式執行的環境。沙箱機制就是將Java程式碼限定在虛擬機器(JVM)特定的執行範圍中,並且嚴格限制程式碼對本地系統支援訪問,通過這樣的措施,來保證堆程式碼的有效隔離,防止堆本地系統造成破壞。沙箱主要限制系統資源訪問,那麼系統支援包括什麼?CPU、記憶體、檔案系統、網路。不同級別的沙箱對這些資源訪問也可以不一樣。

​ 所有的Java程式執行都可以指定沙箱,可以定製安全策略

​ 在java中將執行程式分成原生程式碼和遠端程式碼兩種,原生程式碼預設為可信任的,而遠端程式碼則是被看作是不受信任的。堆與手心的原生程式碼,可以訪問一切本地資源。而非堆非授信的遠端程式碼在早期的Java實現中,安全依賴於沙箱(sandbox)機制。如下圖所示的JDK1.0安全模型。

image

​ 但如此嚴格的安全機制也給程式的功能擴充套件帶來障礙,比如當使用者希望遠端程式碼訪問本地系統檔案的時候,就無法實現,因此在後續的Java1.1版本中,針對安全機制做了改進,增加了安全策略,允許使用者指定的程式碼對本地資源的訪問許可權。如下圖所示JDK1.1安全模型。

image

​ 在Java1.2版本中,再次改進了安全機制,增加了程式碼簽名,不論原生程式碼或是遠端程式碼,都會按照使用者的安全策略設定,由類載入器到虛擬機器中許可權不同的執行空間。來實現差異化的程式碼執行許可權控制,如下圖所示。JDK1.2安全模型。

image

​ 當前最新的安全機制實現,則引入了域(Domain)的還念。虛擬機器會把所有程式碼載入到不同的系統域和應用域,系統域部分專門負責域關鍵資源機型互動,而各個應用域部分則通過系統域的部分代理來對各種需要的資源進行訪問。虛擬機器中不同的受保護域(Protected Domain),對應不一樣的許可權(Permission)。存在於不同於域中的類檔案就具有了當前域的全部許可權,如下圖所示,最新的安全模型(jdk1.6)

image

組成沙箱的基本元件:

  • 位元組碼校驗器(bytecode verifier):確保Java類檔案遵循Java語言規範。這樣可以幫助Java程式實現記憶體保護。但並不是所有的類檔案都會經過位元組校驗,比如核心類。
  • 類裝載器(class loader):其中類裝載器在3個方面對Java沙箱起作用
    • 它防止惡意程式碼去幹涉善意的程式碼;//雙親委派機制
    • 他守護了被信任的類庫邊界;
    • 他守護了被信任的類庫邊界;
    • 他將程式碼歸入保護域,確定了程式碼可以進行那些操作。

​ 虛擬機器為不同的類載入器載入的類提供了不同的名稱空間,名稱空間由一系列唯一的名稱組成,每一個被裝載的類將有一個名字,這個名稱空間是由Java虛擬機器為每一個類裝載器維護的,他們相互之間甚至不可見。

​ 類載入器採用的機制是雙親委派機制

  1. 從最內層JVM自帶類載入器開始載入,外層而已同名類的不到載入congress無法使用;
  2. 由於嚴格通過包來區分了訪問域,外層而已的類通過內建程式碼也無法獲得許可權到內層類,破壞程式碼就自然無法生效。
  • 存取控制器(access controller):存取控制器可以控制核心API對作業系統的存取許可權,二這個控制的策略設定,可以由使用者指定。
  • 安全管理器(security manager):是核心API和作業系統之間的主要介面。實現許可權控制,比存取控制器優先順序高
  • 安全軟體包(security package):java.security下的類和擴充套件包下的類,允許使用者為自己的應用增加新的安全特性,包括
    • 安全提供者
    • 訊息摘要
    • 數字簽名 keytools https
    • 加密
    • 鑑別