前两篇写的都是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. RocketMQ-事务消费

    理论部分在https://www.jianshu.com/p/453c6e7ff81c中的 "三.事务消息".下面从代码层面看一下rockemq的事务消息 一.事务消费端. 从代码 ...

  2. CentOS7.x机器安装Azure CLI2.0

    安装Azure CLI 2.0的前提是:机器中必须有 Python 2.7.x 或 Python 3.x.如果机器中没有其中任何一个Python的版本,请及时安装 1.准备一台CentOS 7.3的机 ...

  3. 腾讯工程师带你深入解析 MySQL binlog

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 本文由 腾讯云数据库内核团队 发布在云+社区 1.概述 binlog是Mysql sever层维护的一种二进制日志,与innodb引擎中的red ...

  4. sed 变量替换和Linux的特殊符号大全

    1 sed支持两种方式的变量替换,建议使用下面的第二种,比较简单 这样就可以给变量a赋值很多特殊字符了,比如 赋值a='!@#¥%……' sed -n 's/echo/'"$a"' ...

  5. linkin大话数据结构--泛型

    泛型(Generic) 什么是泛型? java5开始出现的一种对Java语言类型的一种拓展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数类型时指定的类型占位符,就好比方法的形式参数 ...

  6. linux下ftp命令的安装与使用

    注意:实际使用时可以直接尝试第5步,如果提示找不到ftp命令,再进行第4步安装,如安装失败再进行第1步,然后顺序执行即可 1. 下载rpm文件 例如:ftp-0.17-51.1.el6.x86_64. ...

  7. 错误:This function has none of DETERMINISTIC... 的解决

    问题: 在MySQL创建了一个批量插入的存储过程,在代码中调用的时候报错误信息: error code [1418];This function has none of DETERMINISTIC, ...

  8. Django环境安装--Django从入门到精通系列教程

    该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...

  9. Linux安装JDK、MySQL和Tomcat

    1 依赖的安装 因为JDK.Tomcat和MySQL的安装过程中需要从网上下载部分支持包才可以继续,所以需要提前安装好依赖. yum install glibc.1686 yum -y install ...

  10. 【转】awk 里的substr函数用法举例

    awk 里的substr函数用法举例: 要截取的内容:2007-08-04 04:45:03.084 - SuccessfulTradeResult(status: 1, currencyPair: ...