欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

JVM2.-創(chuàng)新互聯(lián)

JVM體系結(jié)構(gòu)

JVM

創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比儋州網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式儋州網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋儋州地區(qū)。費用合理售后完善,10余年實體公司更值得信賴。雙親委派機制
  • 類代碼加載,并實例化的過程:
    • class.car → class loader
    • 加載 + 初始化:class loader → class car模版
    • new :相當于從class car模版實例化一個對象
    • getClass:和new相反。getClassLoader可以獲得加載器
  • 雙親委派機制:new 一個對象,尋找類的過程:
    • 現(xiàn)在boot加載器中尋找(jre/lib/rt.jar)
    • 再去ext加載器中尋找(jre/lib/ext/…)
    • 最后在app加載器(用戶寫的)尋找
  • 雙親委派的作用:
    • 防止用戶自己寫系統(tǒng)自帶的類。例如自己寫String是無效的,除非修改rt.jar,但是修改會導(dǎo)致所有的使用String的其他類崩潰
public class Car {public static void main(String[] args) {Car car1 = new Car();
        Car car2 = new Car();
        System.out.println(car1 == car2);       //false,故其hascode不同
        System.out.println(car1.getClass() == car2.getClass()); //true,故其hascode相同
        System.out.println(car1.getClass().getClassLoader());     //AppClassLoader
        System.out.println(car1.getClass().getClassLoader().getParent());   //ExtClassLoader       

    }
}
SandBox機制
  • 組成
    • 字節(jié)校驗碼:要求用戶寫的代碼符合要求。但是核心類(java/…和javax/…)不需要檢驗
    • 類裝載器(其實是雙親委派機制在起作用):不可改變核心類
Native
  • 代碼:
public class Demo1 {
    public static void main(String[] args) {
        new Thread(()->{

        },"adair");
    }
    //native:java本身無法完成,無方法體,需要調(diào)用底層
    //native會進入本地方法棧 → JNI → 本地方法庫
    //JNI作用,擴展java語言,融合不同編程語言為java使用。
    //例如java驅(qū)動打印機,管理系統(tǒng),寫外掛
    private native void start0();
}
內(nèi)存 方法區(qū)
  • 方法區(qū)是一種規(guī)范,實現(xiàn)之前是永久區(qū),如今是元空間。所有定義方法的信息都保存在該區(qū)域。
  • 靜態(tài)變量、常量、類信息(構(gòu)造方法/定義接口)、運行時的常量池都在方法區(qū)(static、final、class、 常量池)。但是對象存在于堆中
  • main最先執(zhí)行,最后結(jié)束
  • 線程結(jié)束,棧內(nèi)存就釋放。對于棧不存在垃圾
  • 棧內(nèi):基本類型 + 對象引用 + 實例方法
  • 棧內(nèi)以棧幀為單位
  • 程序正在運行的方法,一定在棧的頂部
  • JVM有三種hotspotJ9VMJRockit

  • 一個JVM只有一個堆,且堆內(nèi)存的大小可變

  • 堆的東西:類、方法、常量、變量、 真實對象

  • 堆的三個區(qū)域:

    • 新生區(qū):伊甸園eden、幸存去s0(from)、s1(to)。輕GC
    • 養(yǎng)老區(qū):常用的數(shù)據(jù)。重GC(Full GC)
    • 永久區(qū)(元空間)
  • 新生區(qū):類的誕生 + 甚至死亡的地方。

  • eden:對象被new的地方,滿了就會觸發(fā)輕GC,幸存者存放在s1

  • 如果幸存區(qū)滿了,引發(fā)重GC(全局清理),送入養(yǎng)老區(qū)

  • 如果養(yǎng)老區(qū)滿了,則OOM

  • 永久區(qū):常駐內(nèi)存,存放JDK自身的Class對象。interface元數(shù)據(jù),存儲的是java運行時的環(huán)境。這個區(qū)域無GC,關(guān)閉JVM即可釋放此區(qū)域。一個啟動類,加載大量第三方j(luò)ar包,或者生成大量的反射類,直到OOM

    • jdk1.6 :永久代,常量池在方法區(qū)
    • jdk1.7:永久代(退化),常量池在堆中
    • jdk1.8:無永久帶,常量池在元空間(不再JVM中,本地內(nèi)存)中
  • 元空間、永久區(qū)、方法區(qū)、常量池關(guān)系:java8 hotspot取消了永久區(qū)。方法區(qū)是一個規(guī)范,規(guī)范沒變,它就一直在,取而代之的是元空間,元空間存儲類的元信息,靜態(tài)變量和常量池等并入堆中。

  • 元空間:邏輯存在,物理不存在

  • JVM調(diào)參:

