GC原理
来源:互联网 发布:廖雪峰python教程在哪? 编辑:程序博客网 时间:2024/06/07 13:51
http://kb.cnblogs.com/page/106720/
GC注意事项:
1、只管理内存,非托管资源,如文件句柄,GDI资源,数据库连接等还需要用户去管理。
2、循环引用,网状结构等的实现会变得简单。GC的标志-压缩算法能有效的检测这些关系,并将不再被引用的网状结构整体删除。
3、GC通过从程序的根对象开始遍历来检测一个对象是否可被其他对象访问,而不是用类似于COM中的引用计数方法。
4、GC在一个独立的线程中运行来删除不再被引用的内存。
5、GC每次运行时会压缩托管堆。
6、你必须对非托管资源的释放负责。可以通过在类型中定义Finalizer来保证资源得到释放。
7、对象的Finalizer被执行的时间是在对象不再被引用后的某个不确定的时间。注意并非和C++中一样在对象超出声明周期时立即执行析构函数
8、Finalizer的使用有性能上的代价。需要Finalization的对象不会立即被清除,而需要先执行Finalizer.Finalizer,不是在GC执行的线程被调用。GC把每一个需要执行Finalizer的对象放到一个队列中去,然后启动另一个线程来执行所有这些Finalizer,而GC线程继续去删除其他待回收的对象。在下一个GC周期,这些执行完Finalizer的对象的内存才会被回收。
9、.NET GC使用"代"(generations)的概念来优化性能。代帮助GC更迅速的识别那些最可能成为垃圾的对象。在上次执行完垃圾回收后新创建的对象为第0代对象。经历了一次GC周期的对象为第1代对象。经历了两次或更多的GC周期的对象为第2代对象。代的作用是为了区分局部变量和需要在应用程序生存周期中一直存活的对象。大部分第0代对象是局部变量。成员变量和全局变量很快变成第1代对象并最终成为第2代对象。
10、GC对不同代的对象执行不同的检查策略以优化性能。每个GC周期都会检查第0代对象。大约1/10的GC周期检查第0代和第1代对象。大约1/100的GC周期检查所有的对象。重新思考Finalization的代价:需要Finalization的对象可能比不需要Finalization在内存中停留额外9个GC周期。如果此时它还没有被Finalize,就变成第2代对象,从而在内存中停留更长时间。
- GC原理
- GC原理
- GC原理
- Java GC:Java GC原理
- GC工作原理
- GC工作原理
- JAVA gc 工作原理
- GC的运行原理
- JAVA GC原理
- GC工作原理详解
- GC工作原理
- GC的工作原理
- GC工作原理
- GC工作原理
- .Net GC 机制原理
- JAVA GC原理
- JAVA GC原理
- Java GC工作原理
- 【Asp.net】 Ajax小例子
- TestNG的IAnnotationTransformer监听器详解
- UVA - 11729 Commando War
- canvas绘图(一)
- 网红四溢的年代,我们依然需要坚守信仰
- GC原理
- canvas (笔记) 基础篇
- 8天玩转并行开发——第二天 Task的使用
- 直接插入排序
- 新环境中奋起的岁月(一)
- 垃圾收集器与内存分配策略
- mysql 索引
- 二叉搜索树
- cocopods最新版本使用