JAVA GC 垃圾回收器
JAVA 垃圾回收器
常见的回收器
1. Serial GC
版本: JDK 1.3及以上
用法:
-XX:+UseSerialGC
特点: 单线程执行,适用于小型数据处理和有限资源的环境。
2. Parallel GC (Throughput Collector)
版本: JDK 1.4及以上
用法:
-XX:+UseParallelGC
特点: 多线程执行,注重吞吐量,适用于多核服务器。
3. Concurrent Mark-Sweep (CMS) GC
版本: JDK 1.4.2及以上
用法:
-XX:+UseConcMarkSweepGC
特点: 较低的停顿时间,适用于需要较短GC停顿时间的应用场景。不过,CMS GC在JDK 9中被标记为废弃,可能在未来版本中被移除。
4. Garbage-First (G1) GC
版本: JDK 7 update 4及以上,作为实验特性加入;JDK 9中成为默认GC。
用法:
-XX:+UseG1GC
特点: 分区堆,平衡吞吐量和停顿时间,适用于大堆内存。
5. ZGC (Z Garbage Collector)
版本: 作为实验特性在JDK 11中引入
用法:
-XX:+UseZGC
特点: 目标是达到极低的停顿时间,适用于多核机器和大内存应用。
6. Shenandoah GC
版本: 作为实验特性在JDK 12中引入
用法:
-XX:+UseShenandoahGC
特点: 低停顿时间,独立于堆的大小。
7. Epsilon GC (No-Op Collector)
版本: 作为实验特性在JDK 11中引入
用法:
-XX:+UseEpsilonGC
特点: 实验性的GC,不进行任何垃圾回收,可用于性能测试。使用完堆内存,jvm就会停止运行。
默认使用的垃圾回收器
JDK 8及以前: 默认情况下,Java使用Parallel GC作为默认垃圾回收器。
JDK 9+: 从JDK 9开始,默认垃圾回收器变更为G1 GC(Garbage-First Garbage Collector)。G1 GC旨在提供一个平衡良好的垃圾回收性能,特别是对于具有较大堆内存的多核机器。
如何查看当前java使用了什么垃圾回收器?
输入java -XX:+PrintCommandLineFlags -version
会出现一些jvm参数,例如:
➜ ~ java -XX:+PrintCommandLineFlags -version
-XX:ConcGCThreads=3 -XX:G1ConcRefinementThreads=10 -XX:GCDrainStackTargetSize=64 -XX:InitialHeapSize=128600448 -XX:MarkStackSize=4194304 -XX:MaxHeapSize=2057607168 -XX:MinHeapSize=6815736 -XX:+PrintCommandLineFlags -XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseG1GC
openjdk version "17.0.9" 2023-10-17
OpenJDK Runtime Environment (build 17.0.9+8)
OpenJDK 64-Bit Server VM (build 17.0.9+8, mixed mode)
其中-XX:+UseG1GC
就是指当前默认使用的是G1回收器
如果想看到当前正在运行的java进程使用了哪些回收器,可以使用jinfo:
> jps # jps命令快速查看当前Java进程PID
70100 RemoteMavenServer36
70836
72196 Jps
72596 MainApp
72504 Launcher
> jinfo -flags 72596
VM Flags:
-XX:CICompilerCount=4 -XX:InitialHeapSize=266338304 -XX:MaxHeapSize=4246732800 -XX:MaxNewSize=1415577600 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=88604672 -XX:OldSize=177733632 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
其中的-XX:+UseParallelGC
就是说明使用了ParallelGC
有关于垃圾回收器的java启动参数
其实不同的JVM参数会有所不同,但是主要是HotSpot为主
通用参数
-Xms<size>
: 设置堆的初始大小。-Xmx<size>
: 设置堆的最大大小。-Xmn<size>
: 设置年轻代大小(对于使用ParNew和Parallel GC的情况)。-XX:NewRatio=<ratio>
: 设置年轻代(包括Eden和两个Survivor空间)和老年代的比例。-XX:SurvivorRatio=<ratio>
: 设置Eden区与一个Survivor区的大小比例。-XX:MaxTenuringThreshold=<value>
: 设置对象晋升到老年代的年龄阈值。-XX:+UseCompressedOops
: 启用指针压缩。-XX:+HeapDumpOnOutOfMemoryError
: 在内存溢出时导出堆到文件。-XX:HeapDumpPath=<path>
: 设置堆转储文件的路径。
与GC日志参数有关的(JDK 8及之前,JDK8之后被标记为过期)
-Xloggc:<file-path>
: 将GC日志输出到指定文件。-XX:+PrintGCDetails
: 在GC日志中打印详细信息。-XX:+PrintGCDateStamps
: 在GC日志中添加日期戳。-XX:+PrintGCTimeStamps
: 在GC日志中添加时间戳。
与GC日志参数有关的(JDK 9及之后)
-Xlog:gc
: 启用GC日志,默认输出到标准输出(控制台)。-Xlog:gc*
: 启用所有GC相关的日志消息。-Xlog:gc:/path/to/gc.log
: 将GC日志输出到指定文件。-Xlog:gc:file=gc.log:time,level,tags
: 输出GC日志到文件,包括时间戳、日志级别和标签。-Xlog:gc+heap=debug
: 启用GC和堆调试信息的输出。
与Parallel GC有关的
-XX:+UseParallelGC
: 启用并行垃圾收集器。-XX:ParallelGCThreads=<number>
: 设置并行垃圾收集器的线程数。-XX:+UseParallelOldGC
: 使用并行方式执行老年代垃圾回收。
与CMS GC有关的
-XX:+UseConcMarkSweepGC
: 启用CMS垃圾收集器。-XX:+UseCMSInitiatingOccupancyOnly
: 只在达到阈值时启动CMS收集。-XX:CMSInitiatingOccupancyFraction=<percentage>
: 设置启动CMS收集的堆占用率阈值。
与G1 GC有关的
-XX:+UseG1GC
: 启用G1垃圾收集器。-XX:MaxGCPauseMillis=<milliseconds>
: 期望的最大GC暂停时间。-XX:G1HeapRegionSize=<size>
: 设置G1的堆区域大小。-XX:InitiatingHeapOccupancyPercent=<percentage>
: 启动并发GC循环的堆占用率阈值。
与ZGC有关的
-XX:+UseZGC
: 启用ZGC垃圾收集器。
HotSpot
评论