.net垃圾回收学习[NET 2.0 Performance Guidelines - Garbage Collection][翻译加学习]
From:http://www.guidanceshare.com/wiki/.NET_2.0_Performance_Guidelines_-_Garbage_Collection
目录:
- Identify and analyze your application’s allocation profile
- Avoid Calling Gc.Coollect
- Consider Using Weak References with Cached Data
- Prevent the promotion of Short-Lived Objects
- Set Unneeded Member Variables to Null before making long-runing calls
- Minmize Hidden Allocations
- Avoid or Minimize Complex Object Graphs
- Avoid preallocating and Chunking memory
Identiy and Analyze your Application’s Allocation profile
程序内存分配性能(allocation profile)取决于以下三个因素:对象的大小、对象的数量和对象的生命周期。 当内存分配非常快的时候,GC的效率取决于在哪个代上进行回收操作。GC在GEN 0 上回收小对象是效率最高的。因为Gen 0上的对象通常是最小的也最可能在CPU缓存中的。相反,在GEN 2上经常性的回收对象则是代价昂贵的。你可以使用CLR profiler类似allocation profiler来观察你的Application的allocation patterns, 识别对象什么时候被分配,处在哪个Generation中,通过这些来优化效率。
For more information, see "How To: Use CLR Profiler" at http://msdn.microsoft.com/library/en-us/dnpag/html/scalenethowto13.asp
Avoid Calling Gc.Collect
默认的GC.Collect方法会导致回收所有代上的垃圾。对所有的代进行回收是代价昂贵的,因为系统中的理论上存活的所有对象都需要被遍历一遍比便确保完整的回收。不需要多说,尽可能的遍历所有的对象经常会消耗大量的时间。GC的算法一般都进行了一定程度的优化,确保只有当值的进行完整的Collection的时候才进行这种操作,所以,不要直接的调用GC.Collect, 让垃圾收集器决定何时需要去运行。
垃圾收集器设计的时候加入了自我优化的算法,它会根据你的应用程序对内存的需要进行算法调整。手动的强制进行垃圾回收会阻碍垃圾收集器的优化。
假如你有一个不得不需要调用GC.Collect的场景,考虑一下几点:
- 在调用GC.Collect之后调用GC.WaitForPendingFinlizers。这回确保当前的线程等待所有对象的Finalizer都被调用后再执行。
- 在finalizers运行后,有许多的Dead Object需要进行回收。再次调用GC.Collect收集这些对象。
System.GC.Collect(); // This gets rid of the dead objects
System.GC.WaitForPendingFinalizers(); // This waits for any finalizers to finish.
System.GC.Collect();
// This releases the memory associated with the objects that were just finalized.
Consider Using Weak References with Cached Data
当你使用缓存数据的时候,考虑使用weak references, 这样缓存的对象很容易根据需要复活或者当有内存压力的时候能够被GC释放掉。你不应该在小对象上大量的使用weak references, 因为这会导致weak reference自己会过载。weak reference 比较适合存储在集合中的中型或者大型的对象。
考虑如下场景: 你在你的应用程序中维护了一个雇员信息的自定义的缓存方案。通过weakreference来持有你的对象,当内存压力增大的时候对象会被回收掉。假如在随后的对象查找中,你找不到这个对象,重新从一个合法的持久源中创建这个对象。通过这种方式能够平衡缓存的使用和持久化的需要。以下代码展示了如何使用一个weak reference.
void SomeMethod()
{
// Create a collection
ArrayList arr = new ArrayList(5);
// Create a custom object
MyObject mo = new MyObject();
// Create a WeakReference object from the custom object
WeakReference wk = new WeakReference(mo);
// Add the WeakReference object to the collection
arr.Add(wk);
// Retrieve the weak reference
WeakReference weakReference = (WeakReference)arr[0];
MyObject mob = null;
if( weakReference.IsAlive ){
mob = (MyOBject)weakReference.Target;
}
if(mob==null){
// Resurrect the object as it has been garbage collected
}
//continue because we have the object
}
Prevent the Promotion of Short-Lived Objects
在GEN 0上被分配和回收的对象是short-lived objects. 下面的原则确保你的short-lived对象没有被提升生命周期。
- 不要从long-lived对象引用short-lived对象。常见的例子是将一个局部变量赋值为一个类级别的对象引用。
class Customer{
Order _lastOrder;
void insertOrder (int ID, int quantity, double amount, int productID){
Order currentOrder = new Order(ID, quantity, amount, productID);
currentOrder.Insert();
this._lastOrder = currentOrder;
}
}
避免这种类型的代码,因为有可能将对象的生命周期从Gen 0提升, 从而推迟了将要被回收的对象资源。一个可能避免这种情况的实现如下:
class Customer{
int _lastOrderID;
void ProcessOrder (int ID, int quantity, double amount, int productID){
. . .
this._lastOrderID = ID;
. . .
}
}
具体的Order Class通过ID来引用。
- 避免实现finalize方法。 为了优化Finalization操作,GC一定会将finalizable对象提升到更老的代际,将对象变成了long-lived objects.
- 避免finalizable对象引用其他对象。这会导致被引用的对象变成long-lived的。
References
For more information about garbage collection, see the following resources:
- "Garbage Collector Basics and Performance Hints" on MSDN at http://msdn.microsoft.com/library/en-us/dndotnet/html/dotnetgcbasics.asp.
- MSDN Magazine article, "Garbage Collection: Automatic Memory Management in the Microsoft .NET Framework," by Jeffrey Richter, at http://msdn.microsoft.com/msdnmag/issues/1100/GCI/TOC.ASP?frame=true.
- MSDN Magazine article, "Garbage Collection—Part 2: Automatic Memory Management in the Microsoft .NET Framework," by Jeffrey Richter, at http://msdn.microsoft.com/msdnmag/issues/1200/GCI2/TOC.ASP?frame=true.
转载于:https://www.cnblogs.com/sunshinefly128/archive/2011/08/28/2156004.html
.net垃圾回收学习[NET 2.0 Performance Guidelines - Garbage Collection][翻译加学习]相关推荐
- Java 垃圾回收机 GC Roots详解(Garbage Collection Roots)
背景: 之前面试阿里支付宝,被问到常见的GC Root 是什么? 当时自己支支吾吾,明明自己看过深入理解Java 虚拟机这本书,但是就是回答不上来. 后来自己工作中,遇到内存泄漏问题.我百度,下载了M ...
- 解读.net垃圾回收和CLR 4.0对垃圾回收所做的改进之一-.Net编程教程
解读.net垃圾回收和CLR 4.0对垃圾回收所做的改进之一-.Net编程教程 来源:模板无忧 作者:编辑整理更新时间:2009-07-19点击:114 A survey of garbage col ...
- CUDA10.0官方文档的翻译与学习之编程接口
目录 背景 用nvcc编译 编译工作流 二进制适配性 ptx适配性 应用适配性 C/C++适配性 64位适配性 cuda c运行时 初始化 设备内存 共享内存 页锁主机内存 可移植内存 写合并内存 映 ...
- Java GC(垃圾回收)机制知识总结
Java GC系列 Java关键术语 Java HotSpot 虚拟机 JVM体系结构 Java堆内存 启动Java垃圾回收 Java垃圾回收过程 垃圾回收中实例的终结 对象什么时候符合垃圾回收的条件 ...
- 图文结合,白话 Go 的垃圾回收原理
前面两篇文章介绍了Go语言的内存分配策略以及Go协程动态扩充和收缩栈内存的原理,今天这篇文章我们主要来聊一下内存管理的另外一大块内容:垃圾回收. 下面首先我们会聊一下什么是GC (垃圾回收),GC的作 ...
- 图文结合,白话Go的垃圾回收原理
前面两篇文章介绍了Go语言的内存分配策略以及Go协程动态扩充和收缩栈内存的原理,今天这篇文章我们主要来聊一下内存管理的另外一大块内容:垃圾回收. 下面首先我们会聊一下什么是GC (垃圾回收),GC的作 ...
- Java的垃圾回收机制介绍
1.java的语言框架 (1)CPU->操作系统内核->应用层框架->JVM(java虚拟机)->Java字节码->Java源代码 (2)java是解释型语言,嵌入式常用 ...
- Java8的GC垃圾回收(一)
Java垃圾回收概况 Java GC(Garbage Collection,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄 ...
- C#垃圾回收机制GC
本章主要讲解以下C#的垃圾回收机制,之前也有文章提到: Effect C# 学习笔记 .Net资源管理_dmk17771552304的博客-CSDN博客 为什么要使用GC 提高了软件开发的抽象度 程序 ...
- .Net 垃圾回收机制原理(二)
英文原文:Jeffrey Richter 编译:赵玉开 链接http://www.cnblogs.com/yukaizhao/archive/2011/11/25/dot_net_GC_2.html ...
最新文章
- OSPF:MTU不一致导致的邻接关系问题
- python北京理工大学推荐的书-2020最新的学Python编程的五本必读好书
- PHP下的浮点运算不准的解决办法
- 算法提高课-搜索-最短路模型-AcWing 1100. 抓住那头牛:bfs
- MySQL查看表结构的实际操作命令简介
- boost::container模块实现检查相等的容器的测试程序
- tensorflow 之 tf.tile()函数
- 知乎热榜:如何获得高并发的经验?
- java字符串转语音文件_java - Java文字转语音(Spring Boot) - 堆栈内存溢出
- C++右值引用与转移语义
- android studio vfs,Android Studio:尝试呈现XML布局的InvalidVirtualFileAccessException
- 解决pycharm在ubuntu下搜狗输入法一直固定在左下角的问题
- android create命令,phonegap运行android – create命令失败,退出代码8 – linux
- 2022年贵州大学计算机考研(初试+复试+实验室经验贴)
- matlab 汽车雷达模拟器,雷达回波模拟器在汽车雷达测试中的应用
- win10定时锁定计算机,Win10自动锁屏时间太长了怎么设置?Win10设置自动锁屏时间的操作...
- Android微信抢红包服务源码
- win10解决安装.NET Framework 3.5安装不上,错误代码:0x800F081F,解决办法:超级管用。
- 颠覆平庸:在技术上持续精进
- 最新车载以太网解决方案
热门文章
- 微信小游戏 - 开发工具安装 - 官方 Demo 运行
- 小D课堂 - 零基础入门SpringBoot2.X到实战_第8节 数据库操作之整合Mybaties和事务讲解_36、SpringBoot整合mybatis之事务处理实战...
- 阶段3 1.Mybatis_11.Mybatis的缓存_3 mybatis一对一实现延迟加载
- 阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第1节 基础加强_1_今日内容(1)...
- CodeForces - 786B Legacy (线段树+DIjkstra+思维)
- Martin Fowler谈微服务的优缺点
- 洛谷 P3063 [USACO12DEC]牛奶的路由Milk Routing
- OJ-1:时钟问题【九度1553】
- java中equals以及==的用法(简单介绍)
- HDU 6321(状压dp)