GC垃圾回收策略

1、垃圾回收的定义

      垃圾回收(Garbage Collection,GC)是Java虚拟机(JVM)的一项重要功能,用于自动管理内存并回收不再使用的对象,防止内存泄漏和提高程序的性能。垃圾回收的过程是自动的,程序员不需要手动释放内存。

2、垃圾回收的基本原理

标记: GC首先标记所有被引用的对象,将它们标记为“存活”。

清除: 然后,GC清除所有未被标记的对象,将它们释放并返回给堆内存。

压缩(可选): 在一些垃圾回收算法中,可能还会包括堆内存的压缩阶段,以减少内存碎片。

3、不同的垃圾回收算法使用不同的策略来实现这些步骤。

以下是一些常见的垃圾回收算法

标记-清除算法: 这是最基本的垃圾回收算法。它通过两个阶段标记和清除来回收不再使用的对象。但是,它可能导致内存碎片。

复制算法: 这种算法将堆分为两个区域,一半是存活对象,一半是空的。它在两个区域之间进行切换,将存活对象复制到另一半区域,然后清除原区域。这种方法避免了内存碎片,但是需要更多的内存空间。

标记-整理算法: 这种算法结合了标记-清除和压缩。它首先标记存活对象,然后将它们移到堆的一端,最后清除剩余的对象。

分代算法: 这种算法根据对象的生命周期将堆分为不同的代。年轻代通常包含短命的对象,老年代包含长寿命的对象。通过这种方式,可以针对不同代使用不同的垃圾回收策略,提高效率。

4、垃圾回收器的类型

-XX:+UseSerialGC: 使用串行垃圾回收器。
-XX:+UseParallelGC: 使用并行垃圾回收器。
-XX:+UseConcMarkSweepGC: 使用CMS(Concurrent Mark-Sweep)垃圾回收器。
-XX:+UseG1GC: 使用G1(Garbage-First)垃圾回收器。

5、举例说明jar启动例子

例如,如果你想使用G1垃圾回收器,启动命令可以如下所示:
java -XX:+UseG1GC -jar your-application.jar

设置堆大小:
-Xms: 初始堆大小。
-Xmx: 最大堆大小。
例如,设置初始堆大小为256MB,最大堆大小为1GB:
java -XX:+UseG1GC -Xms256m -Xmx1g -jar your-application.jar

元空间大小(Java 8及以后版本):-XX:MaxMetaspaceSize: 设置元空间的最大大小。
例如,设置元空间的最大大小为256MB:
java -XX:+UseG1GC -Xms256m -XX:MaxMetaspaceSize=256m -jar your-application.jar

启用GC日志:-Xloggc:<file>: 将GC日志输出到指定文件中。
例如,将GC日志输出到gc.log文件中:
java -XX:+UseG1GC -Xms256m -XX:MaxMetaspaceSize=256m -Xloggc:gc.log -jar your-application.jar

6、不同垃圾回收器的优劣势

串行垃圾回收器(Serial Garbage Collector):

  • 优势: 简单、高效,适用于单核处理器或小型应用。
  • 劣势: 在多核处理器上的并发性能相对较差,会导致停顿时间较长。
-XX:+UseSerialGC

并行垃圾回收器(Parallel Garbage Collector):

  • 优势: 高吞吐量,适用于多核处理器和中等到大型的应用。
  • 劣势: 可能导致较长的停顿时间,不如G1回收器在停顿时间上表现好。
-XX:+UseParallelGC

CMS垃圾回收器(Concurrent Mark-Sweep Garbage Collector):

  • 优势: 较短的停顿时间,适用于对低延迟有要求的应用。
  • 劣势: 在垃圾收集阶段占用的CPU较多,可能影响应用的吞吐量。
-XX:+UseG1GC

G1垃圾回收器(Garbage-First Garbage Collector):

  • 优势: 适用于大堆、低延迟需求,能够在较短的时间内达到较高的吞吐量。
  • 劣势: 在一些特定场景下,可能无法达到CMS那样低延迟。
-XX:+UseConcMarkSweepGC

Z Garbage Collector:

  • 优势: 高性能、低延迟,适用于对延迟非常敏感的应用。
  • 劣势: 对系统资源的消耗相对较高。
-XX:+UseZGC

      在选择垃圾回收策略时,需要综合考虑应用程序的性能需求、对停顿时间的敏感度、堆大小、硬件配置等因素。通常,你可能需要在生产环境中进行性能测试,并根据测试结果进行调整和优化。在Java 9及以后的版本中,引入了更灵活的垃圾回收器接口,允许更容易地切换和配置不同的垃圾回收器。

  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JVM(Java虚拟机)的垃圾回收GC)机制是自动管理内存的一种机制。它通过自动识别和回收不再使用的对象来释放内存空间,以避免内存泄漏和程序中的内存溢出错误。 JVM中的垃圾回收器负责执行垃圾回收。当对象不再被引用时,垃圾回收器将标记这些对象为垃圾,并将它们从内存中回收。以下是JVM GC回收机制的一般过程: 1. 标记阶段(Marking Phase):从根对象(如线程栈中的引用、静态变量等)开始,垃圾回收器将遍历对象图并标记可达的对象。 2. 清除阶段(Sweeping Phase):垃圾回收器将清除标记为垃圾的对象,并回收它们占用的内存空间。 3. 压缩阶段(Compacting Phase):如果需要,垃圾回收器会对存活的对象进行整理,使它们在内存中连续排列,从而减少碎片化并提高内存的利用率。 4. 再分配阶段(Allocation Phase):如果需要,垃圾回收器会为新对象分配内存空间。 具体的垃圾回收算法和策略可能因不同的JVM实现而异。常见的垃圾回收算法包括标记-清除(Mark and Sweep)、复制(Copying)、标记-整理(Mark and Compact)等。JVM还提供了不同的垃圾回收器,如Serial、Parallel、CMS(Concurrent Mark Sweep)、G1(Garbage-First)等,以满足不同场景下的需求。 总而言之,JVM垃圾回收机制通过自动识别和回收不再使用的对象来管理内存,确保程序运行时的内存使用效率和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值