JVM优化之串行垃圾收集器与并行垃圾收集器

  在JVM中实现了多种垃圾收集器如串行垃圾收集器,并行垃圾收集器,GMS(并发)垃圾收集器,G1垃圾收集器

串行垃圾收集器

串行垃圾收集器是在使用单线程进行垃圾回收,垃圾回收时只有一个线程在工作,并且java中所有的线程都要停止工作等待垃圾回收完成,对于交互比较强的的应用串行垃圾收集器不适用,一般javaWeb应用 不会使用这种垃圾收集器下面使用代码来测试一下


public class testGC {
    //不断的产生新的对象,随机的废弃对象创造垃圾对象
    public static void main(String[] args) throws Exception {

        ArrayList<Object> list = new ArrayList<Object>();
        while (true){
            //
            int sleep = new Random().nextInt(100);
            if(System.currentTimeMillis() % 2 ==0){
                //100以内如果是偶数,就将list清空(在调用clear的时候内部是将list对象指向null,指向null 就变成了垃圾对象,在做GC回收的时候会将垃圾对象回收)
                list.clear();
            }else{
                //如果不是垃圾对象就向list 对象中添加10000个对象
                for (int i = 0; i < 10000; i++) {
                    Properties properties = new Properties();
                    properties.put("key_"+i, "value_" + System.currentTimeMillis() + i);
                    list.add(properties);
                }
            }
            //随机的停顿,模拟垃圾收集的时候回暂停应用(因为在做垃圾回收的时候回暂停应用)
            Thread.sleep(sleep);
        }
    }

运行main 方法,设置运行参数如下:
为了测试方便在参数中将最大堆内存-Xmx和初始化堆内存-Xms 都设置为16M
在这里插入图片描述
参数含义:
-XX:+UseSerialGC 指定年轻代和老年代都使用串行垃圾收集器
-XX:+PrintGCDetails 打印垃圾回收的详细信息

启动程序  后控制台信息如下
[GC (Allocation Failure) [DefNew: 4927K->511K(4928K), 0.0033775 secs] 9849K->6242K(15872K), 0.0034238 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (Allocation Failure) [Tenured: 10943K->10943K(10944K), 0.0342008 secs] 15871K->14382K(15872K), [Metaspace: 3807K->3807K(1056768K)], 0.0342910 secs] [Times: user=0.05 sys=0.00, real=0.04 secs] 



DefNew:表示使用串行垃圾收集器,**在jvm优化的时候如果发现web应用使用串行垃圾收集器就不正确 这是一个优化的点**
4927K->511K(4928K)  :4927k表示年轻代GC前占用4927k内存,511代表GC后占用内存511k,总大小4928k
0.0034238 secs表示GC使用的时间 (毫秒)
9849K->6242K(15872K): 表示堆内存有9849k,GC后占有6242k总大小15872k'
Full GC  表示,内存空间全部进行GC

并行垃圾收集器:(一般指的是并行能力强的机器,对于并行能力差的机器几乎没有效果)并行垃圾收集器在串行垃圾收集器的基础之上做了改进,将单线程改成了多线程进行垃圾回收,这样可以缩短垃圾回收的时间,但是并行垃圾收集器在收集的过程中也会暂停应用程序,和串行垃圾收集器一样只不过是并行速度更快暂停时间更短
ParNew垃圾收集器
同样的测试程序修改如下配置
在这里插入图片描述

[GC (Allocation Failure) [ParNew: 4928K->512K(4928K), 0.0076860 secs] 12096K->10152K(15872K), 0.0077370 secs] [Times: user=0.03 sys=0.00, real=0.01 secs] 
打印信息中 ParNew  指的是使用ParNew垃圾收集器,其他日志与上一致,使用并行垃圾收集器的时候,垃圾回收时间要比串行的要少(这里日志没有截取完整)

ParallelGC垃圾收集器

ParallelGC收集器工作机制和ParNewGC收集器一样,只是在此基础之上,新增了两个和系统吞吐量相关的参数使用起来更加的灵活,修改如下配置
在这里插入图片描述

-XX:+UseParallelGC 
    年轻代使用ParallelGC垃圾回收器,老年代使用串行回收器
-XX:+UseParallelOldGC 
    年轻代使用ParallelGC垃圾回收器,老年代使用ParallelOldGC垃圾回收器。
 -XX:MaxGCPauseMillis
 设置最大的垃圾收集时的停顿时间,单位为毫秒
      **需要注意的时,ParallelGC为了达到设置的停顿时间,可能会调整堆大小或其他的参数,如果堆的大小设置的较小,就会导致GC工作变得很频繁,反而可能会影响到性能**
-XX:GCTimeRatio
设置垃圾回收时间占程序运行时间的百分比,公式为1/(1+n)。
它的值为0~100之间的数字,默认值为99,也就是垃圾回收时间不能超过1%
-XX:UseAdaptiveSizePolicy
自适应GC模式,垃圾回收器将自动调整年轻代、老年代等参数,达到吞吐量、堆大小、停顿时间之间的
平衡。
一般用于,手动调整参数比较困难的场景,让收集器自动进行调整。


以上参数来之百度整理

在这里插入图片描述
在日志中可以看到年轻代和老年代都使用了ParallelGC垃圾回收器,在一定程度上提高效率

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值