JVM垃圾回收(二)

垃圾收集器以及内存分配

上一篇说了垃圾回收的算法,还需要有具体的实现,在JVM中,实现了多种垃圾收集器。包括:串行垃圾收集器、并行垃圾收集器、CMS(并发)垃圾收集器、G1垃圾收集器等。

1、串行垃圾收集器

串行垃圾收集器,是指使用单线程进行垃圾回收,垃圾回收时,只有一个线程在工作,并且java应用程序中的所有线程都要暂停,等待垃圾回收
的完成。这种现象称之为STW(Stop-The-World)。

对于交互性比较强的应用而言,这种垃圾收集器是不能够接受的。
一般在JavaWeb应用中是不会采用该垃圾收集器的。

1.1、编写测试代码

下面代码实现了一个垃圾收集的过程,在while循环中,当当前毫秒值为偶数的时候,清空list,否则就往list中添加10000个对象,每次休息随机的时间。

import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.Random;

public class TestGC {

    public static void main(String[] args) throws InterruptedException {
        List<Object> list = new ArrayList<>();
        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);
        }
    }
}
运行前需要设置一下运行参数:-XX:+UseSerialGC -XX:+PrintGCDetails -Xms16m -Xmx16m

参数说明:
-XX:+UseSerialGC 指定年轻代和老年代都是用串行垃圾收集器
-XX:+PrintGCDetails 打印垃圾回收的详细信息
后面两个参数不知道的同学可以看看JVM调优之-Xms与-XmX参数
在这里插入图片描述
运行程序之后,会看到控制台打印出这样的信息:
[GC (Allocation Failure) [DefNew: 4416K->512K(4928K), 0.0173859 secs] 4416K->2069K(15872K), 0.0175216 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]

[Full GC (Allocation Failure) [Tenured: 10943K->10943K(10944K), 0.0325300 secs] 15871K->14397K(15872K), [Metaspace: 3750K->3750K(1056768K)], 0.0325963 secs] [Times: user=0.03 sys=0.00, real=0.03 secs]
打印出来的信息就是垃圾回收的过程。

Allocation Failure   表明垃圾回收的原因,分配资源失败
DefNew               表明使用的是线性垃圾收集器
4416K->512K(4928K)   表明,年轻代在GC前,占有4416K内存,GC后,占有512K内存,总大小4928K内存
0.0173859            表明,GC所用的时间,单位是毫秒
4416K->2069K(15872K) 表明,GC前,堆内存占有4416K内存,GC后,占有2069K内存,总大小15872K内存
Full GC              表示,内存空间全部进行GC

2、并行垃圾收集器

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

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

2.1、ParNew垃圾收集器

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

通过-XX:+UseParNewGC参数设置年轻代使用ParNew回收器,老年代使用的依然是串行收集器。
在这里插入图片描述
打印信息:
[GC (Allocation Failure) [ParNew: 4416K->511K(4928K), 0.0089734 secs] 4416K->2053K(15872K), 0.0091379 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]

由打印信息可以看到,ParNew:使用的是ParNew收集器,其他信息和串行收集器的一致。

2.2、ParallelGC垃圾收集器

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

相关参数:

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

我们来修改参数运行一下代码,参数:

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

在这里插入图片描述
打印出来的输出为:
[GC (Allocation Failure) [PSYoungGen: 4096K->480K(4608K)] 4096K->1961K(15872K), 0.0078388 secs] [Times: user=0.01 sys=0.02, real=0.01 secs]

[Full GC (Ergonomics) [PSYoungGen: 1490K->0K(3584K)] [ParOldGen: 8280K->5616K(11264K)] 9770K->5616K(14848K), [Metaspace: 3744K->3744K(1056768K)], 0.0615469 secs] [Times: user=0.23 sys=0.00, real=0.06 secs]

从第一行可以看到,年轻代使用了ParallelGC垃圾收集器,从第二行可以看到,老年代使用了ParallelOldGC垃圾收集器。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值