第二季: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
相关文章
|
1月前
|
监控 安全 Linux
RHEL 环境下 Subversion 服务器部署与配置
【10月更文挑战第18天】在RHEL环境下部署Subversion服务器需依次完成安装Subversion、创建版本库、配置服务器、启动服务、客户端连接及备份维护等步骤。确保遵循安全最佳实践,保障数据安全。
|
1月前
|
SQL 机器学习/深度学习 分布式计算
大数据-81 Spark 安装配置环境 集群环境配置 超详细 三台云服务器
大数据-81 Spark 安装配置环境 集群环境配置 超详细 三台云服务器
62 1
|
14天前
|
存储 分布式计算 固态存储
阿里云2核16G、4核32G、8核64G配置云服务器租用收费标准与活动价格参考
2核16G、8核64G、4核32G配置的云服务器处理器与内存比为1:8,这种配比的云服务器一般适用于数据分析与挖掘,Hadoop、Spark集群和数据库,缓存等内存密集型场景,因此,多为企业级用户选择。目前2核16G配置按量收费最低收费标准为0.54元/小时,按月租用标准收费标准为260.44元/1个月。4核32G配置的阿里云服务器按量收费标准最低为1.08元/小时,按月租用标准收费标准为520.88元/1个月。8核64G配置的阿里云服务器按量收费标准最低为2.17元/小时,按月租用标准收费标准为1041.77元/1个月。本文介绍这些配置的最新租用收费标准与活动价格情况,以供参考。
|
12天前
|
监控 PHP Apache
优化 PHP-FPM 参数配置:实现服务器性能提升
优化PHP-FPM的参数配置可以显著提高服务器的性能和稳定性。通过合理设置 `pm.max_children`、`pm.start_servers`、`pm.min_spare_servers`、`pm.max_spare_servers`和 `pm.max_requests`等参数,并结合监控和调优措施,可以有效应对高并发和负载波动,确保Web应用程序的高效运行。希望本文提供的优化建议和配置示例能够帮助您实现服务器性能的提升。
34 3
|
15天前
|
存储 缓存 固态存储
阿里云服务器2核8G、4核16G、8核32G配置租用收费标准与活动价格参考
2核8G、8核32G、4核16G配置的云服务器处理器与内存比为1:4,这种配比的云服务器一般适用于中小型数据库系统、缓存、搜索集群和企业办公类应用等通用型场景,因此,多为企业级用户选择。本文介绍这些配置的最新租用收费标准与活动价格情况,以供参考。
|
16天前
|
存储 编解码 安全
阿里云服务器2核4G、4核8G、8核16G配置租用收费标准与活动价格参考
通常情况下,个人和一般企业用户在购买阿里云服务器时比较喜欢购买2核4G、4核8G、8核16G等配置,这些配置既能满足各种图文类中小型网站和应用又能满足企业网站应用、批量计算、中小型数据库系统等场景,2核4G配置适合新手入门或初创企业,4核8G与8核16G兼具成本与性能优势,适合通用场景,本文介绍这些配置的最新购买价格,包含原价收费标准和最新活动价格。
|
1月前
|
JSON JavaScript 前端开发
《进阶篇第6章:vue中的ajax》包括回顾发送ajax请求方式、vue-cli脚手架配置代理服务器、vue-resource
《进阶篇第6章:vue中的ajax》包括回顾发送ajax请求方式、vue-cli脚手架配置代理服务器、vue-resource
59 22
|
21天前
|
PHP 数据库 数据安全/隐私保护
布谷直播源码部署服务器关于数据库配置的详细说明
布谷直播系统源码搭建部署时数据库配置明细!
|
30天前
|
NoSQL Linux PHP
|
1月前
|
JavaScript 前端开发 Java
vue2知识点:vue-cli脚手架配置代理服务器
vue2知识点:vue-cli脚手架配置代理服务器
52 7
下一篇
无影云桌面