前两篇写的都是gc的一些概念和细节,这些东西对自己以后写代码有什么用,本篇我就准备将这些内容。

root

第一篇文章中讲了GC在遍历存活对象的时候,都是从root开始的,root是一些对象的引用,例如:全局对象、静态对象等。

如果要减少root的个数,那么就可以从静态对象入手,减少静态对象,毕竟静态对象一直存活到程序结束。

全局对象为什么不考虑?原因很简单,就是静态对象更容易优化,全局对象的一个程序中也没有几个,如果优化过程中,必然需要把全局对象的内容放到其它的地方,例如塞到另一个类里面,那么会造成这个类膨胀起来。
当然这也是一种方法。

LOH

之前了解到>=85000个字节的对象,会放到大对象的堆里面,并且在gen2回收的时候才进行回收,且不进行内存压缩,内存稍紧张的时候,就会造成少许浪费,所以
这个我们需要控制对象的体积,让它尽可能<85000。

gen0、gen1、gen2

当gc触发回收gen0的时候,那么此次存活的对象会升代,理想情况让gen0的大小在一次回收过程中,就可以得到内存空间,也就是需要减少一个对象的生存周期,让对象的生存周期尽可能短。

在生存周期非常短的情况,那么gen0的回收一次会获取很大的内存空间,且升代的对象非常少,那么gc就没有必要再向OS申请内存资源了。

gc申请内存资源

在创建对象的时候,gc在自己可用内存不够的情况下,会向os申请新的内存资源,并在gc回收内存后,并不会返回内存给os。所以就如之前的前一节说的,减少对象
可以让os有更多的可调配资源。

Weak Reference

在GC回收的时候,weak reference的对象是会被当做垃圾的,所以这个慎用,基于这个特性,在某些场景下,weak reference的对象在使用的时候可以进行判断是否已经被回收。
如果回收了,那么重新在申请,比如某些占内存的外部资源,就可以使用weak reference来减少内存紧张带来的问题。

finalize方法

还记得一个对象含有finalize方法的特点吗?需要GC两次才可能被回收,且GC的时间不定,所以非托管资源尽可能不使用finalize,对于内存紧张的情况,就不要使用了,不然
需要2次gc,gc的时候程序性能特别差。

workstation、server gc mode

保守的资源用workstation gc mode,非保守的资源用server gc mode,然后在用用cocurrent方式提升一下gc的性能,减少程序执行挂起时间。

总结

用理论指导实际,需要场景来支持,现在很多的程序的各种结构和算法都是为了提高性能而设计的,所以为了性能,很多的架构或者程序算法还有其他的辅助功能,也是很合理了。

