【问题标题】:Which heap size do you prefer?您更喜欢哪种堆大小?
【发布时间】:2010-09-10 03:15:09
【问题描述】:

我知道没有“正确”的堆大小,但是您在应用程序中使用哪种堆大小(应用程序类型、jdk、os)?

JVM 选项-Xms(初始/最小)和-Xmx(最大)允许控制堆大小。什么设置在什么情况下有意义?默认值什么时候合适?

【问题讨论】:

  • 你期待什么样的答案?我应该回答,我用-Xmx512 运行我的Java 吗?你在期待什么?
  • 是的,但是您还应该添加有关您的应用程序、jdk 和 os 的信息。

标签: java memory performance


【解决方案1】:

在我最占用内存的应用程序上:

-Xms250M -Xmx1500M -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC 

【讨论】:

    【解决方案2】:

    1.3Gb 用于重型 GUI 应用程序。

    不幸的是,在 Linux 上,JVM 在这种情况下似乎预先请求了 1.3G 的虚拟内存,即使不需要,这看起来也很糟糕(并且会引起用户的很多困惑)

    【讨论】:

      【解决方案3】:

      您需要在 JConsole 或 visualvm 中花费相当长的时间才能清楚地了解高原内存使用情况。等到一切都稳定了,你会看到堆内存使用的特征锯齿曲线。峰值应该是您的 70-80% 堆,具体取决于您使用的垃圾收集器。

      当堆使用量达到一定百分比时,大多数垃圾收集器都会触发完整的 GC。这个百分比是最大堆的 60% 到 80%,具体取决于所涉及的策略。

      【讨论】:

        【解决方案4】:

        这取决于应用程序类型。桌面应用程序与 Web 应用程序有很大不同。应用程序服务器与独立应用程序有很大不同。

        这还取决于您使用的 JVM。 JDK5 和更高版本 6 包含有助于了解如何调整应用程序的增强功能。

        堆大小很重要,但了解它如何与垃圾收集器一起使用也很重要。

        JDK1.4 Garbage Collector Tuning

        JDK5 Garbage Collector Tuning

        JDK6 Garbage Collector Tuning

        【讨论】:

          【解决方案5】:

          您必须尝试您的应用程序并查看它的性能。例如,我以前总是开箱即用地运行 IDEA,直到我得到这份新工作,我在这个庞大的单体项目上工作。在编译整个项目时,IDEA 运行非常缓慢并且经常抛出内存错误。

          我做的第一件事就是将堆增加到 1 gig。这摆脱了内存不足的问题,但它仍然很慢。我还注意到 IDEA 经常冻结 10 秒左右,之后使用的内存被减半,然后再次增加,这引发了垃圾收集的想法。我现在将它与 -Xms512m、-Xmx768m 一起使用,但我还添加了 -Xincgc,以激活增量垃圾收集

          因此,我的旧 IDEA 又回来了:它运行平稳,不再冻结,并且从未使用超过 600m 的堆。

          对于您的应用程序,您必须使用类似的方法。尝试确定典型的内存使用情况并调整堆以使应用程序在这些条件下运行良好。但也可以让高级用户调整设置,以解决不寻常的数据加载问题。

          【讨论】:

          • 对我而言,IntelliJ 7.0.4(捆绑的 JDK、Windows XP、“大型项目”)与 -Xms64m -Xmx364m 一起运行良好。我也尝试过“增量垃圾收集”,但使用该选项时 ide 的响应速度较慢。
          【解决方案6】:

          这完全取决于您的应用程序以及您可能遇到的任何硬件限制。没有一种适合所有人的尺寸。

          jmap 可用于查看您实际使用的堆,是调整堆大小的良好起点。

          【讨论】:

          • “没有一种适合所有人的尺寸。”我没有要求一刀切。
          【解决方案7】:

          其实我一直觉得 Java 限制堆大小很奇怪。本机应用程序通常可以使用尽可能多的堆,直到它用完虚拟地址空间。在 Java 中限制堆的唯一原因似乎是垃圾收集器,它具有某种“惰性”,可能不会垃圾收集对象,除非有必要这样做。这意味着如果您选择的堆太大,您的应用会不断使用比实际需要更多的内存。

          但是,Sun 多年来对 GC 进行了很大改进,并且为了模拟原生 C 应用程序的行为,我会将初始堆大小设置为 32 MB(对于小型程序)或 64 MB(对于较大程序),并且最大到 1-2 GB 之间。如果您的应用程序确实需要超过 1 GB 的内存,那么它很可能会损坏(除非您处理的数据对象那么大),但我认为您的应用程序没有理由被杀死,只是因为它超过了一定的堆大小。

          当然,这是指普通PC。如果您为手机或其他受限设备创建 Java 代码,您可能应该采用初始和最大堆大小来满足该设备的限制。

          【讨论】:

            【解决方案8】:

            通常我尽量不使用大于 1GB 的堆。 这将花费您进行主要的垃圾收集。

            有时最好将您的应用程序拆分到同一台机器上的几个 JVM,而不是大堆大小。

            具有大堆大小的主要收集可能需要超过 10 分钟(在未优化的 GC 应用程序上)。

            【讨论】:

            • 堆需要多大才能让 JVM 停止 10 分钟?你用的是什么JVM?您使用了哪些 GC 参数?
            • 我对 Websphere 5.1 的 1.3GB 堆没有任何问题(IBM JDK1.4,Windows,没有特殊的 GC 参数)。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-10-06
            • 2010-09-12
            • 1970-01-01
            • 2023-01-11
            • 1970-01-01
            • 2013-04-22
            相关资源
            最近更新 更多