【问题标题】:VisualVM: Ideal Heap Memory Usage GraphVisualVM:理想的堆内存使用图
【发布时间】:2014-10-09 16:11:36
【问题描述】:

我正在使用VisualVM 监控我的Java 应用程序(用JDK 1.7 编写)。以下图表显示了此应用程序运行期间的堆内存使用情况。

查看此图可以发现其中有很多尖峰。这些尖峰表明应用程序创建了对象。一旦应用程序处理完它们,它就会使用 gc 销毁它们(在这种情况下被隐式调用)。

另外,这是应用程序仍在运行时内存分析器的屏幕截图

对我来说,图表的上下性质表明 Java 对象的有效使用。这个推论对吗?

人们应该瞄准的堆使用图的理想性质是什么?

还有其他方法可以提高我的应用程序的堆内存使用率吗?

【问题讨论】:

  • 随着时间的推移,正确的节目节目会产生更多的短命对象。可能,这可以优化。
  • 您的内存使用情况看起来非常好
  • @VictorSorokin JVM GC 可以很好地处理许多短期对象。这不是问题。
  • @VictorSorokin 峰值确实表明,一旦对象超出其范围,gc 就会被隐式调用并杀死它们。
  • 实际上,是否有问题由 OP 决定。通常,随着垃圾产生的速度越来越快,GC 的调用频率会越来越高,从而从应用程序本身中窃取 CPU 时间。我相信,OP 对此并不在意,但在极端情况下,它可能会导致OutOfMemory:stackoverflow.com/a/1393503/162634

标签: java performance heap-memory visualvm


【解决方案1】:

对我来说,图表的上下性质表明 Java 对象的有效使用。这个推论对吗?

我会说它是垃圾收集器的有效使用。我建议创建更少的对象可能更有效。

人们应该瞄准的堆使用图的理想性质是什么?

这取决于您的应用程序。我倾向于瞄准几乎完全平坦的。

还有其他方法可以提高我的应用程序的堆内存使用率吗?

负载

  • 减少垃圾。使用您的内存分析器找出垃圾的产生位置。
  • 使堆更大,这样它就不会经常 GC。
  • 将保留的数据移出堆(您似乎没有很多)

在您的情况下,最好的选择是减少您产生的垃圾量。

【讨论】:

  • 当我需要它们时,我实际上是在重新创建相同的 java 类型的对象。是否有助于重用创建的对象但在不需要时取消初始化(然后设置为空)它们。在这种情况下,jvm 不会将它们标记为垃圾。因此 gc 的调用频率会降低。
  • @davison 如果您回收大部分物品,它会有所帮助。如果您仅回收顶级对象,则可能无济于事。如果您没有使用过像 YourKit 这样的商业分析器,您可能会发现有 10 件事情需要先优化。您可以获得 YourKit 和其他分析器的评估许可证。如果我不测量,我只是在猜测。
  • @davison 您可以使用索引循环消除这些迭代器。
【解决方案2】:

只要堆大小随着时间的推移保持几乎相同,就可以了。由于 Sun JVM 中暂停世界 gc 的性质,使用的堆应该上下波动。看起来在您的应用程序中生成了许多短暂的对象,它可能效率低下,但有时您需要创建它们。这是 Java 的生活方式:D

【讨论】:

    猜你喜欢
    • 2017-11-21
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 2012-08-14
    相关资源
    最近更新 更多