JVM之內(nèi)存管理和垃圾回收_第1頁
JVM之內(nèi)存管理和垃圾回收_第2頁
JVM之內(nèi)存管理和垃圾回收_第3頁
JVM之內(nèi)存管理和垃圾回收_第4頁
JVM之內(nèi)存管理和垃圾回收_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、1 2015 2015年年2 2月月2 2日日 JVM- 內(nèi)存管理和垃圾回收內(nèi)存管理和垃圾回收 李 蘇 2目錄目錄 內(nèi)存管理 一個例子引發(fā)的思考 例子的本質(zhì) Jvm內(nèi)存劃分 內(nèi)存分代 垃圾回收 為什么要垃圾回收 垃圾搜索算法 垃圾收集算法 垃圾收集器3 Jvm調(diào)優(yōu) 常見jvm參數(shù) Jvm參數(shù)使用 案例 新生代內(nèi)存溢出 老年代內(nèi)存溢出 永久代內(nèi)存溢出 對象被循環(huán)調(diào)用造成的內(nèi)存溢出4內(nèi)存管理內(nèi)存管理: :一個例子引發(fā)的思考一個例子引發(fā)的思考下面是java的String中經(jīng)常出現(xiàn)的兩種寫法,分別創(chuàng)建了幾個對象,哪種寫法性能好,為什么?String a = new String(“abc”); Str

2、ing b = “abc”;5內(nèi)存管理內(nèi)存管理: :一個例子引發(fā)的思考一個例子引發(fā)的思考 String a = new String(“abc”); 創(chuàng)建 2 個對象 String b = “abc”; 創(chuàng)建 1 個對象 原因:java的String類型的底層擁有一個常量池,創(chuàng)建的所有的String對象對應(yīng)的內(nèi)容,都會存一份到常量池中。 String a = new String(“abc”); 先創(chuàng)建一個對象,地址指向”abc”,然后查詢常量池中有沒有”abc”,如果沒有則放進去。如果已經(jīng)有了,則直接返回。所以存在兩個對象,自己創(chuàng)建的一個對象,和常量池中另外存放的一個對象。 String b

3、 = “abc”;先從常量池中查詢是否存在值為“abc”的引用,如果存在則直接返回該引用。如果不存在,則把”abc”放到常量池,然后返回“abc”的引用。所以只存在一個對象。6內(nèi)存管理內(nèi)存管理: :例子的本質(zhì)例子的本質(zhì)String a = new String(“abc”);內(nèi)存 stackheap Method areaaabcabc7內(nèi)存管理內(nèi)存管理: :例子的本質(zhì)例子的本質(zhì)String b = “abc”;內(nèi)存 stackheap Method areaaabc8內(nèi)存管理內(nèi)存管理:Jvm:Jvm內(nèi)存劃分內(nèi)存劃分9內(nèi)存管理內(nèi)存管理:Jvm:Jvm內(nèi)存劃分內(nèi)存劃分1.方法區(qū):方法區(qū): 也稱永

4、久代” 、“非堆”,它用于存儲虛擬機加載的類信息、常量、靜態(tài)變量、是各個線程共享的內(nèi)存區(qū)域。默認(rèn)最小值為16MB,最大值為64MB,可以通過-XX:PermSize 和 -XX:MaxPermSize 參數(shù)限制方法區(qū)的大小。運行時常量池:是方法區(qū)的一部分,Class文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項信息是常量池,用于存放編譯器生成的各種符號引用,這部分內(nèi)容將在類加載后放到方法區(qū)的運行時常量池中。2.虛擬機棧虛擬機棧 描述的是java 方法執(zhí)行的內(nèi)存模型:每個方法被執(zhí)行的時候 都會創(chuàng)建一個“棧幀”用于存儲局部變量表(包括參數(shù))、操作棧、方法出口等信息。每個方法被調(diào)用到執(zhí)

5、行完的過程,就對應(yīng)著一個棧幀在虛擬機棧中從入棧到出棧的過程。聲明周期與線程相同,是線程私有的。 10內(nèi)存管理內(nèi)存管理:Jvm:Jvm內(nèi)存劃分內(nèi)存劃分局部變量表所需的內(nèi)存空間在編譯期間完成分配,當(dāng)進入一個方法時,這個方法需要在棧幀中分配多大的局部變量是完全確定的,在運行期間棧幀不會改變局部 變量表的大小空間。3.本地方法棧本地方法棧 與虛擬機?;绢愃?,區(qū)別在于虛擬機棧為虛擬機執(zhí)行的java方法服務(wù),而本地方法棧則是為Native方法服務(wù)。4.堆堆 也叫做java 堆、GC堆是java虛擬機所管理的內(nèi)存中最大的一塊內(nèi)存區(qū)域,也是被各個線程共享的內(nèi)存區(qū)域,在JVM啟動時創(chuàng)建。該內(nèi)存區(qū)域存放了對象實

