梳理二

1绑改、java四種引用類型

https://longfeizheng.github.io/2018/04/09/Java%E9%9D%A2%E8%AF%95%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93/#java%E4%B8%AD%E7%9A%84%E5%9B%9B%E7%A7%8D%E5%BC%95%E7%94%A8%E5%8F%8A%E5%85%B6%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF%E6%98%AF%E4%BB%80%E4%B9%88

2迹卢、JVM內(nèi)存模型

http://www.reibang.com/p/1579aafac60b
《深入理解JVM虛擬機》中JVM內(nèi)存模型可以分為五個區(qū)域兩種類型肪笋,兩大塊,一個是線程私有靖榕,一個是線程共享數(shù)據(jù)區(qū)。
5個數(shù)據(jù)區(qū)包括:方法區(qū)、堆區(qū)锤岸、虛擬機棧、本地方法棧板乙、程序計數(shù)器是偷。

所有線程共享的數(shù)據(jù)區(qū):

  • 方法區(qū): 存儲已被虛擬機加載的類信息、常量募逞、靜態(tài)變量蛋铆、即時編譯后代碼等數(shù)據(jù)。常量池位于方法區(qū)放接,并使用永久代來實現(xiàn)方法區(qū)
  • 堆區(qū): 我們常說用于存放對象的區(qū)域

線程私有(隔離)數(shù)據(jù)區(qū):

  • 虛擬機棧: 方法執(zhí)行時創(chuàng)建一個棧幀刺啦,用于存儲局部變量、操作數(shù)棧纠脾、動態(tài)鏈接玛瘸、方法出口等信息蜕青。每個方法一個棧幀,互不干擾
  • 本地方法棧: 用于存放執(zhí)行native方法的運行數(shù)據(jù)
  • 程序計數(shù)器: 當前線程所執(zhí)行的字節(jié)碼的指示器糊渊,通過改變計數(shù)器來選取下一條需要執(zhí)行的字節(jié)碼指令

上面基本都能理解市咆,但是需要著重理解下虛擬機棧和本地方法棧,虛擬機棧是java方法的內(nèi)存區(qū)域再来,調(diào)用一個方法就會創(chuàng)建一個棧幀蒙兰,用來存儲局部變量,用于存儲局部變量表芒篷、方法出口等信息搜变,棧是動態(tài)創(chuàng)建和消亡的,方法調(diào)用結(jié)束针炉,則棧幀就消失挠他。而,本地方法棧是為java的native方法服務篡帕。
native方法是什么殖侵?

3、垃圾回收

https://blog.csdn.net/justloveyou_/article/details/71216049

  • 那些內(nèi)存需要回收镰烧?(對象是否可以被回收的兩種經(jīng)典算法: 引用計數(shù)法 和 可達性分析算法)
  • 什么時候回收拢军? (堆的新生代、老年代怔鳖、永久代的垃圾回收時機茉唉,MinorGC 和 FullGC)
  • 如何回收?(三種經(jīng)典垃圾回收算法(標記清除算法结执、復制算法度陆、標記整理算法)及分代收集算法 和 七種垃圾收集器)
對象存活判斷

1)引用計數(shù)
簡單咯,略
2)可達性分析:
通過一些列稱為“GC roots”的對象作為起始點献幔,開始向下搜索懂傀,走過的路徑稱為引用鏈,蜡感,當一個對象沒有路徑到達任意的GC roots時蹬蚁,圖論中說法就是不可達,則表示對象不可用铸敏,可以回收缚忧。

垃圾收集

1)標記清除算法
從根節(jié)點開始遍歷,先對遍歷到的節(jié)點進行標記杈笔,然后掃描整個空間中未被標記的部分闪水,進行回收。
標記-清除算法的主要不足有兩個:
效率問題:標記和清除兩個過程的效率都不高;
空間問題:標記-清除算法不需要進行對象的移動,并且僅對不存活的對象進行處理球榆,因此標記清除之后會產(chǎn)生大量不連續(xù)的內(nèi)存碎片朽肥,空間碎片太多可能會導致以后在程序運行過程中需要分配較大對象時,無法找到足夠的連續(xù)內(nèi)存而不得不提前觸發(fā)另一次垃圾收集動作.
2) 復制算法
復制算法將可用內(nèi)存按容量劃分為大小相等的兩塊持钉,每次只使用其中的一塊衡招。當這一塊的內(nèi)存用完了,就將還存活著的對象復制到另外一塊上面每强,然后再把已使用過的內(nèi)存空間一次清理掉始腾。這種算法適用于對象存活率低的場景,比如新生代空执。這樣使得每次都是對整個半?yún)^(qū)進行內(nèi)存回收浪箭,內(nèi)存分配時也就不用考慮內(nèi)存碎片等復雜情況,只要移動堆頂指針辨绊,按順序分配內(nèi)存即可奶栖,實現(xiàn)簡單,運行高效门坷。當然缺點就是將內(nèi)存減少到原來的一半宣鄙。
當然現(xiàn)在的內(nèi)存空間并不需要1:1去劃分,因為大多數(shù)對象都是“朝生夕死”默蚌,生存期短冻晤,根據(jù)將新生代內(nèi)存分為一塊較大的Eden空間和兩塊較小的Survivor空間 (如下圖所示),每次使用Eden和其中一塊Survivor敏簿。當回收時明也,將Eden和Survivor中還存活著的對象一次地復制到另外一塊Survivor空間上,最后清理掉Eden和剛才用過的Survivor空間惯裕。HotSpot虛擬機默認Eden和Survivor的大小比例是 8:1,也就是每次新生代中可用內(nèi)存空間為整個新生代容量的90% ( 80%+10% )绣硝,只有10% 的內(nèi)存會被“浪費”蜻势。

