CLR 和 JVM 自动垃圾回收管理异同

2 篇文章 0 订阅
1 篇文章 0 订阅

 

 

本文属于原创,转载请加上链接以及博主名字

请尊重别人的劳动成果

 

 

       公司开始从Windows net  SQLSERVER架构系统往Linux Java MySQL 转型,这样转化完成后,公司能在技术上能有更多的积累,并且It运营成本也会大量降低。这样做后本人也从一个Net工程师转为了Java工程师。

       到今天接触Java也快一年了,对于Net和Java自己心里也有一些比较,先从虚拟机的自动垃圾回收机制开始聊吧。

 虚拟机类型

       Java的虚拟机比较多,接下来讨论的都是基于Hotspot为参照点

       Net的,在windows环境下,也就简单了,一种选择,别无他求。

垃圾对象的判定算法:   

 两者对托管堆中垃圾对象的认定算法是一致的,均采用根引用算法(根搜索算法)。

 简单的说,当一个对象没有被根节点所引用时,就会被认定为垃圾对象将被回收。

垃圾对象的清理算法

  分区的思路:

  Net 分成三块区域: 0代,1代,2代。

  Java 分成:young generation(Eden,Survivor*2),tenured generation,permanet generation

  对象大小区分:

    Net 认为的大对象为大于85000byte,存放在2代,LOH中。

Java是可调的,走得是PretenureSizeThreshold配置,存放在tenured space中。

  垃圾回收机制

  Net:

  分别为0、1、2.在CLR初始化时,会选择为三代设计不同的阈值容量,GC收集器也会运行时自动调节其阈值容量来提升执行效率。

    CLR初始化后,首先被添加到托管堆中的对象都被定为第0代。当有垃圾回收执行时,未被回收的对象代龄将提升一级,变成第1代对象,而后新建的对象仍为第0代对象。代龄越小,表示对象越新,通常情况下其生命周期也越短,因此垃圾收集器总是首先收集第0代的不可达对象内存。

    随着对象的不断创建,垃圾收集再次启动时则只会检查0代对象,并回收0代垃圾对象。而1代对象由于未达到预定的1代容量阈值,则不会进行垃圾挥回收操作,从而有效的提高了垃圾收集的效率,这就是代龄机制在垃圾回收中的性能优化作用。

    当第0代对象释放的内存不足以创建新的对象,同时第1代对象的体积也超出了容量的阈值时,垃圾收集器将同时对0代和1代对象进行垃圾回收。之后未被回收的1代对象将升级为2代对象,未被回收的0代对象升级为1代对象,而后新建的对象依然为0代对象。

  Java:

       将不同生命周期的对象放在不同区域里:young generation,tenured generation和permanet generation。

  绝大部分的objec被分配在young generation(生命周期短),并且大部分的会在这里释放。

  当young generation满了之后,将引发minor collection(YGC)。

  在minor collection后存活的object会被移动到tenured generation(生命周期比较长)。

  最后,tenured generation满之后触发major collection。

  major collection(Full gc)会触发整个heap的回收,包括回收young generation。

  permanet generation区域比较稳定,主要存放classloader信息。

       young generation有eden、2个survivor 区域组成。

  其中一个survivor区域一直是空的,是eden区域和另一个survivor区域在下一次copy collection后活着的对象的目的地。

  object在survivo区域被复制直到转移到tenured区。

       我们要尽量减少 Full gc 的次数(tenured generation 一般比较大,收集的时间较长,频繁的Full gc会导致应用的性能收到严重的影响

      从以上几点看出,Net,Java对于垃圾回收管理,大方向的做法其实是一致的,对托管堆分区,对每个区采用不同回收阀值,控制回收次数,减少对Cpu的占用。

       Net趋向于简单使用,一些阀值,每个代龄的大小,都按照经验数据做出最高性能设置,做到让使用者最简单的使用。

       Java趋向于半定制型,对于各分区大小的控制,阀值的控制,回收算法的微调等等全部开放配置,提供给使用者管理。

        两种不同的管理策略,各有优缺点。 然而对于一个专业使用人员更喜欢Open。 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值