内存分配

  • 计算对象大小。
  • 添加对象指针和同步索引块。
  • 从内存指针处开始,分配对象内存。
  • 问题:内存不能无限制增长。

垃圾回收

  • 从应用程序实例出发,标记所有的引用对象。
  • 将标记对象移动到低地址端,修正实例引用地址与内存指针。
  • 问题:全内存移动对象,垃圾回收性能不高。

分代回收

  • 将对象分代(0、1、2),对低代对象进行垃圾回收,幸存对象升级为高代对象。
  • 低代对象垃圾回收也无法满足时高代对象进行垃圾回收,若2代垃圾回收后仍不满足,抛出异常。
  • 问题:托管资源由CLR自动实现垃圾回收,但非托管资源无法处理。

终结器机制

  • 非托管资源分配内存时,若对象在析构函数中编写资源释放代码,编译器根据析构函数自动生成Object.Finalize()方法,将该对象指针加入到终结列表。
  • 垃圾回收时,若终结列表中存在该对象指针则移除,并将对象实例添加到待终结对象列表,否则触发垃圾回收。
  • CLR启用高优先级后台线程,遍历执行待终结对象列表中的Finalize方法,并从队列中移除对象实例。
  • 问题:非托管资源在0代无法回收,可能存在升代情况,无法及时释放资源。

IDisposable实现

  • 非托管资源对象继承IDisposable接口,实现Dispose()方法提供资源释放功能。
  • 使用者调用Dispose()方法及时回收非托管资源,并通知CLR不必再回收该非托管资源。
  • 在析构函数中调用Dispose()方法作为保护机制,防止因使用者未调用Dispose()方法,保证非托管资源能够最终释放。

GC触发时机

  • 0代超过预算时。
  • 显式调用System.GC.Collect()。
  • Windows报告低内存。
  • AppDomain正在被卸载。
  • CLR正常关闭时。

最新文章

  1. Oracle 创建主键自增表
  2. struts2 18拦截器详解(七)
  3. SQLSERVER中WITH(NOLOCK)详解
  4. lightoj 1008
  5. J2EE入门必备
  6. delphi算法
  7. 解读Laravel,看PHP如何实现Facade?
  8. iOSiOS开发之数据存储之NSKeyedArchiver
  9. esclipse连接mysql数据库
  10. Vue+SpringBoot+Mybatis的简单员工管理项目
  11. Docker中安装elasticsearch6.7.1
  12. C++字符串按照指定规则切割的功能模板类,常用的一段检测记录运行时间的代码
  13. zsh,oh-my-zsh,antigen使用记录
  14. pek (北大oj)3070
  15. git初学
  16. java基础知识-逻辑运算符
  17. 记一次SQL Server Insert触发器编写过程
  18. hdu1072(Nightmare)bfs
  19. 如何监控tomcat性能
  20. java多线程(六)

热门文章

  1. servlet遇到的问题
  2. 8.8.ZooKeeper 原理和选举机制
  3. zabbix 监控TCP状态连接数
  4. 打造高效 VIM
  5. Android | 自动调整文本大小的 TextViews
  6. Java高级技术点面试问题-IO相关面试问题
  7. java线程基础巩固---线程ID,优先级
  8. 搭建单机版伪分布zookeeper集群
  9. 吐槽一下jsoup
  10. 第六章 组件 58 组件切换-使用v-if和v-else结合flag进行切换