jvm 垃圾回收

JVM垃圾回收器

JVM(Java Virtual Machine)垃圾回收器是负责内存管理的组件,它会监控对象的使用并在它们不再使用时清理内存。JVM内置了多个垃圾回收器,每个垃圾回收器都有不同的特点和适用场景。以下是一些常见的垃圾回收器:

  1. Serial收集器 - Serial收集器是一种单线程垃圾回收器,它会暂停应用程序,清理整个堆内存,然后再恢复应用程序。它适用于小型应用程序和移动设备,并且可以通过JVM参数进行开启。
  2. Parallel收集器 - Parallel收集器是一种多线程垃圾回收器,它可以并行地清理整个堆内存。它适用于多核CPU的应用程序,并且可以通过JVM参数进行开启。
  3. CMS收集器 - CMS(Concurrent Mark Sweep)收集器是一种并发垃圾回收器,它可以在不暂停应用程序的情况下清理内存。它适用于大型应用程序和需要短暂暂停的应用程序,并且可以通过JVM参数进行开启。
  4. G1收集器 - G1(Garbage First)收集器是一种基于区域的垃圾回收器,它将堆内存分为多个区域,并进行独立的垃圾回收。它适用于大型应用程序和需要更可预测的暂停时间的应用程序,并且可以通过JVM参数进行开启。

除了上述垃圾回收器之外,JVM还提供了其他一些垃圾回收器,例如ZGC(Z Garbage Collector)和Shenandoah收集器,它们适用于更大的内存和更高的性能需求。

总之,JVM提供了多个垃圾回收器,每个垃圾回收器都有不同的适用场景和特点。开发人员可以根据应用程序的需求选择适合的垃圾回收器,并通过JVM参数进行配置和优化。

不同垃圾回收器之间的搭配并没有固定的规则,而是根据具体情况进行选择。

以下是一些常见的垃圾回收器组合:

  • Serial收集器 + Serial Old收集器:适用于小型应用程序和移动设备。
  • Parallel收集器 + Parallel Old收集器:适用于多核CPU的应用程序。
  • CMS收集器 + Serial Old收集器:适用于大型应用程序和需要短暂暂停的应用程序。
  • CMS收集器 + Parallel Old收集器:适用于大型应用程序和需要更高的吞吐量的应用程序。(一般没有这个组合)
  • CMS收集器 + Parallel New收集器:适用于大型应用程序和需要更高的吞吐量的应用程序。(Parallel Old专门针对CMS 改进的收集器 )
  • G1收集器:适用于大型应用程序和需要更可预测的暂停时间的应用程序。

 

除了上述组合之外,还可以根据应用程序的实际情况选择其他组合方式,以达到最佳性能。

JDK1.8 使用的垃圾收集器

JDK1.8默认使用的垃圾回收器组合是Parallel收集器 + Parallel Old收集器。这种组合适用于多核CPU的应用程序,可以提供较高的吞吐量和较短的暂停时间。但是对于大型应用程序或需要更短的暂停时间的应用程序,可能需要使用其他垃圾回收器组合或进行调优。

垃圾回收器的算法通常有以下几种:

  • 标记-清除算法:标记所有活动对象,清理未标记的垃圾对象。该算法需要暂停应用程序,并且可能会出现内存碎片。
  • 复制算法:将堆内存分为两个区域,每次只使用其中一个区域。当一个区域满时,将其中的活动对象复制到另一个区域中,并清理原区域中的所有对象。该算法不会出现内存碎片,但需要额外的内存空间。
  • 标记-整理算法:标记所有活动对象,然后将它们移动到堆内存的一端,清除未移动的垃圾对象。该算法需要暂停应用程序,并且可能会出现内存碎片。
  • 分代算法:将堆内存分为新生代和老年代,并使用不同的垃圾回收算法。新生代通常使用复制算法,老年代通常使用标记-整理算法或标记-清除算法。

以上算法具有不同的优缺点和适用场景,开发人员可以根据应用程序的需求选择适合的算法和垃圾回收器组合,并通过JVM参数进行配置和优化。

