这个话题还未做详细研究,暂时用不到,只是粗略看了一下。

使用System.Runtime.InteropServices.GCHandle类来手动控制对象的生命周期

(个人感觉这里可能有一些问题...只是草稿而已..还请高手指正)

1.GCHandle.Alloc

  传递一个Object和一个GCHandleType枚举给Alloc方法以控制Object的生命周期,返回一个GCHandle

  1) GCHandleType.Weak 此标志位允许你监视对象生命周期,当对象被标记为不可到达的时候,这个对象的Finalize方法可能执行也可能没有执行,这个对象可能依然存在于内存中

  2) GCHandleType.WeakTrackResurrection 此标志位允许你监视对象生命周期,对象的Finalize方法肯定会被执行(如果有的话),内存会被回收

  3) GCHandleType.Nomal  此标志位允许你控制对象生命周期,保证对象一直存在,在GC的时候该对象可能被移动位置

  4) GCHandleType.Pinned  此标志位允许你控制对象生命周期,保证对象一直存在,在GC的时候该对象不会被移动

2.GC和GCHandle的关系

  GCHanlde 是一个轻量级的值类型,内部只包含一个实例Field:IntPtr

  1) GC标记所有可到达的对象,然后GC扫描 GC Handle 表, 所有标记为Normal和Pinned的对象将被视为可到达的对象(包括这些对象的成员 这是一个递归的过程)

  2) GC扫描GC Handle表中所有标记为Weak的实体,如果该实体所指向的Object被标记为不可到达的,(也就是标记为垃圾),那么这个拥有指针的实体将置为null

  3) GC扫描终结列表(Finalization List 不知道怎么翻译...),将所有指向不可到到达的指针移动到Freachable Queue,然后被指向的对象标记为可到达的

  4) GC扫描GC Handle 表中所有标记为WeakTrackResurrection 的实体,如果该实体所指向的Object被标记为不可到达的,那么拥有这个指针的实体将置为null

  5) GC Compact内存(当然有的时候GC不并执行这个动作,因为它觉得不值得),此外Pinned的对象不会被移动

3.应用

  1) c# fixed关键字 就是GCHandleType.Pinned 的实际应用之一

  2) Weak标记可以让你知道什么时候一个对象已经决定被回收,(但是这个对象也许还没有被回收)

  3) WeakTrackResurrection标记可以让你知道什么时候一个对象的内存被回收(按书中所说...这个东西好像没啥用)

  4) WeakReference其实就是对GCHandle的封装

