Java虚拟机优化02

1. jvm垃圾回收

当我们运行一个程序的时候是需要向系统申请内存资源的,如果我们申请的资源不及时释放就会一直占用系统内存资源,最终将导致内存溢出,所以对内存资源的管理是非常重要了,了解jvm对内存资源的管理前我们先了解下垃圾回收常见的算法。

2. Java语言的垃圾回收

Java语言中一个显著的特点就是引入了垃圾回收机制,在C/C++语言中,没有自动垃圾回收机制,是通过new关键字申请内存资源,通过delete关键字释放内存资源。它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存。

3. 垃圾回收的常见算法

常见的垃圾回收算法有:引用计数法、标记清除法、标记压缩法、复制算法、分代算法等。

3.1. 引用计数法

引用计数法的逻辑是:假设有一个对象A,任何一个对象对A的引用,那么对象A的引用计数器+1,当引用失败时,对象A的引用计数器就-1,如果对象A的计数器的值为0,就说明对象A没有引用了,可以被回收。

优点:
(1) 实时性较高,无需等到内存不够的时候,才开始回收,运行时根据对象的计数器是否为0,就可以直接回收。

(2) 在垃圾回收过程中,应用无需挂起。如果申请内存时,内存不足,则立刻报outofmember 错误。

(3) 区域性,更新对象的计数器时,只是影响到该对象,不会扫描全部对象

缺点:
(1) 每次对象被引用时,都需要去更新计数器,有一点时间开销。

(2) 浪费CPU资源,即使内存够用,仍然在运行时进行计数器的统计。

(3) 无法解决循环引用问题。

3.2. 标记清除法

标记清除算法,是将垃圾回收分为2个阶段,分别是标记和清除。标记:从根节点开始标记引用的对象。清除:未被标记引用的对象就是垃圾对象,可以被清理。

优点:
(1) 标记清除算法解决了引用计数算法中的循环引用的问题,没有从root节点引用的对象都会被清除。

(2) 实现简单与保守式 GC 算法兼容。

缺点:
(1) 效率较低,标记和清除两个动作都需要遍历所有的对象,并且在GC时,需要停止应用程序,对于交互性要求比较高的应用而言这个体验是非常差的。

(2) 碎片化严重,通过标记清除算法清理出来的内存,碎片化较为严重,因为被回收的对象可能存在于内存的各个角落,所以清理出来的内存是不连贯的。

3.3. 标记压缩算法

标记压缩算法是在标记清除算法的基础之上,做了优化改进的算法。和标记清除算法一样,也是从根节点开始,对对象的引用进行标记,在清理阶段,并不是简单的清理未标记的对象,而是将存活的对象压缩到内存的一端,然后清理边界以外的垃圾,从而解决了碎片化的问题。

优点:
(1) 标记压缩算法,解决了标记清除算法的碎片化的问题。

缺点:
(1) 标记压缩算法多了一步,对象移动内存位置的步骤,其效率也有有一定的影响。

3.4. 复制算法

复制算法的核心就是,将原有的内存空间一分为二,每次只用其中的一块,在垃圾回收时,将正在使用的对象复制到另一个内存空间中,然后将该内存空间清空,交换两个内存的角色,完成垃圾的回收。如果内存中的垃圾对象较多,需要复制的对象就较少,这种情况下适合使用该方式并且效率比较高,反之,则不适合。

当有效内存空间耗尽时,JVM将暂停程序运行,开启复制算法GC线程。接下来GC线程会将活动区间内的存活对象,全部复制到空闲区间,且严格按照内存地址依次排列,与此同时,GC线程将更新存活对象的内存引用地址指向新的内存地址。

JVM中的年轻代就使用了复制算法:
1、在GC开始的时候,对象只会存在于Eden区和名为“From”的Survivor区,Survivor区“To”是空的。

2、紧接着进行GC,Eden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。

3、经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区域是空的。

4、GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满之后,会将所有对象移动到年老代中。


优点:
(1) 复制算法弥补了标记/清除算法中,内存布局混乱的缺点。

(2) 在垃圾对象多的情况下,效率较高。

缺点:
(1) 分配的2块内存空间,在同一个时刻,只能使用一半,内存使用率较低。

(2) 在垃圾对象少的情况下,不适用,如:老年代内存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值