欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

目錄

柚子快報(bào)邀請(qǐng)碼778899分享:JVM初探

柚子快報(bào)邀請(qǐng)碼778899分享:JVM初探

http://yzkb.51969.com/

JVM的位置

JVM體系架構(gòu)

類(lèi)加載器

類(lèi)加載器收到類(lèi)加載的請(qǐng)求將這個(gè)請(qǐng)求委托給父類(lèi)加載器,一直向上委托,直到啟動(dòng)類(lèi)加載器啟動(dòng)類(lèi)加載器檢查是否能加載這個(gè)類(lèi),能加載就結(jié)束,使用當(dāng)前的加載器,否則就拋出異常,通知子加載器進(jìn)行加載重復(fù)步驟3若都沒(méi)找到拋出ClassNotFind異常

雙親委派機(jī)制:保護(hù)安全 (APP -> EXC -> BOOT) eg.如自己創(chuàng)建了一個(gè)和jdk庫(kù)中類(lèi)名相同的類(lèi),會(huì)一直向上找,最終在最上層運(yùn)行

Native

凡是帶了native關(guān)鍵字的,說(shuō)明java的作用范圍達(dá)不到了,會(huì)去調(diào)用底層C語(yǔ)言的庫(kù)! 會(huì)進(jìn)入本地方法棧,調(diào)用本地方法接口(JNI)

例如:new Tread().start() 源碼中的 start0()方法。 private native void start0();

使用場(chǎng)景:Java驅(qū)動(dòng)打印機(jī),主要用于調(diào)用硬件,一般用不到

程序計(jì)數(shù)器(PC計(jì)數(shù)器)

一個(gè)線(xiàn)程一個(gè)虛擬機(jī)棧,每個(gè)線(xiàn)程私有的,就是一個(gè)指針,指向方法區(qū)中的方法字節(jié)碼(用來(lái)存儲(chǔ)指向一條指令的地址,也即將要執(zhí)行的指令代碼),占內(nèi)存非常小可以忽略不計(jì)

方法區(qū)

方法區(qū)是被所有線(xiàn)程共享靜態(tài)變量、常量、類(lèi)信息(構(gòu)造方法、接口定義)、運(yùn)行時(shí)的常量池在方法區(qū)中,但是實(shí)例變量存在堆中。static、final、Class、常量池

虛擬機(jī)棧又叫棧內(nèi)存,主管程序的運(yùn)行,生命周期和線(xiàn)程同步 一個(gè)線(xiàn)程一個(gè)虛擬機(jī)棧,線(xiàn)程結(jié)束,棧內(nèi)存也就釋放,對(duì)于棧來(lái)說(shuō)不存在垃圾回收問(wèn)題 主要存放 8大基本類(lèi)型 + 對(duì)象引用地址 + 實(shí)例的方法

棧運(yùn)行原理:棧幀 棧滿(mǎn)了:StackOverflowError(遞歸循環(huán)調(diào)用)

棧、堆、方法區(qū)的調(diào)用關(guān)系:

Heap。一個(gè)JVM只有一個(gè)堆內(nèi)存,堆內(nèi)存的大小是可以調(diào)節(jié)的。

類(lèi)加載器讀取了類(lèi)文件后,一般會(huì)把類(lèi)、方法、常量、變量、保存我們所有引用類(lèi)型的真是對(duì)象放在堆中

JDK8以前,堆中分為三個(gè)區(qū)域

新生區(qū)

類(lèi):誕生和成長(zhǎng)的地方,甚至死亡所有的對(duì)象都是在伊甸園區(qū)被new出來(lái)的幸存者區(qū)(有0和1區(qū)) 老年區(qū)

