如何查看JVM采用的是哪种GC

本文介绍两种查询Java应用中垃圾回收器的方法:一是通过命令行参数-XX:+PrintCommandLineFlags结合-version;二是利用jinfo-flags命令查看指定进程的VM参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法一:使用命令行获取

C:\Users\10255880>java -XX:+PrintCommandLineFlags -version
-XX:InitialHeapSize=136306112 -XX:MaxHeapSize=2180897792 -XX:+PrintCommandLineFl
ags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesInd
ividualAllocation -XX:+UseParallelGC
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)

上述结果中的 -XX:+UseParallelGC 表明选择的垃圾收集器为并行收集器。

方法二:打印进程信息

  • jps:jdk提供的一个查看当前java进程的小工具, 可以看做是JavaVirtual Machine Process Status Tool的缩写
C:\Program Files\Java\jdk1.8.0_161\bin>jps
11328 Bootstrap
2800 RemoteMavenServer36
3424 Launcher
5744
6336 Launcher
5540 LoaderMain
9316 Jps
10600
11672 Launcher
4728 KotlinCompileDaemon
  • jinfo -flags {进程号}:jinfo 命令可以用来查看 Java 进程运行的 JVM 参数,; -flags 可以打印虚拟机标识。
    jinfo 命令具体如下:
C:\Program Files\Java\jdk1.8.0_161\bin>jinfo -help
Usage:
    jinfo [option] <pid>
        (to connect to running process)
    jinfo [option] <executable <core>
        (to connect to a core file)
    jinfo [option] [server_id@]<remote server IP or hostname>
        (to connect to remote debug server)

where <option> is one of:
    -flag <name>         to print the value of the named VM flag
    -flag [+|-]<name>    to enable or disable the named VM flag
    -flag <name>=<value> to set the named VM flag to the given value
    -flags               to print VM flags
    -sysprops            to print Java system properties
    <no option>          to print both of the above
    -h | -help           to print this help message

使用jinfo -flags查看所有VM标识

C:\Program Files\Java\jdk1.8.0_161\bin>jinfo -flags  11672
Attaching to process ID 11672, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.161-b12
Non-default VM flags: -XX:CICompilerCount=3 -XX:InitialHeapSize=136314880 
-XX:MaxHeapSize=734003200 -XX:MaxNewSize=244318208 -XX:MinHeapDeltaBytes=524288 
-XX:NewSize=45088768 -XX:OldSize=91226112 -XX:+UseCompressedClassPointers 
-XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC

可以看到最后打印的就是使用的GC类型。

### JVM 垃圾回收机制概述 JVM 的垃圾收集(Garbage Collection, GC)是虚拟机自动管理内存的关键特性之一。通过这一过程,JVM 能够识别并释放不再使用的对象所占用的堆空间,从而防止内存泄漏和提高应用程序性能[^2]。 #### 年轻代与老年代 Java 对象被分配到年轻代(Young Generation),这里进一步分为 Eden 和两个 Survivor 区域。大多数新创建的对象都会首先进入 Eden 区;当 Eden 区满时会触发 Minor GC 来清理这些区域中的无用对象,并将存活下来的对象移动至其中一个 Survivor 区。如果某个对象经过多次复制仍然存活,则会被晋升到老年代(Old Generation)。这种设计使得大部分短生命周期的对象可以在不触及更昂贵的老年区之前就被清除掉。 #### 不同类型的垃圾收集器 为了适应不同的应用场景需求,JVM 提供了几种不同特性的垃圾收集算法: - **串行收集器 (-XX:+UseSerialGC)**:适用于单线程环境下的小型应用,默认采用标记-清扫的方式处理整个堆。 - **并行收集器 (-XX:+UseParallelGC 或者 -XX:+UseParNewGC)**:适合多核处理器架构,在执行 Full GC 期间能够利用多个 CPU 核心来加速垃圾回收工作。需要注意的是,自 JDK 8 开始单独启用 `-XX:+UseParNewGC` 已经被弃用了[^4]。 - **CMS 收集器 (-XX:+UseConcMarkSweepGC)**:旨在减少停顿时间,它会在后台并发运行以完成部分阶段的任务,不过这可能会增加额外开销并且可能导致浮动垃圾问题。 - **G1 收集器 (-XX:+UseG1GC)**:作为新一代的选择,G1 将堆划分为固定大小的小块来进行增量式的整理操作,允许设置最大暂停时间和吞吐量目标等参数,提供了更好的可预测性和灵活性。 ```java // 设置 G1 垃圾收集器为例 public class Main { public static void main(String[] args) { System.setProperty("java.vm.option", "-XX:+UseG1GC"); // 应用程序逻辑... } } ``` #### 配置优化建议 对于那些调优不当的应用来说,确实可能出现逐渐恶化的 JVM 性能状况,进而影响最终用户的体验速度。因此合理调整相关选项至关重要。例如适当增大初始堆容量 (`-Xms`) 及最大堆容量 (`-Xmx`) 参数可以帮助避免频繁发生 Full GC;而针对特定业务场景选择合适的垃圾收集策略同样不可忽视。此外还可以考虑开启详细的日志记录功能以便于监控分析实际运行情况。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值