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

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

JVM

創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比儋州網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式儋州網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋儋州地區(qū)。費(fèi)用合理售后完善,10余年實(shí)體公司更值得信賴。雙親委派機(jī)制
  • 類(lèi)代碼加載,并實(shí)例化的過(guò)程:
    • class.car → class loader
    • 加載 + 初始化:class loader → class car模版
    • new :相當(dāng)于從class car模版實(shí)例化一個(gè)對(duì)象
    • getClass:和new相反。getClassLoader可以獲得加載器
  • 雙親委派機(jī)制:new 一個(gè)對(duì)象,尋找類(lèi)的過(guò)程:
    • 現(xiàn)在boot加載器中尋找(jre/lib/rt.jar)
    • 再去ext加載器中尋找(jre/lib/ext/…)
    • 最后在app加載器(用戶寫(xiě)的)尋找
  • 雙親委派的作用:
    • 防止用戶自己寫(xiě)系統(tǒng)自帶的類(lèi)。例如自己寫(xiě)String是無(wú)效的,除非修改rt.jar,但是修改會(huì)導(dǎo)致所有的使用String的其他類(lèi)崩潰
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機(jī)制
  • 組成
    • 字節(jié)校驗(yàn)碼:要求用戶寫(xiě)的代碼符合要求。但是核心類(lèi)(java/…和javax/…)不需要檢驗(yàn)
    • 類(lèi)裝載器(其實(shí)是雙親委派機(jī)制在起作用):不可改變核心類(lèi)
Native
  • 代碼:
public class Demo1 {
    public static void main(String[] args) {
        new Thread(()->{

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

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

  • 堆的東西:類(lèi)、方法、常量、變量、 真實(shí)對(duì)象

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

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

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

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

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

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

    • jdk1.6 :永久代,常量池在方法區(qū)
    • jdk1.7:永久代(退化),常量池在堆中
    • jdk1.8:無(wú)永久帶,常量池在元空間(不再JVM中,本地內(nèi)存)中
  • 元空間、永久區(qū)、方法區(qū)、常量池關(guān)系:java8 hotspot取消了永久區(qū)。方法區(qū)是一個(gè)規(guī)范,規(guī)范沒(méi)變,它就一直在,取而代之的是元空間,元空間存儲(chǔ)類(lèi)的元信息,靜態(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();
        //默認(rèn)大為電腦內(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

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

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

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

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

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

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

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

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

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

新聞標(biāo)題:JVM2.-創(chuàng)新互聯(lián)
分享網(wǎng)址:http://muchs.cn/article10/coiddo.html

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

廣告

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

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