經(jīng)過(guò)GC之后仍然存活的對(duì)象 永久區(qū) 這個(gè)區(qū)域常駐內(nèi)存,用來(lái)存放JDK自身攜帶的Class對(duì)象、Interface元數(shù)據(jù),存儲(chǔ)的是Java運(yùn)行時(shí)的環(huán)境。這個(gè)區(qū)域不存在垃圾回收。關(guān)閉虛擬機(jī)就會(huì)釋放這個(gè)區(qū)域的內(nèi)存。 以下情況會(huì)出現(xiàn)OOM:大量動(dòng)態(tài)生成的反射類(lèi)不斷被加載、Tomcat部署了太多應(yīng)用、一個(gè)啟動(dòng)類(lèi)加載了大量第三方Jar包

jdk1.6之前:永久代,常量池在方法區(qū)jdk1.7:永久代,常量池在堆中jdk1.8之后:元空間,常量池在元空間中。

GC垃圾回收主要在新生區(qū)和老年區(qū)

新生區(qū)中的伊甸園區(qū)滿(mǎn)了之后會(huì)發(fā)生輕量級(jí)GC

輕GC一次后未回收的對(duì)象在幸存區(qū),達(dá)到15或20次之后到達(dá)養(yǎng)老區(qū) 老年區(qū)滿(mǎn)了之后會(huì)發(fā)生重量級(jí)GC(Full GC)

假設(shè)內(nèi)存滿(mǎn)了,會(huì)報(bào)錯(cuò)OOM。(例如String一直+=)

堆內(nèi)存OOM解決:

嘗試擴(kuò)大堆內(nèi)存看結(jié)果:在Edit Configuration界面VM options參數(shù)中填寫(xiě): -Xms1024m -Xmx1024m。(默認(rèn)情況下分配的總內(nèi)存是電腦內(nèi)存的1/4,而初始化的內(nèi)存是1/64)分析內(nèi)存,看哪個(gè)地方出現(xiàn)了問(wèn)題(一般是內(nèi)存泄露)使用JProfiler

新生區(qū)的內(nèi)存大小+老年區(qū)的內(nèi)存大小=總內(nèi)存大小,說(shuō)明了元空間邏輯上存在物理上不存在。

使用JProfiler工具分析OOM原因

idea下載JProfiler插件,百度下載JProfiler軟件

在Edit Configuration界面VM options參數(shù)中填寫(xiě): -Xms1m -Xmx8m -Xx:+HeapDumpOnOutOfMemoryError) 其中(OutOfMemoryError)可替換,-Xms設(shè)置初始化內(nèi)存分配大小, -Xmx設(shè)置最大分配內(nèi)存,-Xx:+PrintGCDetails打印GC垃圾回收具體信息,-Xx:+HeapDumpOnOutOfMemoryError打印OOM Dump信息

運(yùn)行后會(huì)在src同級(jí)目錄自動(dòng)生成 .hprof文件,雙擊打開(kāi)后可在Biggest Objects中查看哪些類(lèi)占用較大 在左側(cè)Heap walker中可查看哪行代碼出了問(wèn)題

GC垃圾回收算法

只在堆中進(jìn)行GC,

引用計(jì)數(shù)法(基本不會(huì)使用) 復(fù)制算法

from和to區(qū)是隨時(shí)變換的,但to區(qū)一定是空的。 將幸存區(qū)from中的對(duì)象全部移動(dòng)到to中。

好處:沒(méi)有內(nèi)存的碎片壞處:浪費(fèi)了內(nèi)存空間:永遠(yuǎn)都會(huì)有一塊是空的(to區(qū))。當(dāng)from全部存活時(shí),復(fù)制算法將會(huì)造成非常大的浪費(fèi)。使用場(chǎng)景:對(duì)象存活度較低的時(shí)候(新生區(qū))

標(biāo)記清除算法 缺點(diǎn):兩次掃描,嚴(yán)重浪費(fèi)時(shí)間,會(huì)產(chǎn)生內(nèi)存碎片 有點(diǎn):不需要額外空間 標(biāo)記整理(標(biāo)記壓縮)

