第二季:7.怎么查看服务器默认的垃圾收集器是那个?生产上如何配置垃圾收集器的?谈谈你对垃圾收集器的理解?【Java面试题】1

简介: 第二季:7.怎么查看服务器默认的垃圾收集器是那个?生产上如何配置垃圾收集器的?谈谈你对垃圾收集器的理解?【Java面试题】1

前言


2022 10/13 13:32

路漫漫其修远兮,吾将上下而求索


本文是根据尚硅谷学习所做笔记

仅供学习交流使用,转载注明出处


推荐

尚硅谷Java大厂面试题第2季,面试必刷,跳槽大厂神器

第二季大佬总结

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模式分别是什么意思

  1. 使用范围:一般使用Server模式,Client模式基本不会使用
  2. 操作系统
    32位的Window操作系统,不论硬件如何都默认使用Client的JVM模式
  3. 32位的其它操作系统,2G内存同时有2个cpu以上用Server模式,低于该配置还是Client模式
  4. 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
相关文章
|
8月前
|
人工智能 前端开发 Java
2025年WebStorm高效Java开发全指南:从配置到实战
WebStorm 2025不仅是一款强大的JavaScript IDE,也全面支持Java开发。本文详解其AI辅助编程、Java特性增强及性能优化,并提供环境配置、高效开发技巧与实战案例,助你打造流畅的全栈开发体验。
670 4
|
9月前
|
Java 应用服务中间件 Linux
在Java 12环境中配置和部署Apache Tomcat的步骤。
这段部署Tomcat的冒险旅程充满技术挑战,但同时也像游戏一样充满乐趣。它需要你提前准备,仔细执行,并随时准备解决意外情况。成功后,你就可以在这匹强壮的网络野马上,带着你的Java应用,冲向Web开发的璀璨星空。
270 56
|
8月前
|
存储 搜索推荐 算法
Java 大视界 -- Java 大数据在智能金融理财产品风险评估与个性化配置中的应用(195)
本文深入探讨了Java大数据技术在智能金融理财产品风险评估与个性化配置中的关键应用。通过高效的数据采集、存储与分析,Java大数据技术助力金融机构实现精准风险评估与个性化推荐,提升投资收益并降低风险。
Java 大视界 -- Java 大数据在智能金融理财产品风险评估与个性化配置中的应用(195)
|
12月前
|
Java Shell 数据库
【YashanDB知识库】调用外部UDF未能识别Java环境配置
【YashanDB知识库】调用外部UDF未能识别Java环境配置
【YashanDB知识库】调用外部UDF未能识别Java环境配置
|
Java Linux iOS开发
如何配置 Java 环境变量:设置 JAVA_HOME 和 PATH
本文详细介绍如何在Windows和Linux/macOS系统上配置Java环境变量。
17513 12
|
Java
CentOS7.8配置Adoptium-Java17运行环境
本指南介绍如何设置清华镜像源并安装 Temurin-17-JRE 运行环境。首先,编辑 `/etc/yum.repos.d/adoptium.repo` 文件,配置清华镜像源。接着,使用 `yum install -y temurin-17-jre` 命令安装 Temurin-17-JRE,并通过 `java --version` 验证安装成功。相关配置和操作界面截图附后。
588 8
|
前端开发 NoSQL Java
【Java若依框架】RuoYi-Vue的前端和后端配置步骤和启动步骤
本文介绍了如何配置和启动基于Java的若依(RuoYi)项目,涵盖后端和前端的详细步骤。首先,准备Redis、MySQL以及IDE(如Idea和VS)。接着,通过GitHub获取代码并导入到IDE中,执行必要的SQL文件和配置数据库密码。然后,启动Redis并进行相关配置。最后,按照前端配置步骤克隆前端代码库,打开终端执行命令完成前端配置。整个过程详细记录了每一步的操作,帮助开发者顺利部署若依项目。 如果你觉得有帮助,请点赞、关注和收藏,这将是我持续分享的动力!
7539 4
|
前端开发 Java 开发工具
Git使用教程-将idea本地Java等文件配置到gitte上【保姆级教程】
本内容详细介绍了使用Git进行版本控制的全过程,涵盖从本地仓库创建到远程仓库配置,以及最终推送代码至远程仓库的步骤。
1511 0
|
Java 数据库连接 数据库
如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面
本文介绍了如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面。通过合理配置初始连接数、最大连接数和空闲连接超时时间,确保系统性能和稳定性。文章还探讨了同步阻塞、异步回调和信号量等并发控制策略,并提供了异常处理的最佳实践。最后,给出了一个简单的连接池示例代码,并推荐使用成熟的连接池框架(如HikariCP、C3P0)以简化开发。
396 2