image.png

新生代中使用復制算法較低,因為存活對象比較少鹉胖,不需要頻繁復制握玛。
3) 標記整理算法
復制收集算法在對象存活率較高時就要進行較多的復制操作,效率將會變低甫菠。更關鍵的是挠铲,如果不想浪費50%的空間,就需要有額外的空間進行分配擔保寂诱,以應對被使用的內(nèi)存中所有對象都100%存活的極端情況拂苹,所以在老年代一般不能直接選用這種算法。
標記整理算法的標記過程類似標記清除算法痰洒,但后續(xù)步驟不是直接對可回收對象進行清理瓢棒,而是讓所有存活的對象都向一端移動浴韭,然后直接清理掉端邊界以外的內(nèi)存,類似于磁盤整理的過程脯宿,該垃圾回收算法適用于對象存活率高的場景(老年代)

分代收集算法

對于一個大型的系統(tǒng)念颈,當創(chuàng)建的對象和方法變量比較多時,堆內(nèi)存中的對象也會比較多连霉,如果逐一分析對象是否該回收榴芳,那么勢必造成效率低下。分代收集算法是基于這樣一個事實:不同的對象的生命周期(存活情況)是不一樣的跺撼,而不同生命周期的對象位于堆中不同的區(qū)域翠语,因此對堆內(nèi)存不同區(qū)域采用不同的策略進行回收可以提高 JVM 的執(zhí)行效率。當代商用虛擬機使用的都是分代收集算法:新生代對象存活率低财边,就采用復制算法肌括;老年代存活率高,就用標記清除算法或者標記整理算法酣难。Java堆內(nèi)存一般可以分為新生代谍夭、老年代和永久代。

4憨募、類加載機制

先放一放

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末紧索,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子菜谣,更是在濱河造成了極大的恐慌珠漂,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尾膊,死亡現(xiàn)場離奇詭異媳危,居然都是意外死亡,警方通過查閱死者的電腦和手機冈敛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門待笑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人抓谴,你說我怎么就攤上這事暮蹂。” “怎么了癌压?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵仰泻,是天一觀的道長。 經(jīng)常有香客問我滩届,道長集侯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮浅悉,結(jié)果婚禮上趟据,老公的妹妹穿的比我還像新娘。我一直安慰自己术健,他們只是感情好汹碱,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荞估,像睡著了一般咳促。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上勘伺,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天跪腹,我揣著相機與錄音,去河邊找鬼飞醉。 笑死冲茸,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的缅帘。 我是一名探鬼主播轴术,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼钦无!你這毒婦竟也來了逗栽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤失暂,失蹤者是張志新(化名)和其女友劉穎彼宠,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弟塞,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡凭峡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了宣肚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片想罕。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖霉涨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惭适,我是刑警寧澤笙瑟,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站癞志,受9級特大地震影響往枷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一错洁、第九天 我趴在偏房一處隱蔽的房頂上張望秉宿。 院中可真熱鬧,春花似錦屯碴、人聲如沸描睦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忱叭。三九已至,卻和暖如春今艺,著一層夾襖步出監(jiān)牢的瞬間韵丑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工虚缎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留撵彻,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓实牡,卻偏偏與公主長得像陌僵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子铲掐,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • jvm原理 Java虛擬機是整個java平臺的基石摆霉,是java技術實現(xiàn)硬件無關和操作系統(tǒng)無關的關鍵環(huán)節(jié)豪椿,是java...
    AI喬治閱讀 17,242評論 21 486
  • Java 虛擬機有自己完善的硬件架構, 如處理器、堆棧携栋、寄存器等搭盾,還具有相應的指令系統(tǒng)。JVM 屏蔽了與具體操作系...
    尹小凱閱讀 1,687評論 0 10
  • 1.一些概念 1.1.數(shù)據(jù)類型 Java虛擬機中婉支,數(shù)據(jù)類型可以分為兩類:基本類型和引用類型鸯隅。基本類型的變量保存原始...
    落落落落大大方方閱讀 4,538評論 4 86
  • 內(nèi)存溢出和內(nèi)存泄漏的區(qū)別 內(nèi)存溢出:out of memory向挖,是指程序在申請內(nèi)存時蝌以,沒有足夠的內(nèi)存空間供其使用,...
    Aimerwhy閱讀 741評論 0 1
  • 一直以來何之,總有人夸獎我的文章寫得好跟畅,甚至曾經(jīng)還有文藝小青年向我請教如何寫好文章,實際情況卻是溶推,我自己根本不知道到底...
    隴西讀書與寫作閱讀 1,079評論 10 17