6、例及數(shù)組(所有new的對象)。其大小通過-Xms(最小值)和-Xmx(最大值)參數(shù)設(shè)置,-Xms為JVM啟動時申請的最小內(nèi)存,默認(rèn)為操作系統(tǒng)物理內(nèi)存的1/64但小于1G,-Xmx為JVM可申請的最大內(nèi)存,默認(rèn)為物理內(nèi)存的1/4但小于1G,默認(rèn)當(dāng)空余堆內(nèi)存小于40%時,JVM會增大Heap到-Xmx指定的大小,可通過-XX:MinHeapFreeRation=來指定這個比列;當(dāng)空余堆內(nèi)存大于70%時,JVM會減小heap的大小到-Xms指定的大小,可通過XX:MaxHeapFreeRation=來指定這個比列。注意:對于運行系統(tǒng),為避免在運行時頻繁調(diào)整Heap的大小,通常-Xms與-Xmx的值設(shè)

7、成一樣。11內(nèi)存管理內(nèi)存管理:Jvm:Jvm內(nèi)存劃分內(nèi)存劃分5.程序計數(shù)器程序計數(shù)器 它的作用是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器,在虛擬機的模型里,字節(jié)碼解釋器工作時就是通過改變這個計數(shù)器的值來選取下一條需要執(zhí)行的字節(jié)碼指令,分支、循環(huán)、異常處理、線程恢復(fù)等基礎(chǔ)功能都需要依賴計數(shù)器完成。12內(nèi)存管理內(nèi)存管理: :內(nèi)存分代內(nèi)存分代 不同的虛擬機內(nèi)存分代不同,只有HotSpot將內(nèi)存分為:新生代、老年代和永久代。新生代 用于保存大量的朝生熄滅的對象,這些對象的存活周期一般比較短。老年代存放的是 經(jīng)過一定次數(shù)(這個參數(shù)可以設(shè)定)monitor GC 任然存活的對象,或者是大對象。永久代一般存放的是

8、類的信息、靜態(tài)變量、常量等。 新生代分為:一個Eden區(qū)和兩個Survivor區(qū),對象優(yōu)先存放在Eden區(qū)。13內(nèi)存管理內(nèi)存管理: :內(nèi)存分代內(nèi)存分代 JDK1.6,以下涉及的 JVM 默認(rèn)值均以該版本為準(zhǔn)。 默認(rèn)的,新生代 ( Young ) 與老年代 ( Old ) 的比例的值為 1:2 ( 該值可以通過參數(shù) XX:NewRatio 來指定 ),即:新生代 ( Young ) = 1/3 的堆空間大小。老年代 ( Old ) = 2/3 的堆空間大小。其中,新生代 ( Young ) 被細(xì)分為 Eden 和 兩個 Survivor 區(qū)域,這兩個 Survivor 區(qū)域分別被命名為 from

9、 和 to,以示區(qū)分。默認(rèn)的,Edem : from : to = 8 :1 : 1 ( 可以通過參數(shù)XX:SurvivorRatio 來設(shè)定 ),即: Eden = 8/10 的新生代空間大小,from = to = 1/10 的新生代空間大小。 JVM 每次只會使用 Eden 和其中的一塊 Survivor 區(qū)域來為對象服務(wù),所以無論什么時候,總是有一塊Survivor區(qū)域是空閑著的。 因此,新生代實際可用的內(nèi)存空間為 9/10 ( 即90% )的新生代空間。GC 分為兩種:分為兩種: Monitor GC、FullGCMonitor GC 是發(fā)生在新生代中的垃圾收集動作,所采用的是復(fù)復(fù)制

10、算法制算法。 Full GC 是發(fā)生在老年代的垃圾收集動作,所采用的是標(biāo)記標(biāo)記-清除算法清除算法。14垃圾收集垃圾收集: :為什么要垃圾回收為什么要垃圾回收比如很簡單的一個查詢操作,返回一個包含user對象的集合。如果多個人在不同的時間段執(zhí)行查詢操作,將會產(chǎn)生很多個user集合。每個集合時占用內(nèi)存的,如果不收回長時間沒用的集合,將會導(dǎo)致占用的內(nèi)存越來越大,最終導(dǎo)致內(nèi)存耗盡。后臺程序直接拋出堆內(nèi)存泄露。順便說一下內(nèi)存溢出和內(nèi)存泄露的區(qū)服內(nèi)存溢出:比如給一個 short類型的變量,分配int類型的數(shù)值,就會報內(nèi)存溢出。換句話說,是給一個固定大小的變量分配的數(shù)值大小,超過了變量原本能夠存儲的大小。內(nèi)

