版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
JavaJVM相關(guān)基礎(chǔ)知識jmm內(nèi)存a模型)Java的并發(fā)采用共享內(nèi)存模型,線程之間通過讀寫內(nèi)存的公共狀態(tài)進行通訊。多個線程之間是不能通過直接傳遞數(shù)據(jù)交互的,它們之間交互只能通過共享變量實現(xiàn);)主要目的是定義程序中各個變量的訪問規(guī)則;)Java內(nèi)存模型規(guī)定所有變量都存儲在主內(nèi)存中,每個線程還有自己的工作內(nèi)存:-線程的工作內(nèi)存中保存了被該線程使用到的變量的拷貝(從主內(nèi)存中拷貝過來),線程對變量的所有操作都必須在工作內(nèi)存中執(zhí)行,而不能直接訪問主內(nèi)存中的變量;不同線程之間無法直接訪問對方工作內(nèi)存的變量,線程間變量值的傳遞都要通過主內(nèi)存來完成?主內(nèi)存主要對應(yīng)Java堆中實例數(shù)據(jù)部分;-工作內(nèi)存對應(yīng)于虛擬機棧中部分區(qū)域I御'之間的通信由內(nèi)存模型JMMJvaI御'之間的通信由內(nèi)存模型JMMJva叫存|I主)控制:-JM決定一個線程對變量的寫入何時對另一個線程可見。*線程之間共享變量存儲在主內(nèi)存中1\;,』每個線程有4個私有的本地內(nèi)存,單面存儲了讀寫共享變量的副本。'?JMM通過控制每個線程的本地內(nèi)存之間的交互,來為程序員提供內(nèi)存可見性保證。)可見5性、有序性:?當一個共享變量在多個本地內(nèi)存中有副本時,如果一個本地內(nèi)存修改了該變量的副本,其他變量應(yīng)該能夠看到修改后的值,此為可見性。?保證線程的有序執(zhí)行,這個為有序性。(保證線程安全)內(nèi)存6間交互操作:(鎖定):作用于主內(nèi)存的變量,把一個變量標識為一條線程獨占狀態(tài)。(解鎖):作用于主內(nèi)存的變量,把一個處于鎖定狀態(tài)的變量釋放出來,釋放后的變量才可以被其他線程鎖定。a(讀?。鹤饔糜谥鲀?nèi)存變量,把主內(nèi)存的一個變量讀取到工作內(nèi)存中。a(載入):作用于工作內(nèi)存,把操作讀取到工作內(nèi)存的變量載入到工作內(nèi)存的變量副本中(使用):作用于工作內(nèi)存的變量,把工作內(nèi)存中的變量值傳遞給一個執(zhí)行引擎。a(賦值):作用于工作內(nèi)存的變量。把執(zhí)行引擎接收到的值賦值給工作內(nèi)存的變量。(存儲):把工作內(nèi)存的變量的值傳遞給主內(nèi)存(寫入):把操作的值入到主內(nèi)存的變量中))注)意7:*不允許a、(操作之一單獨出現(xiàn)?不允許一個線程丟棄a操作?不允許一個線程不經(jīng)過a操作,就把工作內(nèi)存中的值同步到主內(nèi)存中?一個新的變量只能在主內(nèi)存中生成?—個變量同一時刻只允許一條線程對其進行操作。但操作可以被同一條線程執(zhí)行多次,只有執(zhí)行相同次數(shù)的操作,變量才會解鎖-如果對一個變量進行操作,將會清空工作內(nèi)存中此變量的值,在執(zhí)行引擎使用這個變量前,需要重新執(zhí)行或者a操作初始化變量的值。*如果一個變量沒有被鎖定,不允許對其執(zhí)行操作,也不允許一個被其他線程鎖定的變量?對一個變量執(zhí)行操作之前,需要將該變量同步回主內(nèi)存中的av和棧)堆:a可動態(tài)申請的內(nèi)存空間其記錄空閑內(nèi)存空間的鏈表由操作系統(tǒng)維護;其中的內(nèi)存在不需要時可以回收,以分配給新的內(nèi)存請求,其內(nèi)存中的數(shù)據(jù)是無序的;—般由使用者自由分配,a分配的就是堆,需要手動釋放;被所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機啟動時創(chuàng)建,此內(nèi)存區(qū)域的唯一目的就是存放對象實例。
Si:.Heac)艸有塡眉長宇'“董爭區(qū)由赳中耳猝隔商耳哉爭飛龍4地宇軾口4也R沬海虛擬機梯+本地方^槿Si:.Heac)艸有塡眉長宇'“董爭區(qū)由赳中耳猝隔商耳哉爭飛龍4地宇軾口4也R沬海虛擬機梯+本地方^槿VNStack+(laiiveMethodStack方法國NothodArea砒計姍ProgramCounterReglster曲生代?2棧stack:先進后出的數(shù)據(jù)結(jié)構(gòu),通常用于保存方法(函數(shù))中的參數(shù),局部變量.;在java中,所有基本類型和引用類型都在棧中存儲棧中數(shù)據(jù)的生存空間一般在當前scopes內(nèi)(就是由{...}括起來的區(qū)域);先分配的內(nèi)存必定后釋放;—般由系統(tǒng)自動分配,存放函數(shù)的參數(shù)值,局部變量等,自動清除3方法區(qū)本地方法棧1)方法區(qū)MethodArea:和Java堆一樣,別名叫做Non-Heap(非堆),是各個線程共享的內(nèi)存區(qū)域;它用于存儲已被虛擬機加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù)運行時常量池RuntimeConstantPool:方法區(qū)的一部分;Class文件中除了有類的版本、字段、方法、接口等描述等信息外,還有一項信息是常量池ConstantPoolTable),用于存放編譯期生成的各種字面量和符號引用,這部分內(nèi)容將在類加載后存放到方法區(qū)的運行時常量池中2本地方法棧NativeMethodStacks:是為虛擬機使用到的Native方法服務(wù)注意:JVM組成本US方脫區(qū)]C挫鵡本US方脫區(qū)]4.JVM運行時數(shù)據(jù)區(qū)程序計數(shù)器是一川塊內(nèi)存,記錄著當前程序運行到哪了字節(jié)碼解釋器的工作就是通過改變這個計數(shù)器的值來選取下一條需要執(zhí)行的字節(jié)碼指令,分支,循環(huán),跳轉(zhuǎn),異常處理,線程回復(fù)等都需要依賴這個計數(shù)器來完成;如果一個線程執(zhí)行一個主要方法,這個計數(shù)器記錄的是正在執(zhí)行的虛擬機字節(jié)碼指令的地址如果正在執(zhí)行的是一個本地方法,這個計數(shù)器的值則為空;唯個在Java的虛擬機規(guī)范中沒有規(guī)定任何OutOfMemoryErro異常情況的區(qū)域其余參考2和3
堆Heap丸行弓罩運f謝散據(jù)區(qū)JT眾3議口本地方這性Native制牡血口打Scact方注區(qū)MelhodArea堆Heap丸行弓罩運f謝散據(jù)區(qū)JT眾3議口本地方這性Native制牡血口打Scact方注區(qū)MelhodArea機慌VMSuck國序計戢器CounterRegisler衣ti方注莊GCGarbageCollection:能可以自動監(jiān)測對象是否超過作用域從而達到自動回收內(nèi)存的目的5如何判斷回收此對象1)根索算法:每個對象看做根節(jié)點,GCroots,也就是根對象,如果從一個對象沒有到達根對象的路徑,或者說從根對象開始無法引用到該對象,該對象就是不可達的GCRoots對象:Otject?OhjErtSGlfioabGCRoots對象:Otject?OhjErtS虛擬機棧(棧幀中的本地變量表)中引用的對象,每個方法執(zhí)行的時候,jvm都會創(chuàng)建一個相應(yīng)的棧幀(棧幀中包括操作數(shù)棧、局部變量表、運行時常量池的引用);訓邸方法區(qū)中類靜態(tài)屬性引用的對象(使用static關(guān)鍵字),此類不屬于任何實例;%「-耳方法區(qū)常量引用的對象(使用staticfinal關(guān)鍵字);本地方法棧(NativeStack)引用的對象,JNI技術(shù)使用Native方法2)引用計數(shù)法(目前未使用)java在運行時,當有一個地方引用該對象實例,會將這個對象實例加1,引用失效時就減1,jvm在掃描內(nèi)存時,發(fā)現(xiàn)引用計數(shù)值為0的則是垃圾對象,計數(shù)值大于0的則為活躍對象Java內(nèi)存泄漏實際開發(fā)中,可能會存在無用但可達的對象,這些對象不能被GC回收,因此也會導致內(nèi)存泄露的發(fā)生(OutOfMemoryErroi)常見的內(nèi)存泄漏現(xiàn)象:1)長生命周期的對象持有短生命周期的引用,就很可能會出現(xiàn)內(nèi)存泄露publicclassTest{Objectobject;publicvoidtest(){object=newObject();〃…其他代碼}}2)靜態(tài)集合類像HashMap、Vector等的使用最容易出現(xiàn)內(nèi)存泄露,這些靜態(tài)變量的生命周期和應(yīng)用程序一致,所有的對象Object也不能被釋放,因為他們也將一直被Vector等應(yīng)用著
staticVectorv-newVector();for(inti=1;i<1OO;i-n-h)Objecto=newObjectf);vnadd(o);o=null;當集合里面的對象屬性被修改后,再調(diào)用remove()方法時不起作用;(Connection在任何時候都無法自動回收,而Connection—旦各種連接,數(shù)據(jù)庫連接,網(wǎng)絡(luò)連接,IO連接等沒有顯示調(diào)用close關(guān)閉,回收,Resultset和Statement(Connection在任何時候都無法自動回收,而Connection—旦注意:盡量減少使用靜態(tài)變量,類的靜態(tài)變量的生命周期和類同步的;明確內(nèi)存對象的有效作用域;各種連接(數(shù)據(jù)庫連接,網(wǎng)絡(luò)連接,IO連接)操作,務(wù)必顯示調(diào)用close關(guān)閉;對于不需要使用的對象手動設(shè)置null值,不管GC何時會開始清理,我們都應(yīng)及時的將無用的對象標記為可被清理的對象JVM垃圾回收算法Java堆中的對象是分為新生代和老年代標記-清除算法Mark-Sweep:首先標記出所有需要回收的對象,在標記完成之后統(tǒng)一回收所有標記的對象,但標記和清除過程的效率都不高,標記清除之后會產(chǎn)生大量不連續(xù)的內(nèi)存碎片2)Marl3)里,I:jvm掃描所有對象,通過根搜索算法標記被引用的對象,之后會申請新的內(nèi)存空間,將標記的對象復(fù)制到新的內(nèi)存空間存活的對象復(fù)制完雷清空原來的內(nèi)存空間,將新的內(nèi)存最為vm的對象存儲空間,但代價是將內(nèi)存縮小為原來的一半完,jv團收算法就是分代回收2)Marl3)里,I:jvm掃描所有對象,通過根搜索算法標記被引用的對象,之后會申請新的內(nèi)存空間,將標記的對象復(fù)制到新的內(nèi)存空間存活的對象復(fù)制完雷清空原來的內(nèi)存空間,將新的內(nèi)存最為vm的對象存儲空間,但代價是將內(nèi)存縮小為原來的一半完,jv團收算法就是分代回收,I年輕代以復(fù)制算法為主,老年代以標記整理算法為主年輕代對象比較多|每次垃圾回收另一個內(nèi)存區(qū)域,其余勺垃圾對象回收,而且要盡可能快的減少生命周期短的對象,存活的對象較少,因此只要將清除,并且復(fù)制的數(shù)量較少,效率較高;老年代是年輕代篩選出來的對象,需要刪除的對象比較少,顯然采用標記整理效率較高8.JVM垃圾回收器8.JVM垃圾回收器新生代收集器:Serial、ParNew、ParallelScavenge老年代收集器:CMS、SerialOld、ParallelOld整堆收集器:G1并行收集:指多條垃圾收集線程并行工作,但此時用戶線程仍處于等待狀態(tài)。并發(fā)收集:指用戶線程與垃圾收集線程同時工作(不一定是并行的可能會交替執(zhí)行)。用戶程序在繼續(xù)運行,而垃圾收集程序運行在另一個CPU上。吞吐量:即CPU用于運行用戶代碼的時間與CPU總消耗時間的比值(吞吐量=運行用戶代碼時間/(運行用戶代碼時間+垃圾收集時間))。例如:虛擬機共運行100分鐘,垃圾收集器花掉1分鐘,那么吞吐量就是99%1)Serial收集器串行;用于新生代的單線程收集器,采用復(fù)制算法進行垃圾收集;Serial進行垃圾收集時,不僅只用一條線程執(zhí)行垃圾收集工作,它在收集的同時,所有的用戶線程必須暫停StopTheWorld)適用于Client模式下的虛擬機,單CPUSerialjSerial0Id釀詞畫瑋謔CHJJCrtJj陰?!陳CHJJCrtJj陰?!陳ParNew收集器是一個Serial的多線程版本,其它與Serial并無區(qū)別;默認開啟的收集線程數(shù)與CPU的數(shù)量相同,在CPU非常多的環(huán)境中,可以使用-XX:ParallelGCThreads參數(shù)來限制垃圾收集的線程數(shù);存在StopTheWorld;許多運行在Server模式下的虛擬機中首選的新生代收集器,除了Serial收集器外,目前只有它能與CMS收集器配合工作F^rNew^SerialOle組合收籍運if示意MT:P湘劇i觀斷切胡oirtM函使用復(fù)制算法的收集器,又是并行的多線程收集器;使用復(fù)制算法的收集器,又是并行的多線程收集器;與ParNew的不同之處是ParNew的目標是盡可能縮短垃圾收集時用戶線程的停頓時間,ParallelScavenge的目標是達到一個可控制的吞吐量;GC自適應(yīng)調(diào)節(jié):-XX:+UseAdptiveSizePolicy開啟提供兩個參數(shù)用于精確控制吞吐量:XX:MaxGCPauseMillis控制最大的垃圾收集停頓時間XX:GCRatio直接設(shè)置吞吐量的大小計算方法是:1/(1+n)4)SerialOldSerial的老年代版本,同樣是一個單線程收集器,采用標記-整理算法;用途:在JDK1.5以及以前的版本中與ParallelScavenge收集器搭配使用;作為CMS收集器的后備方案ParallelOld
ParallelScavenge的老年代版本,是一個多線程收集器,采用標記-整理算法;JDK1.6有ParallelOld收集器可搭配ParallelScavenge收集器;JDK1.6及之后用來代替老年代的SerialOld收集器Para新生此收規(guī)則耳泳晦諂時齡瀟幗匱毎記遛朗丸晡術(shù)恵戶刪hCPUC|用戶勰6)CMS(ConcurrentMarkSweep)6)CMS(ConcurrentMarkSweep)JDK1.5推出;CMS的內(nèi)存回收是與用戶線程一起“并發(fā)”執(zhí)行的運行過程:1)初始標記:StopTheWorld,初始標記僅僅標記GCRoots能直接關(guān)聯(lián)到的對象,速度很快;2)并發(fā)標記:進行GCRootsTracing的過程,同時開啟GC和用戶線程,用一個閉包結(jié)構(gòu)去記錄可達對象找出存活對象且用戶線程可并發(fā)執(zhí)行;3)重新標記:修正并發(fā)標記期間因為用戶程序繼續(xù)運行而導致標記產(chǎn)生變動的那一部分對象的標記記錄(采用多線程并行執(zhí)行來提升效率);需要"StopTheWorld",且停頓時間比初始標記稍長,但遠比并發(fā)標記短;4)并發(fā)清除:開啟用戶線程,同時GC線程開始對為標記的區(qū)域做清掃,回收所有的垃圾對象細no陽采馬瓏i講顯注酗育用戶罐餉璉行缺點:對CPU資源非常敏感;無法處理浮動垃圾,可能出現(xiàn)ConcurrentModelFailure失敗而導致另一次FullGC的產(chǎn)生;因為采用標記-清除算法所以會存在空間碎片的問題,導致大對象無法分配空間,不得不提前觸發(fā)一次FullGC7)G1(Garbage-First)jdk1.7才正式引用的商用收集器,在JDK1.9已經(jīng)成為默認的收集器;以極高概率滿足GC停頓時間要求的同時,還具備高吞吐量性能特征;特點:1)并行與并發(fā):G1能充分利用CPU、多核環(huán)境下的硬件優(yōu)勢,使用多個CPU(CPU或者CPU核心)來縮短stop-The-World停頓時間。部分其他收集器原本需要停頓Java線程執(zhí)行的GC動作,G1收集器仍然可以通過并發(fā)的方式讓java程序繼續(xù)執(zhí)行;2)分代收集:能獨立管理整個GC堆(新生代和老年代),而不需要與其他收集器搭配;能夠采用不同方式處理不同時期的對象;雖然保留分代概念,但Java堆的內(nèi)存布局有很大差別;將整個堆劃分為多個大小相等的獨立區(qū)域(Region);新生代和老年代不再是物理隔離,它們都是一部分Region(不需要連續(xù))的集合;3)空間整合:從整體看,是基于標記-整理算法;從局部(兩個Region間)看,是基于復(fù)制算法:不會產(chǎn)生內(nèi)存碎片,有利于長時間運行;4)可預(yù)測停頓:G1除了追求低停頓外,還能建立可預(yù)測的停頓時間模型;可以明確指定M毫秒時間片內(nèi),垃圾收集消耗的時間不超過N
毫秒有計劃的避免在整個Java堆中進行全區(qū)域的垃圾收集;G1跟蹤各個Region里面的垃圾堆積的大小,在后臺維護一個優(yōu)先列表,每次根據(jù)允許的收集時間,優(yōu)先回收價值最大的Region;這樣就保證了在有限的時間內(nèi)可以獲取盡可能高的收集效率G1如何避免整堆掃描:G1中每個Region都有一個與之對應(yīng)的RememberedSet,,虛擬機發(fā)現(xiàn)程序在對Reference類型進行寫操作時,會產(chǎn)生一個WriteBarrier暫時中斷寫操作,檢查Reference引用對象是否處于多個Region中(即檢查老年代中是否引用了新生代中的對象),如果是,便通過CardTable把相關(guān)引用信息記錄到被引用對象所屬的Region的RememberedSet中。當進行內(nèi)存回收時,在GC根節(jié)點的枚舉范圍中加入RememberedSet即可保證不對全堆進行掃描也不會有遺漏。運行大致過程:初始標記:僅標記GCRoots能直接到的對象,并且修改TAMS(NextTopatMarkStart)的值,讓下一階段用戶程序并發(fā)運行時,能在正確可用的Region中創(chuàng)建新對象。(需要線程停頓,但耗時很短。并發(fā)標記:從GCRoots開始對堆中對象進行可達性分析,找出存活對象。(耗時較長,但可與用戶程序并發(fā)執(zhí)行)最終標記:為了修正在并發(fā)標記期間因用戶程序執(zhí)行而導致標記產(chǎn)生變化的那一部分標記記錄。且對象的變化記錄在線程RememberedSetLogs里面,把RememberedSetLogs里面的數(shù)據(jù)合并到RememberedSet中。(需要線程停頓,但可并行執(zhí)行。)篩選回收:對各個Region的回收價值和成本進行排序,根據(jù)用戶所期望的GC停頓時間來制定回收計劃。(可并發(fā)執(zhí)行)9堆內(nèi)存劃分不同的對象,生命周期是不一樣的,因此不同生命周期的對象采用不同的收集方式,可以提高垃圾回收的效率串行serial,并行parallel,以及CMS,把堆內(nèi)存劃分為固定大小的三個部分年輕代(younggeneration),年老代(oldgeneration),以及持久代(permanentgeneration)Sur'dvor錚厭Ed=fl1)年輕M弋Y(51ungC飛nse:ienerationPern'anent\JYoung闌毗1訕叩OldG?rwrali{)nPennanBntGenerglian分為三個區(qū),一個Eden區(qū),大部
溫馨提示
- 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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024快遞行業(yè)廣告投放合作協(xié)議
- 2024年股權(quán)承接協(xié)議:股權(quán)轉(zhuǎn)讓合同范本
- 鐵路安全知識培訓課件
- 2025年度高端寵物狗品種繁育與買賣合作協(xié)議3篇
- 反電詐業(yè)務(wù)知識培訓課件
- 英文衛(wèi)浴知識培訓課件
- 《口頭語言的特點》課件
- 2025年度船舶貨物保險責任免除與賠償范圍合同3篇
- 鄭州黃河護理職業(yè)學院《園林植物病理學》2023-2024學年第一學期期末試卷
- 浙江國際海運職業(yè)技術(shù)學院《媒介倫理與影視法規(guī)》2023-2024學年第一學期期末試卷
- 《沙盤技術(shù)》教學大綱
- (主城一診)重慶市2025年高2025屆高三學業(yè)質(zhì)量調(diào)研抽測 (第一次)地理試卷(含答案)
- 通風系統(tǒng)安裝工程施工合同書
- (新版)多旋翼無人機超視距駕駛員執(zhí)照參考試題庫(含答案)
- 哈利波特中英文全集
- ISO 56001-2024《創(chuàng)新管理體系-要求》專業(yè)解讀與應(yīng)用實踐指導材料之12:“6策劃-6.1應(yīng)對風險和機遇的措施”(雷澤佳編制-2025B0)
- 醫(yī)院培訓課件:《護士角色轉(zhuǎn)換與職業(yè)生涯設(shè)計》
- DLT5210.1-電力建設(shè)施工質(zhì)量驗收及評價規(guī)程全套驗評表格之歐陽法創(chuàng)編
- 《IT企業(yè)介紹》課件
- (2024)湖北省公務(wù)員考試《行測》真題及答案解析
- 《抽搐的鑒別與處理》課件
評論
0/150
提交評論