A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 执迷不悟 于 2020-4-22 17:45 编辑

                               垃圾收集器以及内存分配

垃圾收集器包括:串行垃圾收集器、并行垃圾收集器、CMS(并发) 垃圾收集器、G1垃圾收集器。

1、串行垃圾收集器
串行垃圾收集器,是指使用单线程进行垃圾回收,垃圾回收时,只有一个线程在工作,并且java应用中所有的线程都要暂停,等待垃圾回收完成。这种现象称为STW(stop-the-world)
对于交互性比较强的应用是不能接受这种垃圾收集器。
一般在javaweb应用中是不会使用这种垃圾收集器。
1.1、设置垃圾回收为串行化收集器
在程序运行参数中添加参数,如下:
  • -XX:+UseSerialGC

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

  • -XX:+PrintGCDetails

    • 打印垃圾回收的详细信息


运行日志如下:
[Shell] 纯文本查看 复制代码
  [GC (Allocation Failure) [DefNew: 4416K->512K(4928K), 0.0046631 secs] 4416K->2070K(15872K), 0.0078718 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
  ​
  [Full GC (Allocation Failure) [Tenured: 10944K->3297K(10944K), 0.0093590 secs] 15871K->3297K(15872K), [Metaspace: 3374K->3374K(1056768K)], 0.0093969 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
GC日志信息解读:
年轻代的内存GC前后的大小:
  • (Allocation Failure)

    • 垃圾回收原因

  • DefNew

    • 表示使用串行化垃圾收集器

  • 4927K->4927K(4928K)

    • 表示年轻代GC前,占用4416k内存,GC后,占用512k内存,总大小4928k

  • 0.0046631 secs

    • 表示GC所用的时间,单位为毫秒。

  • 4416K->2070K(15872K)

    • 表示GC前,堆内存占用4416k,GC后占用2070k,总大小15872k

  • Full GC

    • 表示内存空间全部进行GC

  • Tenured

    • 老年代GC回收情况

  • Metaspace

    • 元数据空间GC回收情况


2、并行垃圾收集器
并行垃圾收集器在串行垃圾收集器的基础上做了改进,将单线程改为多线程进行垃圾回收,这样可以缩短垃圾回收的时间(这里指的是并行能力较强的机器),并行垃圾收集器,在收集过程中也会STW(暂停应用程序)
2.1、ParNew垃圾收集器
ParNew垃圾收集器是工作在年轻代上的,只是将串行的垃圾收集器修改为了并行
通过-XX:+UseParNewGC参数设置年轻代使用ParNew收集器,老年代依然使用串行化垃圾收集器
[Shell] 纯文本查看 复制代码
  #运行参数:
  -XX:+UseParNewGC -XX:+PrintGCDetails -Xms16m -Xmx16m
  ​
  #日志
  [GC (Allocation Failure) [ParNew: 4416K->512K(4928K), 0.0018376 secs] 4416K->2170K(15872K), 0.0025611 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 

2.2、ParallelGC垃圾收集器
ParallelGC收集器工作机制和ParNew垃圾收集器工作机制是一样的,只是在这个基础上添加了两个和系统吞吐量相关的参数,使用起来更加灵活和高效。
相关参数如下:
  • -XX:+UseParallelGC

    • 年轻代使用ParallelGC垃圾收集器,老年代使用串行化垃圾收集器

  • -XX:+UseParallelOldGC

    • 年轻代使用ParallelGC垃圾收集器,老年代使用ParallelOldGC垃圾收集器

  • -XX:MaxGCPauseMillis

    • 设置最大的垃圾收集时的停顿时间,单位为毫秒
    • 需要注意的时,ParallelGC为了达到设置的停顿时间,可能会调整堆大小或其他的参数,如果堆的大小设置的较小,就会导致GC工作变得很频繁,反而可能会影响到性能。
    • 该参数使用需谨慎。

  • -XX:GCTimeRatio

    • 设置垃圾回收时间占程序运行时间的百分比,公式为1/(1+n)。
    • 它的值为0~100之间的数字,默认值为99,也就是垃圾回收时间不能超过1%

  • -XX:UseAdaptiveSizePolicy

    • 自适应GC模式,垃圾回收器将自动调整年轻代、老年代等参数,达到吞吐量、堆大小、停顿时间之间的平衡。
    • 一般用于,手动调整参数比较困难的场景,让收集器自动进行调整。


[Shell] 纯文本查看 复制代码
 #参数
  ‐XX:+UseParallelGC ‐XX:+UseParallelOldGC ‐XX:MaxGCPauseMillis=100 ‐
  XX:+PrintGCDetails ‐Xms16m ‐Xmx16m
  ​
  #打印的信息
  [GC (Allocation Failure) [PSYoungGen: 4096K‐>480K(4608K)] 4096K‐
  >1840K(15872K), 0.0034307 secs] [Times: user=0.00 sys=0.00, real=0.00
  secs]
  [Full GC (Ergonomics) [PSYoungGen: 505K‐>0K(4608K)] [ParOldGen: 10332K‐
  >10751K(11264K)] 10837K‐>10751K(15872K), [Metaspace: 3491K‐
  >3491K(1056768K)], 0.0793622 secs] [Times: user=0.13 sys=0.00, real=0.08
  secs]
有以上信息可以看出,年轻代和老年代都使用了ParallelGC垃圾回收器。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马