11、存泄露:因為內(nèi)存沒有及時回收,導(dǎo)致內(nèi)存耗盡。15垃圾收集垃圾收集: :垃圾搜索算法垃圾搜索算法引用計數(shù)算法 給對象中添加一個引用計數(shù)器,每當(dāng)有一個地方引用它時,計數(shù)器就加1;當(dāng)引用失效時,計數(shù)器值就減1;任何時刻計數(shù)器都為0的對象就是不可能再被使用的。根搜索算法: 這個算法的基本思路是通過一系列的名為“GC Roots”的對象作為起點,從這些節(jié)點開始向下搜索,搜索所走過的路徑稱為引用鏈,當(dāng)一個對象到GC Roots沒有任何引用鏈相連時,則說明此對象是不可用的。 GC Rootsobj1obj2obj3obj4obj5obj6obj716垃圾收集垃圾收集: :垃圾收集算法垃圾收集算法標(biāo)記-清除算

12、法 首先標(biāo)記出所有需要回收的對象,在標(biāo)記完成后統(tǒng)一回收掉所有被標(biāo)記的對象。主要缺點:1.效率問題,標(biāo)記和清除過程的效率都不高。2.空間問題,標(biāo)記清除之后會產(chǎn)生大量不連續(xù)的內(nèi)存碎片,空間碎片太多,會導(dǎo)致程序在運行過程中需要分配較大對象時無法找到足夠的連續(xù)內(nèi)存,而不得不提前觸發(fā)另外一次Full GC動作。復(fù)制算法: 為了解決上述的效率問題,出現(xiàn)了復(fù)制算法。它將可用內(nèi)存按容量劃分為大小相等的兩塊,每次只使用其中的一塊。當(dāng)這一塊的內(nèi)存使用完了,就將還存活著的對象復(fù)制到另外一塊上面,然后在把已使用過的內(nèi)存空間一次清理掉。這樣就不用考慮內(nèi)存碎片問題了。只是這種算法的代價是將內(nèi)存縮小為原來的一半?,F(xiàn)在的Ho

13、tSpot虛擬機新生成的內(nèi)存分為:1個Eden 和 兩個 Survivor ,其中Eden和Survivor的大小比例是8:1,也就是每次新生代中可用內(nèi)存空間為整個新生代容量的90%,只有10%的內(nèi)存會被浪費。 17垃圾收集垃圾收集: :垃圾收集算法垃圾收集算法標(biāo)記-整理算法 標(biāo)記過程與“標(biāo)記-清除”算法一樣,但后續(xù)步驟不是直接對可回收對象進行清理,而是讓所有存活的對象都向一端移動,然后直接清理掉端邊界以外的內(nèi)存。分代收集算法: 當(dāng)前商業(yè)虛擬機的垃圾收集都采用“分代收集”算法。一般是把java堆分為新生代和老年代,在新生代中,每次垃圾收集時都發(fā)現(xiàn)有大批對象死去,只有少量存活,那就選用復(fù)制算法,

14、只需要付出少量存活對象的復(fù)制成本就可以完成收集。而老年代中因為對象存活率高,就必須使用“標(biāo)記-清理”或 “標(biāo)記-整理”算法來回收。 18垃圾收集垃圾收集: :垃圾收集器垃圾收集器Serial收集器: Serial收集器是最基本、歷史最悠久的收集器。這個收集器是一個單線程收集器,它在進行垃圾收集時,必須暫停所有其他的工作線程,直到它收集結(jié)束。它是運行在Client模式下的默認(rèn)新生代收集器。優(yōu)點:簡單而高效。ParNew收集器: ParNew收集器其實就是Serial收集器的多線程版本。它是Sever模式下的首選新生代收集器,目前只有它能與CMS收集器配合工作。Parallel Scavenge

15、收集器: Parallel Scavenge 收集器也是一個新生代收集器,它也是使用復(fù)制算法的收集器,又是并行的多線程收集器。 Parallel Scavenge 收集器的目標(biāo)是達到一個可控制的吞吐量。所謂吞吐量就是CPU用于運行用戶代碼的時間與CPU總消耗時間的比值。吞吐量越高,則越能有效的利用CPU時間。Serial Old收集器: Serial Old 是 Serial收集器的老年代版本,同樣是一個單線程收集器,使用“標(biāo)記-整理”算法。Parallel Old收集器: Parallel Old 是 Parallel Scavenge收集器的老年代版本,使用多線程和“標(biāo)記-整理”算法。 1

