前言
2022 10/13 13:32
路漫漫其修远兮,吾将上下而求索
本文是根据尚硅谷学习所做笔记
仅供学习交流使用,转载注明出处
推荐
7.怎么查看服务器默认的垃圾收集器是那个?生产上如何配置垃圾收集器的?谈谈你对垃圾收集器的理解?
说明
本文目录前是相关视频的名字和具体视频中思维导图的名字
题目
7.怎么查看服务器默认的垃圾收集器是那个?
生产上如何配置垃圾收集器的?
谈谈你对垃圾收集器的理解?
怎么查看默认的垃圾收集器是那个?
```java E:\IdeaProjects\JavaMS\second_2\src\jvm2>java -XX:+PrintCommandLineFlags -version -XX:InitialHeapSize=123581248 -XX:MaxHeapSize=1977299968 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedO ops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC java version "1.8.0_60" Java(TM) SE Runtime Environment (build 1.8.0_60-b27) Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)
移动到最后一句,就能看到 -XX:+UseParallelGC 说明使用的是并行垃圾回收
-XX:+UseParallelGC
默认的垃圾收集器有哪些?
- Java中一共有7大垃圾收集器
UseSerialGC:串行垃圾收集器 - UseParallelGC:并行垃圾收集器
- UseConcMarkSweepGC:(CMS)并发标记清除
- UseParNewGC:年轻代的并行垃圾回收器
- UseParallelOldGC:老年代的并行垃圾回收器
- UseG1GC:G1垃圾收集器
- UseSerialOldGC:串行老年代垃圾收集器(已经被移除)
底层源码
package gc7; /** * @author CSDN@日星月云 * @date 2022/10/13 13:40 * -XX:+UseSerialGC */ public class HelloGC { public static void main(String[] args) throws InterruptedException { System.out.println("HelloGC"); Thread.sleep(Integer.MAX_VALUE); } }
E:\IdeaProjects\JavaMS\second_2\src\jvm2>jinfo -flag UseSerialGC 19920 -XX:+UseSerialGC E:\IdeaProjects\JavaMS\second_2\src\jvm2>jinfo -flag UseParallelGC 19920 -XX:-UseParallelGC
默认
E:\IdeaProjects\JavaMS\second_2\src\jvm2>jinfo -flag UseParallelGC 19340 -XX:+UseParallelGC E:\IdeaProjects\JavaMS\second_2\src\jvm2>jinfo -flag UseSerialGC 19340 -XX:-UseSerialGC
垃圾收集器
新生代使用的:
Serial Copying: UserSerialGC,串行垃圾回收器
Parallel Scavenge:UserParallelGC,并行垃圾收集器
ParNew:UserParNewGC,新生代并行垃圾收集器
老年区使用的:
Serial Old:UseSerialOldGC,老年代串行垃圾收集器
Parallel Compacting(Parallel Old):UseParallelOldGC,老年代并行垃圾收集器
CMS:UseConcMarkSwepp,并行标记清除垃圾收集器
各区都能使用的:
G1:UseG1GC,G1垃圾收集器
垃圾收集器就来具体实现这些GC算法并实现内存回收,不同厂商,不同版本的虚拟机实现差别很大,HotSpot中包含的收集器如下图所示:
部分参数预先说明
- DefNew:Default New Generation
- Tenured:Old
- ParNew:Parallel New Generation
- PSYoungGen:Parallel Scavenge
- ParOldGen:Parallel Old Generation
Server/Client模式分别是什么意思
- 使用范围:一般使用Server模式,Client模式基本不会使用
- 操作系统
32位的Window操作系统,不论硬件如何都默认使用Client的JVM模式 - 32位的其它操作系统,2G内存同时有2个cpu以上用Server模式,低于该配置还是Client模式
- 64位只有Server模式
新生代
串行GC(Serial)/(Serial copying)
串行GC(Serial)(Serial Copying)
是一个单线程单线程的收集器,在进行垃圾收集时候,必须暂停其他所有的工作线程直到它收集结束。
串行收集器是最古老,最稳定以及效率高的收集器,只使用一个线程去回收但其在垃圾收集过程中可能会产生较长的停顿(Stop-The-World 状态)。 虽然在收集垃圾过程中需要暂停所有其它的工作线程,但是它简单高效,对于限定单个CPU环境来说,没有线程交互的开销可以获得最高的单线程垃圾收集效率,因此Serial垃圾收集器依然是Java虚拟机运行在Client模式下默认的新生代垃圾收集器
对应JVM参数是:-XX:+UseSerialGC
开启后会使用:Serial(Young区用) + Serial Old(Old区用) 的收集器组合
表示:新生代、老年代都会使用串行回收收集器,新生代使用复制算法,老年代使用标记-整理算法
-Xms10m -Xmx10m -XX:PrintGCDetails -XX:+PrintConmandLineFlags -XX:+UseSerialGC
package gc7; import java.util.Random; /** * @author CSDN@日星月云 * @date 2022/10/13 14:11 * * 1 * -Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseSerialGC (DefNew+Tenured) * * 2 * -Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseParNewGC (ParNew+Tenured) * 备注情况:Java HotSpot(TM)64-Bit server VM warning: using the ParNew young collector with the Serial old collector is deprecated and will likely be removed in a future release * * 3 * -Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseParallelGC (PSYoungGen+ParOldGen) * * 4 * 4.1 * -Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseParallelOldGC (PSYoungGen+ParOldGen) * * 4.2不加就是默认UseParallelGC * -Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+PrintCommandLineFlags (PSYoungGen+ParOldGen) * * 5 * -Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseConcMarkSweepGC (par new generation+ concurrent * 6 * -Xms10m -Xmx10m -XX: +PrintGcDetails -XX:+PrintCommandLineFlags -XX: +UseG1GC 后面单独讲解G1 * * 7(理论知道即可,实际中已经被优化掉了,没有了。) * -Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseSerialOldGC * * * 下面是故意繁琐配置,主要是为了学习,一般生产不这么配置: * 下面是故意繁琐配置,主要是为了学习,一般生产不这么配置: * 下面是故意繁琐配置,主要是为了学习,一般生产不这么配置: * * -Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseParallelGC -XX:+UseParallelOldGC (PSYoungGen+ParOldGen) * * -Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseParNewGC -XX:+UseConcMarkSweepGC (par new generation+ concurrent * */ public class GCDemo { public static void main(String[] args) { System.out.println("*******GCDemo hello") ; try{ String str = "atguigu"; while(true){ str += str + new Random().nextInt(77777777)+new Random().nextInt(88888888); str.intern(); } }catch (Throwable e){ e .printStackTrace(); } } }
-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseSerialGC (DefNew+Tenured)
-XX:InitialHeapSize=10485760 -XX:MaxHeapSize=10485760 -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseSerialGC *******GCDemo hello [GC (Allocation Failure) [DefNew: 2736K->320K(3072K), 0.0016750 secs] 2736K->913K(9920K), 0.0017270 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [GC (Allocation Failure) [DefNew: 2762K->184K(3072K), 0.0011492 secs] 3356K->1374K(9920K), 0.0011808 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [GC (Allocation Failure) [DefNew: 2811K->0K(3072K), 0.0012172 secs] 4001K->2845K(9920K), 0.0012486 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [GC (Allocation Failure) [DefNew: 1524K->0K(3072K), 0.0009369 secs] 4370K->4317K(9920K), 0.0009559 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [GC (Allocation Failure) [DefNew: 1524K->0K(3072K), 0.0009298 secs][Tenured: 5789K->3028K(6848K), 0.0022375 secs] 5842K->3028K(9920K), [Metaspace: 3280K->3280K(1056768K)], 0.0031982 secs] [Times: user=0.02 sys=0.00, real=0.00 secs] [GC (Allocation Failure) [DefNew: 1524K->1524K(3072K), 0.0000205 secs][Tenured: 5972K->2292K(6848K), 0.0027519 secs] 7497K->2292K(9920K), [Metaspace: 3280K->3280K(1056768K)], 0.0028218 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [GC (Allocation Failure) [DefNew: 1553K->0K(3072K), 0.0003477 secs][Tenured: 5236K->5236K(6848K), 0.0019966 secs] 6790K->5236K(9920K), [Metaspace: 3280K->3280K(1056768K)], 0.0024124 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [Full GC (Allocation Failure) [Tenured: 5236K->5029K(6848K), 0.0023700 secs] 5236K->5029K(9920K), [Metaspace: 3280K->3280K(1056768K)], 0.0023923 secs] [Times: user=0.02 sys=0.00, real=0.00 secs] Heap def new generation total 3072K, used 109K [0x00000000ff600000, 0x00000000ff950000, 0x00000000ff950000) eden space 2752K, 3% used [0x00000000ff600000, 0x00000000ff61b650, 0x00000000ff8b0000) from space 320K, 0% used [0x00000000ff8b0000, 0x00000000ff8b0000, 0x00000000ff900000) to space 320K, 0% used [0x00000000ff900000, 0x00000000ff900000, 0x00000000ff950000) tenured generation total 6848K, used 5029K [0x00000000ff950000, 0x0000000100000000, 0x0000000100000000) the space 6848K, 73% used [0x00000000ff950000, 0x00000000ffe394f0, 0x00000000ffe39600, 0x0000000100000000) Metaspace used 3311K, capacity 4496K, committed 4864K, reserved 1056768K class space used 361K, capacity 388K, committed 512K, reserved 1048576K java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:3332) at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:137) at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:121) at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:647) at java.lang.StringBuilder.append(StringBuilder.java:208) at gc7.GCDemo.main(GCDemo.java:32) Process finished with exit code 0