JavaGC算法

想要做好JVM参数调优,是需要对GC的机制以及算法有所了解,掌握GC原理后根据具体的需求对JVM进行优化,可以有效减少GC的次数,从而提高程序的效率。

为什么要GC的次数多了会影响性能呢,因为每当GC执行是,所有的线程将会被暂停,这个暂停就是导致性能降低的关键因素,而且GC本身运行也是消耗资源的。

垃圾回收的任务是识别和回收垃圾对象进行内存清理,为了让垃圾回收器可以更高效的执行,大部分情况下,会要求系统进如一个停顿的状态。停顿的目的是为了终止所有的应用线程,只有这样的系统才不会有新垃圾的产生。同时停顿保证了系统状态在某一个瞬间的一致性,也有利于更好的标记垃圾对象。因此在垃圾回收时,都会产生应用程序的停顿。

每种GC算法都有各自的优缺点,以下列举的几个算法:

分代收集算法

根据内存中对象的存活周期不同,将内存划分为几块,java的虚拟机中一般把内存划分为新生代和年老代,当新创建对象时一般在新生代中分配内存空间,当新生代垃圾收集器回收几次之后仍然存活的对象会被移动到年老代内存中,当大对象在新生代中无法找到足够的连续内存时也直接在年老代中创建。
对于新生代和老年代来说,新生代回收频率很高,但是每次回收耗时很短,而老年代回收频率较低,但是耗时会相对较长,所以应该尽量减少老年代的GC。

引用计数算法

给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器都为0的对象就是不再被使用的,垃圾收集器将回收该对象使用的内存。

优点

引用计数收集器可以很快的执行,交织在程序运行中。对程序需要不被长时间打断的实时环境比较有利。

缺点

无法检测出循环引用。如父对象有一个对子对象的引用,子对象反过来引用父对象。这样,他们的引用计数永远不可能为0.而且每次加减非常浪费内存。

标记清除法

标记-清除(Mark-Sweep)算法顾名思义,主要就是两个动作,一个是标记,另一个就是清除。
标记就是根据特定的算法(如:引用计数算法,可达性分析算法等)标出内存中哪些对象可以回收,哪些对象还要继续用。
标记指示回收,那就直接收掉;标记指示对象还能用,那就保留在原先的内存地址不变。

缺点

  • 标记与清除效率低。
  • 清除之后内存会产生大量碎片,还需要有住啊们的清理随便的算法对这些随便进行处理,进一步的消耗资源。

复制算法

复制算法是使用在新生代中的垃圾回收算法。

jvm的内存结构中,将堆内存分为了新生代和老年代两个部分。创建出的对象(如:new 出的对象)会先进入新生代,如果该对象多次(JVM默认是15次)GC后未被回收,则会将对象转存到老年代。可以理解为,新生代存储的是使用后很快就会被回收的对象,老年代存储的是长期在使用的对象。

将可用内存按容量分成大小相等的两块,每次只使用其中一块,当这块内存使用完了,就将还存活的对象复制到另一块内存上去,然后把使用过的内存空间一次清理掉。

形象一点的比喻:
就好比如,将一块硬盘分成D盘和E盘两个分区,每次只使用一个分区,比如先使用D盘,使用一段时间以后当需要做磁盘清理的时候,就将D盘中需要保留的文件拷贝到E盘中,然后再将D盘格式化(很霸道,很粗暴,但是清理的很干净)。在下一次清理之前,一直都是使用E盘,直到清理E盘以后,又回到使用D盘,如此的循化。总结就是两个步骤 复制 和 格式化(清除)

优点

每次都是对其中一块内存进行回收,内存分配时不用考虑内存碎片等复杂情况,只需要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。

缺点

因为将内存划分成了两块一样大大小,所有可使用的内存降为原来一半。

标记压缩算法

标记压缩算法是使用在老年代中的垃圾回收算法。

标记压缩算法,是在标记清除法之上进行了优化。执行完标记以后,

  • 1.先将存活的对象压缩到了内存的一端,被标记要清除的对象压缩到内存的另外一端。
  • 2.如此一来,所有存活的对象的内存地址是连续的,将被清除的对象内存地址也是连续的,就好像一根绳子被划分成了两个部分一样。
  • 3.将所有要被清除的对象的地址全部释放。

优点

  • 不会留下碎片,所有的对象存储具有连续性。
  • 清理的算法简单,执行效率高。

标记压缩算法 与 复制算法 非常的相识,但是却完全不一样。区别在于,复制算法会将内存分为两个相等的块,而标记压缩算法则没有将内存分块。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值