16、9垃圾收集垃圾收集: :垃圾收集器垃圾收集器CMS收集器: CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時間為目標(biāo)的收集器。集中應(yīng)用于互聯(lián)網(wǎng)網(wǎng)站或B/S系統(tǒng)的服務(wù)端上,這類應(yīng)用尤其重視服務(wù)的響應(yīng)速度,希望系統(tǒng)停頓時間最短,以給用戶帶來較好的體驗。該收集器是基于“標(biāo)記-清除”算法實現(xiàn)的。由于是采用“標(biāo)記-清除”算法,前面已經(jīng)介紹過,會產(chǎn)生大量的空間碎片。為了解決這個問題,CMS收集器提供了一個 XX:+UseCMSCompactAtFullCollection開關(guān)參數(shù),用于在“享受”完 Full GC服務(wù)之后額外免費附送一個碎片整理過程。G1收集器: G1(

17、Garbage First)收集器是當(dāng)前收集器技術(shù)發(fā)展的最前沿成果?;凇皹?biāo)記-整理”算法實現(xiàn)收集器,不會產(chǎn)生空間碎片。G1收集器可以實現(xiàn)在基本不犧牲吞吐量的前提下完成低停頓的內(nèi)存回收。 20JVMJVM調(diào)優(yōu)調(diào)優(yōu): :常見常見jvmjvm參數(shù)參數(shù)java -Xmx3550m -Xms3550m -Xmn2g -Xss128k-Xmx3550m:設(shè)置JVM最大可用內(nèi)存為3550M。-Xms3550m:設(shè)置JVM促使內(nèi)存為3550m。此值可以設(shè)置與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配內(nèi)存。-Xmn2g:設(shè)置年輕代大小為2G。整個整個JVM內(nèi)存大小內(nèi)存大小=年輕代大年輕代大小小 +

18、年老代大小年老代大小 + 持久代大小持久代大小。持久代一般固定大小為64m,所以增大年輕代后,將會減小年老代大小。此值對系統(tǒng)性能影響較大,Sun官方推薦配置為整個堆的3/8。-Xss128k:設(shè)置每個線程的堆棧大小。JDK5.0以后每個線程堆棧大小為1M,以前每個線程堆棧大小為256K。更具應(yīng)用的線程所需內(nèi)存大小進行調(diào)整。在相同物理內(nèi)存下,減小這個值能生成更多的線程。但是操作系統(tǒng)對一個進程內(nèi)的線程數(shù)還是有限制的,不能無限生成,經(jīng)驗值在30005000左右。21JVMJVM調(diào)優(yōu)調(diào)優(yōu): :常見常見jvmjvm參數(shù)參數(shù)java -Xmx3550m -Xms3550m -Xss128k -XX:New

19、Ratio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0-XX:NewRatio=4:設(shè)置年輕代(包括Eden和兩個Survivor區(qū))與年老代的比值(除去持久代)。設(shè)置為4,則年輕代與年老代所占比值為1:4,年輕代占整個堆棧的1/5-XX:SurvivorRatio=4:設(shè)置年輕代中Eden區(qū)與Survivor區(qū)的大小比值。設(shè)置為4,則兩個Survivor區(qū)與一個Eden區(qū)的比值為2:4,一個Survivor區(qū)占整個年輕代的1/6-XX:MaxPermSize=16m:設(shè)置持久代大小為16m。-XX:

20、MaxTenuringThreshold=0:設(shè)置垃圾最大年齡。如果設(shè)置如果設(shè)置為為0的話,則年輕代對象不經(jīng)過的話,則年輕代對象不經(jīng)過Survivor區(qū),直接進入年老代區(qū),直接進入年老代。對于年老代比較多的應(yīng)用,可以提高效率。如果將此值設(shè)置為一如果將此值設(shè)置為一個較大值,則年輕代對象會在個較大值,則年輕代對象會在Survivor區(qū)進行多次復(fù)制,這樣可區(qū)進行多次復(fù)制,這樣可以增加對象再年輕代的存活時間以增加對象再年輕代的存活時間,增加在年輕代即被回收的概論。22JVMJVM調(diào)優(yōu)調(diào)優(yōu): :常見常見jvmjvm參數(shù)參數(shù)收集器設(shè)置-XX:+UseSerialGC:設(shè)置串行收集器-XX:+UseParallelGC:設(shè)置并行收集器-XX:+UseParalledlOldGC:設(shè)置并行年老代收集器-XX:+UseConcMarkSweepGC:設(shè)置并發(fā)收集器垃圾回收統(tǒng)計信息-XX:+PrintGC-XX:+Print

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論