在標(biāo)記清除的步驟中多加了一步掃描:整理

標(biāo)記清除整理(標(biāo)記清除壓縮算法)

在標(biāo)記清除5次后,再進(jìn)行整理

總結(jié):

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

沒(méi)有最優(yōu)的算法,只有最合適的算法------>GC分代收集算法

GC分代收集算法: 年輕代:存活率低,使用復(fù)制算法 老年代:區(qū)域大、存活率高:標(biāo)記清楚(內(nèi)存碎片不是太多) + 標(biāo)記整理混合實(shí)現(xiàn)

輕GC(Minor GC)和重GC(Full GC)

Minor GC

當(dāng)新對(duì)象去伊甸園區(qū)(Eden)申請(qǐng)內(nèi)存失敗的時(shí)候,就會(huì)進(jìn)行Minor GC,對(duì)伊甸園區(qū)(Eden)回收非存活對(duì)象,而沒(méi)有被回收的對(duì)象,會(huì)進(jìn)入幸存區(qū)(Survivor),這種GC只發(fā)生在伊甸園區(qū)(Eden),不會(huì)影響到老年區(qū)。因?yàn)樾聦?duì)象分配內(nèi)存大部分都在伊甸園區(qū)(Eden),所以伊甸園區(qū)(Eden)GC比較頻繁。

注意:在GC之后,還存活的對(duì)象,進(jìn)入幸存區(qū)(Survivor),誰(shuí)空誰(shuí)是to,可以交換位置,當(dāng)一個(gè)對(duì)象經(jīng)歷了15次GC(可以配置次數(shù):-XX:+MaxTenuringThreshold=15),還存活,就進(jìn)入老年區(qū)。

Full GC

清理整個(gè)堆,因?yàn)镕ull GC需要對(duì)整個(gè)堆進(jìn)行回收,所以比Minor GC慢,因?yàn)槲覀円M可能的減少Full GC的次數(shù)。我們所說(shuō)的JVM調(diào)優(yōu),很大一部分就是對(duì)Full GC的優(yōu)化。

以下情況會(huì)造成 Full GC:

老年區(qū)滿(mǎn)了:年輕區(qū)的對(duì)象轉(zhuǎn)入或創(chuàng)建大對(duì)象才會(huì)滿(mǎn)。 持久區(qū)滿(mǎn)了(jdk7及之前版本) 方法區(qū)滿(mǎn)了(jdk8及之后版本):系統(tǒng)中要加載的類(lèi)過(guò)多。 System.gc() 被顯示調(diào)用 通過(guò)Minor GC后進(jìn)入老年代的平均大小大于老年代的可用內(nèi)存:第一次Minor GC之后,有2MB的對(duì)象轉(zhuǎn)入老年區(qū),然后在下一次Minor GC的時(shí)候就會(huì)判斷老年區(qū)的空間是否有2MB,如果沒(méi)有就進(jìn)行Full GC。

拓展

JMM

什么是JMM Java Memory Model :Java內(nèi)存模型它干嘛的? 緩存一致性協(xié)議,用于定義數(shù)據(jù)讀寫(xiě)的規(guī)則(遵守) JMM中定義了線(xiàn)程工作內(nèi)存與主內(nèi)存之間的抽象關(guān)系:線(xiàn)程之間的共享變量存儲(chǔ)在主內(nèi)存(Main Memory)中,每個(gè)線(xiàn)程都有一個(gè)私有的本地內(nèi)存(Local Memory)

解決共享對(duì)象可見(jiàn)性的問(wèn)題:volatile

柚子快報(bào)邀請(qǐng)碼778899分享:JVM初探

http://yzkb.51969.com/

精彩文章

評(píng)論可見(jiàn),查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀(guān)點(diǎn)和立場(chǎng)。

轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/19010419.html

發(fā)布評(píng)論

您暫未設(shè)置收款碼

請(qǐng)?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪(fǎng)問(wèn)

文章目錄