试着把.net的GC讲清楚(3)
前两篇写的都是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)的更多相关文章
- 试着把.net的GC讲清楚(1)
什么是GC? GC(garbage collection)是对内存管理中回收已经不用的内存的一种机制,我们熟知的java和.net都有自己的GC机制,是内存管理的一部分. 为什么会有GC呢?是因为动态 ...
- 试着把.net的GC讲清楚(2)
试着把.net的GC讲清楚(1) 上篇文章说了一些基本概念的东西,然后还有很多东西概念没有头绪,这篇文章我试着解释 GC的回收算法详细步骤? 上篇]文章讲了.net GC的算法是Mark and Co ...
- 《你不知道的JavaScript下卷》知识点笔记
1. [1, 2, 3] == [1, 2, 3] 返回false [1, 2, 3] == “1, 2, 3” 返回true 2. 如果 < 比较的两个值都是字符串, 就像在b < c中 ...
- 试着讲清楚:js代码运行机制
一. js运行机制 js执行引擎 经常看文章的说到js是带线程的,其实这个说法非常的模糊,准确的是js执行引擎是单线程的,js执行引擎就是js代码的执行器,有了这个概念就可以下来说说js是如何运行的了 ...
- 深入浅出聊优化:从Draw Calls到GC
前言: 刚开始写这篇文章的时候选了一个很土的题目...<Unity3D优化全解析>.因为这是一篇临时起意才写的文章,而且陈述的都是既有的事实,因而给自己“文(dou)学(bi)”加工留下的 ...
- PHP新的垃圾回收机制:Zend GC详解
概述 在5.2及更早版本的PHP中,没有专门的垃圾回收器GC(Garbage Collection),引擎在判断一个变量空间是否能够被释放的时候是依据这个变量的zval的refcount的值,如果re ...
- GitHub上那些值得一试的JAVA开源库--转
原文地址:http://www.jianshu.com/p/ad40e6dd3789 作为一名程序员,你几乎每天都会使用到GitHub上的那些著名Java第三方库,比如Apache Commons,S ...
- 转:面试题:“你能不能谈谈,java GC是在什么时候,对什么东西,做了什么事情?”
转自:http://jeromecen1021.blog.163.com/blog/static/18851527120117274624888/ 面试题目: 地球人都知道,Java有个东西叫垃圾收集 ...
- 优化 从Draw Calls到GC
原文出处: 慕容小匹夫的博客(@慕容小匹夫) 欢迎分享原创到伯乐头条 前言: 刚开始写这篇文章的时候选了一个很土的题目...<Unity3D优化全解析>.因为这是一篇临时起意才写的文章 ...
随机推荐
- javascript对象的标签
[[proto]]标签 [[class]]标签 [[class]] 标签,代表这对象是哪个类型的.在js中不能直接访问到.可以通过Object.prototype.toString.call(obj) ...
- linux_RAID
什么是RAID? 磁盘阵列,把多个磁盘组合成一个磁盘组,在逻辑上看起来就是一块大的磁盘,提供单个物理磁盘的存储量和更高的存储性能,同时提供不同级别的冗余备份的一种技术,不同的RAID技术对应不同级别 ...
- junit源码解析总结
前面的博客我们也已经整理到了,我们使用junit38,在写测试类的时候我们的测试类必须继承TestCase.这个所有测试类的父类在junit.framework包下面. 前面我们的整理都是说直接在ID ...
- JAVA学习,是一条漫长的道路
我在Java 1.0正式问世前就开始学习Java,这么多年过去了,到现在我的Java学习历程还没有停过.我阅读原文书,研究原始码,撰写程序,自认为走得扎实,不奢望一步登天.像我这样老式的学习方式,显然 ...
- struts2 添加请求后缀的3种方式
第一种方式在struts.xml文件中添加 <constant name="struts.action.extension" value="">&l ...
- 手机文件夹的emulated什么意思
词典翻译是仿真,就是自带的存储卡, 手机的储存方式有两种,一种是手机内存 ,一种是SD卡内存.
- SEO—Meta标签优化
Meta标签之一"标题": 标题是网站中很重要的一个标签,他在搜索引擎中是直接显示出来的,一般情况下要网站的核心关键词和网站名称都写进去,这样更有利于网站的排名.但是要注意标题的长 ...
- maps.reg
^/(.*\.miaopai.com/stream/.*\.mp4\?.*) http://$1 ^/([[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{ ...
- 淘宝地址爬取及UI展示
淘宝地址爬取及UI展示 淘宝国家省市区街道获取 参考 foxiswho 的 taobao-area-php 部分代码,改由c#重构. 引用如下: Autofac MediatR Swagger Han ...
- TensorflowTutorial_二维数据构造简单CNN
使用二维数据构造简单卷积神经网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 图像和一些时序数据集都可以用二维数据的形式表现,我们此次使用随机分布的二位数据构造一个简单的CNN-网络卷积- ...