【C# .Net GC】手动监视和控制对象的生命周期(GCHandle)的更多相关文章

  1. 管中窥豹——从对象的生命周期梳理JVM内存结构、GC调优、类加载、AOP编程及性能监控

    如题,本文的宗旨既是透过对象的生命周期,来梳理JVM内存结构及GC相关知识,并辅以AOP及双亲委派机制原理,学习不仅仅是海绵式的吸收学习,还需要自己去分析why,加深对技术的理解和认知,祝大家早日走上 ...

  2. [翻译] 编写高性能 .NET 代码--第二章 GC -- 减少分配率, 最重要的规则,缩短对象的生命周期,减少对象层次的深度,减少对象之间的引用,避免钉住对象(Pinning)

    减少分配率 这个几乎不用解释,减少了内存的使用量,自然就减少GC回收时的压力,同时降低了内存碎片与CPU的使用量.你可以用一些方法来达到这一目的,但它可能会与其它设计相冲突. 你需要在设计对象时仔细检 ...

  3. [翻译] Autofac 控制范围和生命周期

    原文链接:http://docs.autofac.org/en/latest/lifetime/index.html Lifetime 是指服务的实例在程序中存活多久 – 从最初的实例化到清理(dis ...

  4. Java虚拟机(三)垃圾标记算法与Java对象的生命周期

    前言 这一节我们来简单的介绍垃圾收集器,并学习垃圾标记的算法:引用计数算法和根搜索算法,为了更好的理解根搜索算法,会在文章的最后介绍Java对象在虚拟机中的生命周期. 1.垃圾收集器概述 垃圾收集器( ...

  5. [原创]java WEB学习笔记47:Servlet 监听器简介, ServletContext(Application 对象), HttpSession (Session 对象), HttpServletRequest (request 对象) 监听器,利用listener理解 三个对象的生命周期

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  6. hibernate 持久化对象的生命周期 2.1

    持久化对象的生命周期 瞬态(自由态) 表示对象在内存中存在,在数据库中没有数据相关,比如刚刚new出来的一个对象 持久态 持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象 ...

  7. Java 对象的生命周期

    Java对象的生命周期 在Java中,对象的生命周期包含下面几个阶段: 1.      创建阶段(Created) 2.      应用阶段(In Use) 3.      不可见阶段(Invisib ...

  8. Hibernate学习(4)- Hibernate对象的生命周期

    1.Hibernate对象的生命周期(瞬时状态.持久化状态.游离状态) 1.瞬时状态(Transient): 使用new操作符初始化的对象就是瞬时状态,没有跟任何数据库数据相关联:2.持久化状态(Pa ...

  9. 在web.xml中配置监听器来控制ioc容器生命周期

    5.整合关键-在web.xml中配置监听器来控制ioc容器生命周期 原因: 1.配置的组件太多,需保障单实例 2.项目停止后,ioc容器也需要关掉,降低对内存资源的占用. 项目启动创建容器,项目停止销 ...

随机推荐

  1. Windows系统安装和office版本兼容

    MSDN, I tell you 下载windows10系统各种纯净镜像.但是还是推荐使用官网修改参数显示出下载链接,下载windows10最新版. 在最近几次重做系统中,PE工具似乎无法识别从MSD ...

  2. manjaro20软件商店无法链接下载

    软件商店如果无法链接下载 解决方案1 可以使用terminal慢慢下载,.bashrc中配置代理 如果依然不行,检查网络设置代理是否为自动或者手动设置正确. 解决方案2 检查是否未设置中国社区源或者重 ...

  3. golang中channel

    1. Channel是Go中的一个核心类型,你可以把它看成一个管道,通过它并发核心单元就可以发送或者接收数据进行通讯(communication). 2. select package main im ...

  4. java接口应用

    1 package face_09; 2 /* 3 * 笔记本电脑使用. 4 * 为了扩展笔记本的功能,但日后出现什么功能设备不知道. 5 * 6 * 定义了一个规则,只要日后出现的设备都符合这个规则 ...

  5. Java中四种访问权限总结

    一.Java中有四种访问权限, 其中三种有访问权限修饰符,分别为private.public.protected,还有一种不带任何修饰符(default). 1. private: Java语言中对访 ...

  6. 在 Prim 算法中使用 pb_ds 堆优化

    在 Prim 算法中使用 pb_ds 堆优化 Prim 算法用于求最小生成树(Minimum Spanning Tree,简称 MST),其本质是一种贪心的加点法.对于一个各点相互连通的无向图而言,P ...

  7. How to check in Windows if you are using UEFI

    You might be wondering if Windows is using UEFI or the legacy BIOS, it's easy to check. Just fire up ...

  8. 「NOI十联测」奥义商店

    「NOI十联测」奥义商店 若lzz想花费最少的钱,那么显然要选择数目较少的颜色. 先考虑暴力的写法. 每次向两边统计,每个物品要求被买的概率可以由上一个物品推出. now=1;//now 被买概率 M ...

  9. Android 关于Intent的一些简略总结

    感谢大佬:https://www.jianshu.com/p/19147a69e970 Intent 常用构造方法: | 方法 | 描述 | |Intent() | 构造一个空 Intent | | ...

  10. Android使用pull解析xml格式的数据

    dom解析:基于全文加载的解析方式   sax解析:基于事件的逐行解析方式  pull解析:同sax              XmlPullParser     //解析xml文件读取短信内容    ...