JVM垃圾收集器以及内存分配

本文深入探讨JVM中的各种垃圾收集器,包括串行、并行、CMS及G1收集器的工作原理与应用场景,特别关注串行和并行垃圾收集器的特性,以及如何通过参数设置优化垃圾回收过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述
  在JVM中,实现了多种垃圾收集器,包括:串行垃圾收集器,并行垃圾收集器,CMS(并发)垃圾收集器,G1垃圾收集器;
1.串行垃圾收集器
  串行(Serial)垃圾收集器,是指使用单线程进行垃圾回收,垃圾回收时,只有一个线程在工作,并且java应用中的所有线程都要暂停,等待垃圾回收的完成。这种现象称之为STW
  对于交互性较强的应用而言,这种垃圾收集器是不能够接受的;
  一般在javaweb应用中是不会采用该 收集器的;
1.1 编写测试代码

public class Test01GC {
public static void main(String[] args) throws InterruptedException {
    List<Object> list=new ArrayList<Object>();
    while(true){
        int sleep=new Random().nextInt(100);
        if (System.currentTimeMillis()%2==0){
            list.clear();
        }else{
            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);
    }
}
}

1.2 设置垃圾回收为串行收集器

-XX:+UseSerialGC -XX:+PrintGCDetails -Xms16m -Xmx16m
    -XX:+UseSerialGC

指定年轻代和老年代都是用串行垃圾收集器

-XX:+PrintGCDetails

打印垃圾回收的详细信息

-Xms16m -Xmx16m

将堆的初始和最大内存都设置为16M
启动程序后,查看控制台输出的信息:
GC日志信息解读:
  年轻代的内存GC前后的大小:

DefNew:表示使用的是串行垃圾收集器

4416K->512K(4928K):表示年轻代GC前,占有4416K内存,GC后,占有512K内存,总大小4928K

0.0040300 secs:表示GC所用的时间,单位为毫秒

9962K->7977K(15872K):表示GC前,堆内存占有9962K;GC后,占有7977K,总大小为15872K

Full GC:表示,内存空间全部进行GC

1.3 Serial Old收集器
Serial收集器的老年代版本,它同样是一个单线程收集器;

它的主要两大用途:

1.在jdk1.5以及以前的版本中与Parallel Scavenge收集器搭配使用;

2.作为CMD收集器的后备方案;

2.并行垃圾收集器
  并行垃圾收集器在串行垃圾收集器的基础之上做了改进,将单线程改为了多线程垃圾回收,这样可以缩短垃圾回收的时间(这里是指,并行能力较好的机器);

当然,并行垃圾收集器在收集的过程中也会暂停应用程序,这个和串行垃圾回收器是一样的,只是并行执行,速度更快些,暂停的时间更短一些;

2.1 ParNew垃圾收集器
    ParNew垃圾收集器是工作在年轻代上的,只是将串行的垃圾收集器改为了并行;

通过-XX:+UseParNewGC参数设置年轻代使用ParNew回收器,老年代使用的依然是串行收集器;

测试:

-XX:+UseParNewGC -XX:+PrintGCDetails -Xms16m -Xmx16m

控制台输出信息:

可以看出ParNew:使用的是ParNew收集器。其他信息和串行收集器一致;

2.2 ParallelGC垃圾收集器
    ParallelGC收集器工作机制和ParNewGC收集器一样,只是在基础之上,新增了两个和系统吞吐量相关的参数,使得其使用起来更加灵活和高效;
    测试:

-XX:+UseParallelGC -XX:+UseParallelOldGC -XX:MaxGCPauseMillis=100 -XX:+PrintGCDetails -Xms16m -Xmx16m

参数说明:

-XX:+UseParallelGC

年轻代使用ParallelGC垃圾回收期,老年代使用串行回收器;

-XX:+UseParallelOldGC

年轻代使用ParallelGC垃圾回收期,老年代使用ParallelOldGC垃圾回收器;

-XX:MaxGCPauseMillis

设置最大的垃圾收集时的停顿时间,单位为毫秒;

需要注意的是,ParallelGC为了达到设置的停顿时间,可能会调整堆大小或其他的参数,如果堆的大小设置的较小,就会导致GC工作变得很频繁,反而可能会影响性能;

带参数使用需谨慎;

-XX:GCTimeRatio

设置垃圾回收时间啊占程序运行时间的百分比,公式为1/(1+n);

它的值为0~100之间的数字,默认值为99,也就是垃圾回收时间不能超过1%;

-XX:UseAdptiveSizePolicy

自适应GC模式,垃圾回收器将自动调整年轻代,老年代等参数,达到吞吐量,堆大小,停顿时间之间的平衡;

一般用于,手动调整参数比较困难的场景,让收集器自动进行调整;

控制台输出信息:

以上信息可以看出,年轻代和老年代都使用了ParallelGC垃圾回收器;

2.3 Parallel Scavenge收集器
    Parallel Scavenge收集器类似于ParNew收集器;
    Parallel Scavenge收集器关注点是吞吐量(高效率的利用CPU)。CMS等垃圾收集器的关注点更多的是用户线程的停顿时间(提高用户体验)。所谓吞吐量就是CPU中用于运行用户代码的时间与CPU总消费耗时的比值。Parallel Scavenge收集器提供了很多参数供用户找到最合适的停顿时间或最大吞吐量,如果对于收集器运行不大了解的话,手工优化存在的话可以选

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值