java內存分配看書筆記分享

  作爲一個java開發人員,懂不懂java內存分配成爲你是否爲高級java工程師的標準。爲什麼這麼說呢?因爲java虛擬機(也就是jvm)有着自己的自動內存管理機制,在我們寫代碼的過程中不會去管理內存的分配和回收,所以如果想進行性能調優或者內存問題的排查就必須瞭解內存的分配了,而內存的回收要和垃圾收集器一起學。自己是看了《深入理解Java虛擬機》周志明 著 第2版 來了解的。這本書真的不負盛名。值得一看。在這裏也推薦給讀者。而java內存分配實在不好在一篇文章中講完。而此篇文章純粹爲筆記吧。

 首先要知道java中內存分配和回收都主要是在java堆上。java堆是jvm管理中內存最大的一塊。那在java堆中,分內存爲2部分,也就是大名鼎鼎的新生代和老年代了。而在新生代中分爲Eden空間、From Survivor 空間、To Survivor空間。爲了方便理解,下面有一個圖。

   其中From指的就是From Survivor空間,而To同理。看到這裏的時候,你會不會疑問說爲什麼java堆爲什麼要分成新生代和老年代 ,而新生代中又分爲2個Survivor空間呢?原因在於內存的回收。講明白這裏的話需要了解jvm中幾種垃圾收集器的原理了,在這裏先不展開講。

  像我們平時new一個對象出來的時候,jvm一般會怎麼做呢?有2個策略:

  1. 對象you優先在Eden分配。
  2. 大對象直接進入老年代

   如果對象所需要的空間超出了Eden的剩餘空間,則會進行一次Minor GC,也就是我們說的young GC或者說新生代GC。這樣會把一些對象回收到Survivor空間去,再看看多出來的空間夠不夠對象所需的空間。要是一個對象所需內存空間較大,這就是大對象,直接分配到老年代去。

  而內存的分配不僅僅和大小有關,還有時間的這個維度。在這裏有2個策略:

  1. chan長期存活的對象將進入老年代
  2. 動態的對對象進行年齡判定

  jvm在分配對象內存的時候,還會給對象一個年齡計數器,如果對象分配在Eden空間,經過第一次MinorGC後被分配到Survivor空間,在此時就是把對象年齡設爲1,。對象在Survivor空間中每過一次MinorGC,並且沒有被移動到老年代去,ni年齡就增加1歲。當到達一定年齡,就會移動到老年代去。而這個閾值可以通過-XX:MaxTenuringThreshold設置。

  而動態的判定是怎麼回事呢?如果在Survivorkong空間中相同年齡所有對象大小的總和大於Survivorkon空間的一般,年齡大於或等於ga該年齡的對象就可以直接進入老年代。這時候就不會說一定要到達設定的年齡了。

  內存的分配大概就是這樣的流程了。其實寫這篇文章花了很長時間,因爲自己一直在猶豫要不要將很多細節展開來躲描述一下。但是又怕自己一展開,總是像打開一扇新世界的大門。這樣就不知道怎麼才能收尾了。所以索性就當做一篇筆記來寫吧。

  前陣子出差去了北京,到了天安門廣場,看到毛主席的畫像高高的掛在天安門城樓上,十分高大。在這裏分享毛主席的一首詞,表達對毛主席的敬仰!

沁園春 雪 (1936.02 )

北國風光,千里冰封,萬里雪飄。
望長城內外,惟餘莽莽;大河上下,頓失滔滔。
山舞銀蛇,原馳蠟象,欲與天公試比高。
須晴日,看紅妝素裹,分外妖嬈。
江山如此多嬌,
引無數英雄競折腰。
惜秦皇漢武,略輸文采;唐宗宋祖,稍遜風騷。
一代天驕,成吉思汗,只識彎弓射大雕。
俱往矣,數風流人物,還看今朝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章