本帖最后由 执迷不悟 于 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)
0.0046631 secs
4416K->2070K(15872K)
Full GC
Tenured
Metaspace
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垃圾收集器工作机制是一样的,只是在这个基础上添加了两个和系统吞吐量相关的参数,使用起来更加灵活和高效。 相关参数如下: [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垃圾回收器。
|