亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

深入理解jvm — GC篇

2019-11-06 08:04:03
字體:
來源:轉載
供稿:網友

java自動管理內存主要解決的兩個問題: 1、給對象分配內存,上篇博客已經介紹過了http://blog.csdn.net/ying1414058425/article/details/60141543 2、回收分配給對象的內存,下面我將一步一步的進行分析

一、概述

垃圾收集GC(Garbage Colletion)主要回收的區域是java堆和方法區 因為程序計數器、虛擬機棧、本地方法棧三個區域的生命周期是和線程一樣的 他們的內存分配和具有確定性,在類結構確定下來就已知的,所以不需要過多的考慮回收問題,因為方法結束或者線程結束,內存自然就回收了 java堆和方法區,只有在運行期間才知道會創建哪些對象,內存分配和回收都是動態的

二、對象已死嗎?

在堆里放著Java幾乎所有的對象實例,垃圾回收器在對堆進行回收前,第一件事情就是確定對象中有哪些還存活,哪些已經死去(即不可能再被任何途徑使用的對象)

判斷對象是否存活的算法: 1、引用計數算法 給對象添加一個引用計數器,每當有一個地方引用它時計數器值就加一,當引用失效時計數器值就減一,任何時刻計數器為0時的對象就是不可能再被使用的 計數算法的問題: 主流的java虛擬機沒有選用引用計數算法來管理內存,主要是因為他很難解決對象之間相互循環引用的問題 例如對象A和對象B 互相引用著對方 ,及時當對象都賦值為null ,因為他們的引用計數都不為0,所以引用計數器無法通知GC收集器來回收他們

