堆栈和堆得区别与垃圾回收
堆棧和堆得區別:
使用棧就象我們去飯館里吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。
使用堆就象是自己動手做喜歡吃的菜肴,比較麻煩,但是比較符合自己的口味,而且自由度大。
堆和堆棧的垃圾回收:
堆棧不存在垃圾回收的問題, 直接壓棧就可以了。
堆的話,需要復雜的垃圾回收機制。
垃圾回收是對堆來進行操作,堆中的對象是否有效, 是通過遍歷堆棧來獲取的, 就是一個引用計數的問題。
一個引用類型的實例化過程:
Class a = new Class();
1) Class a 的時候, 生成一個空的引用指針,并把他壓棧到堆棧中。
2)new Class() 生成一個類的實例, 并且在堆上分配對應內存。
3 ) = 賦值的時候, a的引用指向新生成的實例。
GC對于對象的回收機制:
問題原因:
系統變慢的一個很主要的原因就是,隨著系統運行時間的增長, 內存碎片也會越來越多。就是因為程序反復在堆中創建和釋入變量。久而久之,可用變量將不再是聯系的內存空間。 為了尋址這些可用變量, 系統也會增加開銷。
.NET 垃圾回收器實現機制:
垃圾回收器會壓縮托管堆的內存空間, 是可用對象在一個連續的內存空間中,同時將堆棧中的引用變量的地址修改為新的地址。這樣會帶來一部分的系統開銷。 但是內存整理后帶來的性能提升遠遠大于壓縮內存空間所消耗的性能消耗。
最大的好處就是: 開發者再也不用關心內存的泄露問題
垃圾回收的簡單邏輯:
處理邏輯:
1)遍歷Generation 0 Kill掉沒用的對象,有用的升級到Generation 1
2).如果空間已經夠用的話, 就不繼續回收了 ,直接返回
3)如果空間還不夠或者Generation 1 也滿了, Kill掉G1中沒用的對象,有用的升級到G2
4)如果有必要 繼續回收G2...如果g2也不夠了 那么就內存溢出了。
參數:
GC在初始化完成的時候Generation 0 的大小就確定為256k (優先考慮放在L2 Cache中)
Generation 1 開始大小是0 最大可以到2M
Generation 2 沒有限制
轉載于:https://www.cnblogs.com/warren/archive/2011/09/02/2163274.html
總結
以上是生活随笔為你收集整理的堆栈和堆得区别与垃圾回收的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一起谈.NET技术,C# 中奇妙的函数之
- 下一篇: [商业]文件文件夹对比合并工具Araxi