以下是各种垃圾回收器使用的回收算法和根据新生代、老年代的划分:

  • Serial收集器:新生代使用复制算法,老年代使用标记-整理算法。
  • Parallel收集器:新生代使用复制算法,老年代使用标记-整理算法。
  • CMS收集器:新生代使用复制算法,老年代使用标记-清除算法。
  • G1收集器:新生代使用复制算法,老年代使用标记-整理算法或标记-清除算法。

其中,新生代使用复制算法可以避免内存碎片,但需要更多的内存空间。老年代使用标记-整理算法可以避免内存碎片,但需要暂停应用程序。老年代使用标记-清除算法不需要暂停应用程序,但可能会出现内存碎片。开发人员可以根据应用程序的需求选择适合的垃圾回收器和回收算法,并通过JVM参数进行配置和优化。

JVM参数优化是优化JVM垃圾回收器性能的重要手段。以下是一些常见的JVM参数:

  • Xms:设置JVM堆内存的初始大小。
  • Xmx:设置JVM堆内存的最大大小。
  • XX:NewRatio:设置新生代和老年代的比例。
  • XX:+UseParallelGC:开启Parallel收集器,适用于多核CPU的应用程序。
  • XX:+UseConcMarkSweepGC:开启CMS收集器,适用于大型应用程序和需要短暂暂停的应用程序。
  • XX:+UseG1GC:开启G1收集器,适用于大型应用程序和需要更可预测的暂停时间的应用程序。
  • XX:MaxPermSize:设置JVM持久代内存的最大大小。

除了上述参数之外,还可以通过其他参数进行更细粒度的配置和优化,例如:

  • XX:SurvivorRatio:设置新生代中Eden区域和Survivor区域的比例。
  • XX:CMSInitiatingOccupancyFraction:设置CMS收集器在老年代占用比例达到多少时开始进行回收。
  • XX:G1HeapRegionSize:设置G1收集器中每个Heap Region的大小。

总之,JVM参数优化可以提高垃圾回收器的性能和吞吐量,降低暂停时间和内存占用。开发人员可以根据应用程序的需求选择适合的JVM参数,并进行调优和优化。

生产环境中使用的JVM参数会因应用程序的需求而有所不同,以下是一些常见的JVM参数:

  1. Xmx: 指定 JVM 最大堆大小。根据项目实际情况设定,建议设置为物理内存的 1/4 ~ 1/2 之间,避免出现内存溢出。
  2. Xms: 指定 JVM 初始堆大小。根据项目实际情况设定,建议设置为 Xmx 的一半,避免启动时出现过多的内存浪费。
  3. XX:PermSize 和 -XX:MaxPermSize: 指定永久代初始大小和最大大小。根据项目实际情况设定,一般建议将初始大小和最大大小设置为相同值,避免频繁 Full GC。
  4. XX:+HeapDumpOnOutOfMemoryError: 当 JVM 发生内存溢出时,自动生成堆转储文件,方便问题排查。
  5. XX:ParallelGCThreads: 指定并行垃圾回收线程数。根据 CPU 核数设定,一般建议设置为 CPU 核数的一半。
  6. XX:+UseG1GC: 使用 G1 垃圾回收器,能够更好地处理大内存和多 CPU 的情况,建议在大型项目中使用。
  7. XX:+DisableExplicitGC: 禁用显式 GC 调用,防止代码中无意中调用 GC 而导致性能下降。
  8. XX:+UseCompressedOops: 开启指针压缩,减小对象头大小,降低堆内存占用。
  9. XX:+UseConcMarkSweepGC: 使用 CMS 垃圾回收器,可以在减少暂停时间的同时保持良好的吞吐量。

一个常见的生产环境 JVM 参数设置示例:

rubyCopy code
java -Xmx4g -Xms4g -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+HeapDumpOnOutOfMemoryError -XX:ParallelGCThreads=2 -XX:+UseG1GC -XX:+DisableExplicitGC -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -jar your_project.jar

这里将最大堆大小和初始堆大小都设置为 4GB,永久代大小为 256MB,使用 G1 垃圾回收器和 CMS 垃圾回收器,并开启指针压缩和禁用显式 GC 调用。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值