wordpress采集網(wǎng)頁(yè)文章安卓?jī)?yōu)化大師app下載
目錄
- Java對(duì)象內(nèi)存布局
- markWord 數(shù)據(jù)結(jié)構(gòu)
- JDK1.8 JVM 內(nèi)存結(jié)構(gòu)
- JDK1.8堆內(nèi)存結(jié)構(gòu)
- GC垃圾回收
- 如何發(fā)現(xiàn)垃圾
- 如何回收垃圾
- JVM調(diào)優(yōu)參數(shù)
Java對(duì)象內(nèi)存布局
markWord 數(shù)據(jù)結(jié)構(gòu)
JDK1.8 JVM 內(nèi)存結(jié)構(gòu)
-
程序計(jì)數(shù)器:
線程私有,記錄代碼執(zhí)行的位置. -
Java虛擬機(jī)棧:
線程私有,每個(gè)線程都有一個(gè)自己的Java虛擬機(jī)棧 ,默認(rèn)大小是1M -
本地方法棧:
線程私有,每個(gè)線程都有一個(gè)自己的本地方法棧,Java虛擬機(jī)棧加載的是普通方法,本地方法加載的是native
修飾的方法.native
:表示這個(gè)方法不是java原生的,是由C或C++實(shí)現(xiàn)的 -
堆:
線程共享,用于存放對(duì)象,new的對(duì)象都存儲(chǔ)在這個(gè)區(qū)域 -
元空間:
線程共享,存儲(chǔ)class信息,類(lèi)的信息,方法的定義,靜態(tài)變量,常量池 等
- 堆和元空間是線程共享的,在Java虛擬機(jī)中只有一個(gè)堆、一個(gè)元空間,并在JVM啟動(dòng)的時(shí)候就創(chuàng)建,JVM停止才銷(xiāo)毀。
- 棧、本地方法棧、程序計(jì)數(shù)器是每個(gè)線程私有的,隨著線程的創(chuàng)建而創(chuàng)建,隨著線程的結(jié)束而死亡。
每個(gè)存儲(chǔ)位置會(huì)產(chǎn)生的異常:
JDK1.8堆內(nèi)存結(jié)構(gòu)
- 年輕代:Eden+S0+S1, S0和S1大小相等, 新創(chuàng)建的對(duì)象都在年輕代
- 老年代:經(jīng)過(guò)年輕代 多次垃圾回收存活下來(lái)的對(duì)象存在年老代中.
GC垃圾回收
JVM的垃圾回收動(dòng)作可以大致分為兩大步:
- 如何發(fā)現(xiàn)垃圾
- 如何回收垃圾
線程私有的不存在垃圾回收,只有線程共享的才會(huì)存在垃圾回收,所以堆中存在垃圾回收.
如何發(fā)現(xiàn)垃圾
常見(jiàn)的用于「發(fā)現(xiàn)垃圾」的算法有兩種,引用計(jì)數(shù)算法 和 根搜索算法。
-
引用計(jì)數(shù)算法
堆中的對(duì)象每被引用一次,則計(jì)數(shù)器加1,每減少一個(gè)引用就減1,當(dāng)對(duì)象的引用計(jì)數(shù)器為0時(shí)可以被當(dāng)作垃圾收集。- 優(yōu)點(diǎn):快。
- 缺點(diǎn):無(wú)法檢測(cè)出循環(huán)引用。如兩個(gè)對(duì)象互相引用時(shí),他們的引用計(jì)數(shù)永遠(yuǎn)不可能為0。
-
根搜索算法(也叫根可達(dá)性分析)
根搜索算法是把所有的引用關(guān)系 看作一張圖,從根節(jié)點(diǎn)(GCRoot)開(kāi)始遍歷,找出被根節(jié)點(diǎn)引用的節(jié)點(diǎn),對(duì)于沒(méi)有被根節(jié)點(diǎn)指向的節(jié)點(diǎn),即可以當(dāng)作垃圾。- Java中可作為GCRoot的對(duì)象有:
- java虛擬機(jī)棧中引用的對(duì)象
- 本地方法棧引用的對(duì)象
- 元空間中靜態(tài)屬性引用的對(duì)象
- 元空間中常量引用的對(duì)象
- Java中可作為GCRoot的對(duì)象有:
如何回收垃圾
Java中用于「回收垃圾」的常見(jiàn)算法有4種:
-
標(biāo)記-清除算法(markandsweep)
首先標(biāo)記出所有需要回收的對(duì)象,在標(biāo)記完成之后統(tǒng)一回收掉所有被標(biāo)記的對(duì)象。缺點(diǎn): 標(biāo)記清除之后會(huì)產(chǎn)生大量的不連續(xù)的內(nèi)存碎片
-
標(biāo)記-整理算法
首先標(biāo)記出所有需要回收的對(duì)象,讓所有存活的對(duì)象移動(dòng)到另一個(gè)位置,在移動(dòng)過(guò)程中清理掉可回收的對(duì)象,這個(gè)過(guò)程叫做整理。優(yōu)點(diǎn):內(nèi)存被整理后不會(huì)產(chǎn)生大量不連續(xù)內(nèi)存碎片
缺點(diǎn):耗時(shí)耗力 -
復(fù)制算法(copying)
將空間分成大小相等的兩塊,每次只使用其中一塊,當(dāng)這塊內(nèi)存使用完了,就將存活的對(duì)象復(fù)制到另一塊內(nèi)存上去,然后把使用過(guò)的內(nèi)存空間一次清理掉。缺點(diǎn):可使用的內(nèi)存只有原來(lái)一半。在某一個(gè)時(shí)刻點(diǎn),總有一個(gè) S 是空的,可能是S0 也可能是S1.。
-
分代收集算法(generation)
當(dāng)前主流JVM都采用分代收集(GenerationalCollection)算法,這種算法會(huì)根據(jù)對(duì)象存活周期的不同將內(nèi)存劃分為年輕代、年老代,不同生命周期的對(duì)象可以采取不同 的回收算法,以便提高回收效率。-
年輕代(YoungGeneration)
- 所有新生成的對(duì)象首先都是放在年輕代的。
- 新生代內(nèi)存按照
8:1:1
的比例分為一個(gè)eden區(qū)和兩個(gè)Survivor(s0,s1)區(qū)。大部分對(duì)象在Eden區(qū)中生成。
回收流程:
回收時(shí)先將eden區(qū)存活的對(duì)象復(fù)制到一個(gè)s0區(qū),然后清空eden區(qū),當(dāng)這個(gè)s區(qū),也存放滿了時(shí),則將eden區(qū)和s0區(qū)存活對(duì)象復(fù)制到另一個(gè)s1區(qū),然后清空eden和這個(gè)s0區(qū),此時(shí)s0區(qū)是空的,然后將s0區(qū)和s1區(qū)交換,即保持s1區(qū)為空,如此往復(fù).-
特殊情況:當(dāng)一個(gè)大對(duì)象不足于存放到eden區(qū)時(shí),就將存活對(duì)象直接存放到老年代。若是老年代也滿了就會(huì)觸發(fā)一次
FullGC
,也就是新生代、老年代都進(jìn)行回收。 -
新生代發(fā)生的GC也叫做MinorGC,MinorGC發(fā)生頻率比較高
-
年老代(OldGeneration)
-
在年輕代中經(jīng)歷了 N次垃圾回收后仍然存活的對(duì)象,就會(huì)被放到年老代中。因此,可以認(rèn)為年老代中存放的都是一些生命周期較長(zhǎng)的對(duì)象。默認(rèn)是15次,且最大15次。
-
內(nèi)存比新生代也大很多(大概是2倍),當(dāng)老年代內(nèi)存滿時(shí)觸發(fā)FullGC,
FullGC發(fā)生頻率比較低,老年代對(duì)象存活時(shí)間比較長(zhǎng),存活率比較高。
-
-
元空間-持久代(PermanentGeneration)
用于存放靜態(tài)文件,如Java類(lèi)、方法等。持久代對(duì)垃圾回收沒(méi)有顯著影響。
-
JVM調(diào)優(yōu)參數(shù)
這里只給出一些常見(jiàn)的性能調(diào)優(yōu)的參數(shù)及其代表的含義。
-Xms8g
: 設(shè)置JVM中堆初始堆大小為8g。此值可以設(shè)置與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配內(nèi)存。
-Xmx8g
: 設(shè)置JVM中堆最大可用內(nèi)存為8g。
-Xmn4g
: 設(shè)置年輕代大小為4G。
-XX:NewRatio=2 設(shè)置年輕代(包括Eden和兩個(gè)Survivor區(qū))與年老代的比值。設(shè)置為2,則年輕 代與年老代所占比值為1:2,年輕代占整個(gè)堆棧的1/3。
-XX:SurvivorRatio=8 ,所以默認(rèn)值 Eden:S0:S1=8:1:1。
-Xss1m:設(shè)置每個(gè)線程的棧大小
-XX:MaxMetaspaceSize=128m
: 設(shè)置元空間最大為為128m ,
-XX:MetaspaceSize=128m
用于設(shè)置元空間的初始大小, 默認(rèn)值約21M
-XX:MaxTenuringThreshold=15:設(shè)置垃圾最大年齡。如果設(shè)置為0的話,則年輕代對(duì)象不經(jīng)過(guò)Survivor區(qū),直接進(jìn)入年老代。 對(duì)于年老代比較多的應(yīng)用,可以提高效率。最大不超過(guò)15。