CodeGym/Java 课程/模块 3/选择Java中的垃圾收集器

选择Java中的垃圾收集器

可用

7.1* 如何选择合适的垃圾收集器

如果您的应用程序没有严格的延迟要求,您应该只运行应用程序并让 JVM 自己选择正确的收集器。

在大多数情况下,默认设置工作正常。如有必要,您可以调整堆大小以提高性能。如果性能仍然不如预期,请尝试修改收集器以满足您的应用程序要求。

  • 顺序的。如果应用程序有一个小数据集(最多约 100 MB)和/或它将在没有任何延迟要求的单个处理器上运行。
  • 并行。如果优先级是应用程序的峰值性能并且没有延迟要求(或者一秒或更长时间的暂停是可以接受的)。
  • 内容管理系统/G1。如果响应时间比整体吞吐量更重要,那么垃圾收集暂停应该短于一秒。
  • 中关村_ 如果响应时间是高优先级和/或涉及非常大的堆。

7.2* 垃圾回收建议

避免手动触发

除了垃圾回收的基本机制外,Java 中这个过程最重要的一点是它是非确定性的。也就是说,无法准确预测它在运行时何时会发生。

使用 System.gc() 或 Runtime.gc() 方法,您可以在代码中包含启动垃圾收集器的提示,但这并不能保证它会实际运行。

使用分析工具

如果您没有足够的内存来运行您的应用程序,您将遇到速度减慢、垃圾收集时间长、“世界停止”事件,并最终出现内存不足错误。这可能表明堆太小,但也可能表明应用程序存在内存泄漏。

您可以使用 jstat 或 Java Flight Recorder 等监控工具来查看堆使用量是否无限增长,这可能表明代码中存在错误。

更喜欢默认设置

如果您有一个小型的独立 Java 应用程序,您可能不需要设置垃圾收集。默认设置将为您提供良好的服务。

使用 JVM 标志进行自定义

在 Java 中设置垃圾回收的最佳方法是设置 JVM 标志。标志可用于设置垃圾收集器(例如,Serial、G1 等)、堆的初始和最大大小、堆分区的大小(例如,新生代、老年代)等等更多的。

选择合适的水龙头

就初始设置而言,一个很好的指导方针是自定义应用程序的性质。例如,并发垃圾收集器是高效的,但经常引发“world stop”事件,使其更适合可以接受长时间暂停的内部处理。

同时,CMS 垃圾收集器旨在最大限度地减少延迟,这使其非常适合响应性很重要的 Web 应用程序。

评论
  • 受欢迎
你必须先登录才能发表评论
此页面还没有任何评论