1. 程式人生 > >試著把.net的GC講清楚(2)

試著把.net的GC講清楚(2)

查找 alloc 修改 enc 模式 ren mar 直接 其它

  • 試著把.net的GC講清楚(1)

上篇文章說了一些基本概念的東西,然後還有很多東西概念沒有頭緒,這篇文章我試著解釋

GC的回收算法詳細步驟?

上篇]文章講了.net GC的算法是Mark and Compact,不過到底是怎麽執行的,我這幾天查了資料,找到一篇博客說明了,它分為了幾個階段

Mark phase

這個階段沒得說,就是標記存活對象的,不考慮Weak Reference(弱引用)對象

Plan phase

這個階段是決定是執行Compact還是直接執行Sweep(上篇講到猜測LOH執行的是的Mark and Sweep,其實是不正確的)

Relocate phase

這個階段是Plan phase決定Compact後,開始對需要移動的對象進行地址重新計算,註意這個時候並不移動,只是重新計算地址

Compact phase

這個階段開始移動對象。

Sweep phase

移動完成對象了還需要Sweep?是因為,GC把所有的對象都修改為了連續的,其中一些對象被回收後還是在存活對象之間。Sweep就是使用Free Object把這些空白的內存填充起來,並添加到一個叫Free list裏面。

為什麽要用Free object創建填充?不是很清楚,猜測是為了下次回收的時候一塊把連續的內存回收了。

為什麽會有LOH?

LOH存在的意義也就是為了性能;大對象太大了,移動花費時間太長了,所以做了一個LOH專門存儲大對象,這樣對他們就區別對待了。

上篇文章說過,>=85000字節就分配到LOH中,為什麽是85000?這幾天找了很多,發現了是因為在GC申請內存的時候,每次向操作系統申請的一個內存塊大小為8k(Allocation Quantum),估摸著跟這個數值有關。

LOH其它一些信息

再次看到一個新穎的說法,說是LOH的gen是3,而不是2,待定

workstation,server GC模式到底區別是啥?

  • workstation GC:這麽說吧,它非常的保守的進行內存什麽的管理,有點像守財奴,一點點的申請,所以GC申請內存小點。
  • Server GC:就是那種暴發戶,往大了申請內存,越多越好,所以可以預見到Server GC模式下,內存耗費是非常驚人的,在查找資料的時候有人在docker中運行.net core的程序,占用內存太大了被重啟,改了workstation gc後內存就大幅下降。

其它的concurrent其實就是gc線程是和用戶線程可以並行執行的,提高了程序性能,減少了GC時的等待時間

參考

  • https://www.cnblogs.com/HQFZ/p/4627759.html
  • http://blog.csdn.net/sD7O95O/article/details/78549892

試著把.net的GC講清楚(2)