public class Car {public static void main(String[] args) {//jvm試圖使用的大內(nèi)存
        long l = Runtime.getRuntime().maxMemory();
        //jvm初始化的內(nèi)存
        long l1 = Runtime.getRuntime().totalMemory();
        //默認大為電腦內(nèi)存的1/4,初始化為1/64
        System.out.println(l/(double)1024/1024);
        System.out.println(l1/(double)1024/1024);

        //jvm調(diào)參:-Xms1024m -Xmx2g -XX:+PrintGCDetails
    }
}
Jprofiler

在一個很大項目中,出現(xiàn)了OOM,OOM要想捕獲用Error e捕獲,如何使用專業(yè)工具排錯

  • Jprofiler作用
    • 分析dump文件,定位泄露
    • 獲得堆的數(shù)據(jù)
  • 安裝過程:
    • 現(xiàn)在idea中找好Jprofiler接口
    • 然后下載Jprofiler,記住安裝路徑(environment)
    • 然后配置接口到j(luò)profiler9/bin/jprofiler.exe
  • Vm options配置-Xms1m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError
  • 點擊運行代碼(死循環(huán)),即可生成帶有OOM的dump文件,使用jprofiler打開即可分析
  • dump文件分析:
    • 可以查看大的數(shù)據(jù)在哪里,很大程度OOM
    • Thread Dump可查看線程的main函數(shù)中具體第幾行出現(xiàn)錯誤
GC

JVM的GC幾乎全部在堆中,對堆的清理大部分在eden區(qū)

  • 輕GC:在新生區(qū)進行操作,操作后會將eden活的對象移到幸存區(qū),從而eden為空。當一個對象經(jīng)過默認值15次還沒死,就去養(yǎng)老區(qū)
  • Full GC:全局
  • GC算法:
    • 引用計數(shù)法:顧名思義。計數(shù)器本身也會有消耗,辣雞
    • 復(fù)制算法:s0 s1相互轉(zhuǎn)換,沒有內(nèi)存碎片,但是永遠有一半未使用
    • 標記清除算法:先進行標記,再清除。兩次掃描浪費時間,有內(nèi)存碎片。
    • 標記清除壓縮
總結(jié)

內(nèi)存效率:復(fù)制算法 >標記清除 >標記壓縮 (時間復(fù)雜度)

內(nèi)存整齊度:復(fù)制算法 = 標記壓縮 >標記清除

內(nèi)存利用率:標記壓縮 = 標記清除 >復(fù)制算法

  • JVM調(diào)優(yōu):沒有最好的算法,只有最合適的算法 -->分代收集算法
    • 年輕代:存活低、故使用復(fù)制算法
    • 老年代:區(qū)域大,存活高。使用標記清楚 + 標記壓縮 實現(xiàn)
JMM
  • JMM就是java memory module,相當于是一個規(guī)則
  • 作用:
    • 緩存一致性協(xié)議,用于定義數(shù)據(jù)讀寫的規(guī)則
    • JMM定義了線程和內(nèi)存之間的抽象關(guān)系:線程之間的共享變量存儲在主內(nèi)存(main memory),每個線程都有一個私有的本地內(nèi)存(local memory),線程的本地內(nèi)存是從主內(nèi)存復(fù)制的,由于多個線程對一個對象進行操作,因此需要解決volatile

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

新聞標題:JVM2.-創(chuàng)新互聯(lián)
分享網(wǎng)址:http://www.chinadenli.net/article10/coiddo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站小程序開發(fā)網(wǎng)站維護自適應(yīng)網(wǎng)站商城網(wǎng)站虛擬主機

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)