前两篇写的都是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. CSS深入理解学习笔记之relative

    1.relative和absolute的相煎关系 限制作用:①限制left/top/right/bottom定位:②限制z-index层级:③限制在overflow下的嚣张气焰. relative和f ...

  2. iOS 组件化 —— 路由设计思路分析

    原文 前言 随着用户的需求越来越多,对App的用户体验也变的要求越来越高.为了更好的应对各种需求,开发人员从软件工程的角度,将App架构由原来简单的MVC变成MVVM,VIPER等复杂架构.更换适合业 ...

  3. 豹哥嵌入式讲堂:ARM知识概要杂辑(2)- 第一款Cortex-M处理器

    1.天生荣耀:ARM Cortex-M处理器由来 ARM公司自2004年推出ARMv7内核架构时,摒弃了以往"ARM+数字"这种处理器命名方法(ARM11之前的处理器统称经典处理器 ...

  4. Linux中的shell到底是什么

    (引自:https://zhidao.baidu.com/question/557066905.html) [一] shell的含义: 首先shell的英文含义是"壳": 它是相对 ...

  5. svn一整套使用,从下载到整个服务器搭建完成的详细说明

    SVN服务器的本地搭建和使用 Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上 ...

  6. [DeeplearningAI笔记]Batch NormalizationBN算法Batch归一化_02_3.4-3.7

    Batch Normalization Batch归一化 觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.4正则化网络的激活函数 Batch归一化会使你的参数搜索问题变得很容易,使神经网络 ...

  7. 备忘:java在cmd中编译运行

    防止每次用的时候都想不起来 1.进入.java文件所在的路径 (cls清除控制台的命令) 2.javac编译 javac -d . demo1.java javac demo1.java 如所编译的文 ...

  8. JMeter基础教程2:正则表达式使用

    0. 正则表达式简介 正则表达式,又称规则表达式(Regular Expression,在代码中通常简写为regex.regexp或RE)描述了一种字符串匹配的模式(pattern),可以用来检查一个 ...

  9. 关于HTML的两个实例

    例子一:使用HTML语言编写一个菜单 代码如下: <!DOCTYPE html> <html> <head lang="en"> <met ...

  10. CentOS 6.3 SSH连接时很慢的解决方法

    SSH的配置文件,默认开启了DNS反向解析,这使得处于同一个局域网下的终端,在SSH到服务器的时候异常缓慢,如果从是外网SSH到服务器的话,速度则是正常的.我们只需要关闭DNS反向解析即可. 修改/e ...