2、可達性分析算法 主流的商用語言(java、c#)的主流實現中都是通過可達性分析(Reachability Analysis)來判斷對象是否存活 算法思路: 通過一系列的成為“GC Roots”的對象作為起始起點,從這些節點開始向下搜索,搜索所走過的路徑成為引用鏈,當一個對象到GC Roots沒有任何引用鏈相連時,則證明此對象是不可用的

在java語言中,可作為GC Roots的對象: 虛擬機棧中(幀棧中本地變量表)中引用的對象 方法區中類靜態屬性應用的對象 方法區中常量引用的對象 本地方法棧中JNI(Native方法)中引用的對象

再說一下引用 強引用: 類似 Object obj = new Object() 只要強引用在 Object就不會被回收 軟引用:用SoftReference關鍵字,內存溢出之前,會進行回收 弱引用:比軟引用更弱一點,用WeekReference關鍵字,垃圾回收器工作時,無論內存是否足夠,都會回收 虛引用:最弱的引用,用PhantomReference關鍵字,不會對被引用的對象產生任何影響,無法通過虛引用獲取到對象實例,唯一作用是能在對象被回收是收到一個系統通知

堆中對象的回收 一個對象被回收,要標記兩次 第一次,沒有與GC Roots相連的引用鏈,那么他會進行第二次篩選,看他是否有必要執行finalize()方法 如果此對象沒有覆蓋finalize()方法 ,或者finalize()方法被虛擬機調用過了,就不必執行 如果有必要執行,那么這個對象會放在F-Queue隊列中 第二次,GC對F-Queue中的對象進行標記,如果在finalize()方法中,對象有被引用就會被回收 如果對象與引用鏈上的對象建立關聯,他就會被移除即將回收的集合 建議:不用使用finalize()方法,對象沒有在GC Roots的引用鏈中,就會被回收,不要用finalize進行自救

方法區的回收 方法區GC主要收集兩部分內容:廢棄常量和無用的類 廢棄常量:例如一個常量沒有任何引用,他就會被清除里常量池 無用的類:例如一個類的實例全部被回收,加載該類的ClassLoader被回收,該類對用的java.lang.Class對象沒有在任何地方被引用

三、垃圾收集算法

1、標記 - 清除算法 先將要回收的內存標記出來然后再清除 不足:效率不高,清除后會產生大量不連續的內存碎片

2、 復制算法 將內存按容量劃分為大小相等的兩塊,每次使用一塊,當一塊內存用完了,就將還存活的對象復制到另一塊上,然后將已使用過的內存清理掉 優點:不會產生內存碎片,實現簡單,運行高效 不足:將內存縮小為原來一半,代價太高,并且如果對象的存活率較高時就會進行較多次的復制,效率會變低 現在的商業虛擬機較多使用這種方法,但是內存沒平分,因為絕大部分對象都是會被回收的,所以比例可以為8:1,8為每次存滿了,清空,然后再復用,1為存活的對象暫時儲存的地方,如果存活的對象多余1的空間,可以依賴其他內存進行分配擔保

3、標記-整理算法 比標記 - 清除算法多了一步整理,就是先標記清除,然后存活的對象整理到一起,避免了內存碎片的問題

4、分代收集算法 根據對象存活周期的不同,將內存劃分為幾塊,一般把java堆分為新生代和老生代 在新生代,對象存活率低,采用復制算法 在老生代,對象存活率高,使用標記清理或標記整理算法

四、HotSpot虛擬機的GC算法實現

1、枚舉根節點 GC Roots節主要是:全局引用(例如常量或類靜態屬性)與執行上下文(例如棧幀中的本地變量表) 枚舉根節點,不允許對象引用關系發生變化,不然準確性無法保證,這導致GC進行時必須停頓所有java線程 很多應用的方法區中引用太多,要逐個檢查的話,會消耗很多時間 在HotSpot中會通過OopMap記錄下來數據類型,JIT也會記錄下來哪些是引用,使得GC在在掃描時就可以知道這些信息

2、安全點 只有在安全點,才能停頓下來GC 安全點的選定標準是,程序長時間的執行,例如方法調用、循環、異常等 GC時,怎么樣讓所有的線程都跑到安全點再停頓下來,有兩種方法 第一種 搶先式中斷: GC時,中斷所有線程,如果有線程不在安全點上,就恢復線程,讓他執行到安全點上,再中斷他(幾乎不用這種方法) 第二種 主動式中斷: 設置輪詢標志,標志點為安全點和創建對象分配內存的地方,各個線程會主動輪詢這個標志,發現標志為真時就中斷掛起

3、安全區域 安全點SafePoint不足:當程序處于Sleep或Bloked狀態,就不會分配cup,就無法響應JVM的中斷請求 安全區域Safe Region:一段代碼之中,引用關系不會發生變化,在此區域的任何地方GC都是安全的 GC時不用管進入安全區域的線程,線程會在離開安全區域前檢查自己是否要GC或者根節點枚舉,如果沒完成,必要要等待安全離開的命令后才可以離開

4、垃圾收集器 下面簡單介紹幾個收集器

Serial收集器 Serial收集器是單線程的,GC時必須暫停其他的所有工作線程,對于“Stop The World”的不良體驗,VM的設計者說“你媽媽給你打掃房間時,肯定會讓你老老實實的帶著,如果她一邊打掃,你一邊扔紙屑,這房間還能打掃完?”

ParNew收集器 是Serial收集器的多線程版本

Parallel Scavenge 收集器 他是一個新生代收、使用了復制算法、并行多線程的收集器 他的設計目標是,達到一個可控的吞吐量 (吞吐量 = 運行代碼的時間 / (運行代碼的時間 +垃圾回收的時間)) 他提供了兩個參數用于精確控制吞吐量:控制最大垃圾停頓時間 、直接設置吞吐量大小

Serial Old 收集器 他是Serial收集器的老年代版本,使用標記整理算法

Parallel Ord 收集器 他是Parallel Scavenge 收集器的老年代版本,使用多線程和標記整理算法

CMS收集器 他的設計目標是,GC時間最短 CMS是基于標記清除算法,但是更復雜一點,他分為4步

初始標記:標記GC Roots 直接關聯的對象,速度很快,需要Stop The World 并發標記:進行GC Roots 重新標記:修改并發標記期間因程序繼續運行而導致標記產生變動的那一部分對象,需要Stop The World 并發清除

優點:響應速度快,用戶體驗好,因為耗時最長的并發標記和并發清除過程中,收集器的線程可以和用戶線程一起工作,所以他的GC停頓時間還是很短的 不足:并發階段,GC會占用一部分CPU資源,導致引用程序變慢,總吞吐量降低 CMS無法處理浮動垃圾可能導致另一次Full GC,浮動垃圾為出現在標記過程之后的垃圾 CMS采用標記清除算法,會產生過多的碎片??梢酝ㄟ^設置參數,在FullGC時之前進行碎片整理,或者幾次FullGC后進行一次整理

G1 收集器 面向服務端應用的垃圾收集器,他的使命是替換掉HotSopt JDK1.5中的CMS 特點: 并發與并行:充分利用多CPU、多核環境的硬件優勢縮短GC停頓時間 分代收集:分為新生代和老生代 空間整合:整體基于標記整理算法,局部使用復制算法 可預測停頓:可明確指定在長度為M的時間片段里,停頓的時間不超過N毫秒

G1回收步驟 初始標記、并發標記、最終標記、篩選回收

四、理解GC日志

例如:

33.125 : [ GC DefNew : 3324K->152k( 3712K ) , 0.0025925 secs] 3324K-> 125K(11904K),0.00316 secs

33.125: GC發生時間,值為JVM啟動的秒數 GC : GC停頓的類型, 可以為GC或Full GC DefNew:GC發成的區域, 名稱由收集器決定 3324K->152k( 3712K ): (使用內存)->GC后使用內存(總內存) 0.0025925 secs :GC時間 3324K-> 125K(11904K):(Java堆使用容量)->GC后Java堆使用容量(Java堆總容量) 0.00316 secs : GC時間

五、關于新生代和老生代

1、對象優先在Eden分配 大多數情況下,對象在新生代Eden區中分配,當Eden區中沒有足夠的空間時,JVM就會發起一次Minor GC 新生代GC(Minor GC) :發生在新生代的GC,因為Java對象大多都是朝生夕滅,所以Minor GC非常頻繁,一半回收速度也較快 老生代GC(Major GC / Full GC) : 發生在老生代的GC,出現了Major GC,經常會伴隨至少一次的Minor GC,Major GC比Minor GC速度慢10倍以上

2、大對象直接進入老年代 大對象:需要大量連續內存空間的對象 JVM提供了一個參數,使大于這個設置的對象直接在老年代分配,避免使用復制算法時,產生大量的內存復制

3、長期存活的對象將進入老年代 JVM采用了分代收集的思想來管理內存,他會給每個對象定義一個對象年齡計數器


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩在线视频免费观看| 懂色av中文一区二区三区天美| 最近的2019中文字幕免费一页| 精品亚洲男同gayvideo网站| 国产91色在线| 亚洲无限乱码一二三四麻| 欧美大片网站在线观看| 国产精品678| 中文字幕欧美亚洲| 久久久亚洲国产天美传媒修理工| 亚洲国产精品久久精品怡红院| 国产成人精品久久| 欧美精品久久久久久久久久| 国产精品视频自在线| 欧美国产日韩一区二区在线观看| 国产亚洲欧美日韩美女| 国产精品福利无圣光在线一区| 亚洲精品资源美女情侣酒店| 91在线精品视频| 精品高清美女精品国产区| 国产91精品黑色丝袜高跟鞋| 欧美激情一区二区三区久久久| 日韩电影中文字幕| 亚洲精品网址在线观看| 亚洲综合中文字幕在线| 浅井舞香一区二区| 国产精品美女免费看| 日韩精品免费观看| 欧美日韩视频在线| 精品国产欧美成人夜夜嗨| 97视频在线观看免费高清完整版在线观看| 一区二区国产精品视频| xxxxx91麻豆| 日韩免费高清在线观看| 91av在线播放| 亚洲理论电影网| 91国内在线视频| 国产精品com| 亚洲欧洲日本专区| 国产一区二区美女视频| 一二美女精品欧洲| 日韩在线观看网址| 久久五月情影视| 成人综合国产精品| 国产精品久久电影观看| 日韩欧美黄色动漫| 日韩在线欧美在线国产在线| 日韩av手机在线观看| 国产在线视频2019最新视频| 亚洲最大福利视频网| 欧美一级片在线播放| 国模精品系列视频| 欧美激情网站在线观看| 国内精品久久久久久久| 精品久久久中文| 久久天天躁狠狠躁夜夜av| 青青久久aⅴ北条麻妃| 亚洲新声在线观看| 主播福利视频一区| 日韩久久精品电影| 欧美日韩免费在线| 97在线免费视频| 日韩精品高清在线观看| 精品偷拍一区二区三区在线看| 性色av一区二区三区免费| 欧美精品在线播放| 亚洲qvod图片区电影| 78色国产精品| 日韩欧美在线网址| 久久艳片www.17c.com| 日韩有码在线播放| 一区二区三区视频免费| 国产精品久久久av久久久| 日韩中文av在线| 国产原创欧美精品| 欧美国产欧美亚洲国产日韩mv天天看完整| 91免费人成网站在线观看18| 91牛牛免费视频| 91精品视频一区| 中文字幕最新精品| 国产精品日日摸夜夜添夜夜av| 亚洲第一福利视频| 日韩最新中文字幕电影免费看| 亚洲欧美精品伊人久久| 91免费高清视频| 91精品免费久久久久久久久| 91欧美日韩一区| 亚洲一区二区三区视频| 久久免费精品日本久久中文字幕| 亚洲精品自拍第一页| 在线观看国产欧美| 亚洲美女av在线| 欧美黑人一区二区三区| 亚洲视频视频在线| 精品亚洲精品福利线在观看| 欧美日韩第一页| 国内精品久久久久久中文字幕| 国产精品嫩草视频| 亚洲第一福利视频| 久久精品国产一区| 九九久久久久99精品| 日韩成人在线播放| 欧美日韩第一页| 日韩在线一区二区三区免费视频| 疯狂做受xxxx欧美肥白少妇| 欧美中文在线字幕| 欧美日韩国产一中文字不卡| 日韩欧美国产成人| 国产一区二区三区在线观看网站| 欧美日韩在线另类| 伊人久久五月天| 亚洲自拍偷拍在线| 欧美尤物巨大精品爽| 欧亚精品在线观看| 亚洲精品成人久久久| 日韩高清免费观看| 国产一区二区三区高清在线观看| 国产成人av网| 国产美女精品视频| 久久亚洲精品小早川怜子66| 26uuu日韩精品一区二区| 色偷偷91综合久久噜噜| 国产亚洲欧美日韩精品| 欧美激情一区二区三区在线视频观看| 欧美xxxx18性欧美| 亚洲性av网站| 国产精品一区二区久久国产| 欧美风情在线观看| 国产精品日韩在线观看| 大伊人狠狠躁夜夜躁av一区| 庆余年2免费日韩剧观看大牛| 中文字幕亚洲无线码a| 91在线中文字幕| 中文字幕日韩欧美精品在线观看| 国产主播喷水一区二区| 国产亚洲综合久久| 91情侣偷在线精品国产| 亚洲一区二区久久久久久| 国产视频福利一区| 97香蕉久久超级碰碰高清版| 欧美日韩999| 精品久久久久久久久中文字幕| 精品久久久久久久久久久| 国产精品亚洲网站| 国产精品视频区| 国产mv免费观看入口亚洲| 久久亚洲精品一区二区| 2020久久国产精品| 亚洲综合第一页| 久久精品视频一| 国产九九精品视频| 亚洲va欧美va国产综合剧情| 欧美日韩国产999| 日韩av三级在线观看| 国产精品久久久久久久久久久久| 亚洲欧洲黄色网| 欧洲一区二区视频| 中文国产成人精品| 久久久人成影片一区二区三区观看| 日韩欧美在线观看| 亚洲成人网av| 亚洲电影在线观看| 久久综合伊人77777蜜臀| 日韩av最新在线|