试着把.net的GC讲清楚(3)的更多相关文章

  1. 试着把.net的GC讲清楚(1)

    什么是GC? GC(garbage collection)是对内存管理中回收已经不用的内存的一种机制,我们熟知的java和.net都有自己的GC机制,是内存管理的一部分. 为什么会有GC呢?是因为动态 ...

  2. 试着把.net的GC讲清楚(2)

    试着把.net的GC讲清楚(1) 上篇文章说了一些基本概念的东西,然后还有很多东西概念没有头绪,这篇文章我试着解释 GC的回收算法详细步骤? 上篇]文章讲了.net GC的算法是Mark and Co ...

  3. 《你不知道的JavaScript下卷》知识点笔记

    1. [1, 2, 3] == [1, 2, 3] 返回false [1, 2, 3] == “1, 2, 3” 返回true 2. 如果 < 比较的两个值都是字符串, 就像在b < c中 ...

  4. 试着讲清楚:js代码运行机制

    一. js运行机制 js执行引擎 经常看文章的说到js是带线程的,其实这个说法非常的模糊,准确的是js执行引擎是单线程的,js执行引擎就是js代码的执行器,有了这个概念就可以下来说说js是如何运行的了 ...

  5. 深入浅出聊优化:从Draw Calls到GC

    前言: 刚开始写这篇文章的时候选了一个很土的题目...<Unity3D优化全解析>.因为这是一篇临时起意才写的文章,而且陈述的都是既有的事实,因而给自己“文(dou)学(bi)”加工留下的 ...

  6. PHP新的垃圾回收机制:Zend GC详解

    概述 在5.2及更早版本的PHP中,没有专门的垃圾回收器GC(Garbage Collection),引擎在判断一个变量空间是否能够被释放的时候是依据这个变量的zval的refcount的值,如果re ...

  7. GitHub上那些值得一试的JAVA开源库--转

    原文地址:http://www.jianshu.com/p/ad40e6dd3789 作为一名程序员,你几乎每天都会使用到GitHub上的那些著名Java第三方库,比如Apache Commons,S ...

  8. 转:面试题:“你能不能谈谈,java GC是在什么时候,对什么东西,做了什么事情?”

    转自:http://jeromecen1021.blog.163.com/blog/static/18851527120117274624888/ 面试题目: 地球人都知道,Java有个东西叫垃圾收集 ...

  9. 优化 从Draw Calls到GC

    原文出处: 慕容小匹夫的博客(@慕容小匹夫)   欢迎分享原创到伯乐头条 前言: 刚开始写这篇文章的时候选了一个很土的题目...<Unity3D优化全解析>.因为这是一篇临时起意才写的文章 ...

随机推荐

  1. Java 调用python说明文档

    Java 调用python说明文档 通过java调用python脚本主要如下三种方式: 1.直接执行python脚本: 2.执行python.py文件: 3.使用Runtime.getRuntime( ...

  2. C语言学习之递归

    学习C语言到递归时,还记得那个用来抛砖引玉的例子: "从前呀,有座山,山里有个老和尚给一个小和尚讲故事,讲的什么故事呢?从前呀,有座山,山里有个老和尚给一个小和尚讲故事,讲的什么故事呢?从前 ...

  3. EL表达式和JSTL核心标签库

    1 EL表达式 1.1 EL的概述 EL,全名为Expression Language. 主要作用: ①EL表达式主要用于替换jsp页面中的脚本表达式,以便于从各种类型的web域中检索java对象(某 ...

  4. Sql Server的艺术(七) SQL 数据插入操作

    --用INSERT插入单行数据 在SQL中,可以通过INSERT...VALUES语句直接向数据库表中插入数据.可以整行,也可以部分列. 基本语法: INSERT INTO table_name [c ...

  5. 跨进程的mutex

    1.操作系统分为ring0(内核层)和ring3(应用层)两层. ring0层出错会蓝屏,ring3层出错程序就会挂了. event和mutex创建他的指针是应用层,但是它的内部是ring0层,rin ...

  6. 浅析调用JSR303的validate方法, 验证失败时抛出ConstraintViolationException

    废话不多说,直接进入正题:如何使用JSR303的validate,进行数据校验,失败后直接抛出异常加入流转信息中,并在form页面提示出来. 首先我们为了启用验证,需要向 项目中添加Bean验证的实现 ...

  7. Python self学习

    最开始学习Python时,用的IDE是IDEL,看的教程是<简明Python教程>,强烈推荐一下,讲得还是很不错的,适合新手学习 http://www.kuqin.com/abyteofp ...

  8. windows单节点下安装es集群

    linux下的es的tar包,拖到windows下,配置后,启动bin目录下的bat文件,也是可以正常运行的. 从linux下拷的tar包,需要修改虚拟机的内存elasticsearch.in.bat ...

  9. BZOJ 1951: [Sdoi2010]古代猪文 [Lucas定理 中国剩余定理]

    1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 2194  Solved: 919[Submit][Status] ...

  10. 通过代码配置 Log4net来实现日志记录

    通过代码来创建配置文件,优点看起来更为简洁,不过还得看需求吧,之前我博客也写了一篇通过读取不同的配置文件还实现配置不同日志类型. //记录异常日志数据库连接字符串 private const stri ...