如何解读分析结果?

时间:2013-11-21 04:42:29

标签: java netbeans-7 profiler performance-testing visualvm

我使用NetBeans和VisualVM运行内存Profiler并收到了结果但是没有线索如何分析其结果,我研究了这个article但它没有教导或提供如何解释结果的线索。

我也发现这个article关于Netbeans 4上的解释结果,但我正在寻找一篇包含更多细节的文章,或者是一种解释以下结果的方法。

enter image description here

5 个答案:

答案 0 :(得分:8)

您在问题中粘贴的遥测图表中传达的信息确实不多。

传达的内容

  • 您的计划受到监控约3分钟
  • 您的堆利用率略低于200mb(没什么特别的)
  • 你有大约90个线程(这必须是一个应用服务器)
  • 您在GC中的平均花费不到5%(正常)

我敢打赌,在内存可视化器中传达的锯齿图案是你的程序启动 - 否则为什么在最后一刻左右其他东西看起来很平滑。您的申请是否在您的问题中显示的3分钟内处于任何负荷状态?

作为一个起点,我会看一下你的程序花在GC上的时间(GC的相对时间),当你的程序正在进行一些繁重的工作时。如果它超过5%,您可以考虑调整堆或进一步挖掘以找出分配的位置。

接下来我会寻找瓶颈。找出您的应用程序花费大部分时间的位置,看看您是否可以以某种方式优化该代码。

答案 1 :(得分:6)

我对netbeans中的profiler知之甚少,但我更喜欢visualvm。它具有广泛的分析。 https://visualvm.java.net/

  

VisualVM是一个集成了多个命令行JDK工具和轻量级分析功能的可视化工具。专为生产和开发时使用而设计,它进一步增强了Java SE平台的监控和性能分析功能

内存测试示例程序

public class MemoryTest {
    public static void main(String[] args) {
        ArrayList<String> temp = new ArrayList<String>();
        for (int i = 0; i < 1000000; i++) {
            temp.add(String.valueOf(i));
            System.out.println("index:" + temp.get(i));
        }
        System.out.println(temp.size());
    }
}

打开visualvm。它会在左侧列出你的程序。同时为您提供多种选项,以针对MemoryCPU测试您的计划。您还可以使用它来分析特定包。

enter image description here

enter image description here

答案 2 :(得分:2)

此条目并非特定于Netbeans 7,但在JVM内存使用和分析基础知识方面确实有一些很好的简单启动器。有时,对基础知识的更好理解揭示了更好的编程技术,以避免将来的内存问题。 http://java.dzone.com/articles/java-memory-model-simplified

答案 3 :(得分:2)

在Netbeans Profiler上找到好文章真的很难。我发现this link很有帮助。

以上三张图的摘要如下:

图表(1) 在第一个图中,第一个图中的红色阴影表示JVM堆的已分配大小,而紫色叠加表示实际使用的堆空间量。在这张图片中,分配的堆大小约为450 MB,其中140 MB用于保存 java对象。

图表(2) 第二张图显示了堆统计信息

  • 蓝线是JVM执行GC所花费的执行时间的百分比。 如果您看到蓝线大百分比,那么您应该增加JVM堆大小。( - Xmx参数)。正确分析GC频率将允许您确定您的应用是否面临问题。请记住,在开发或功能测试期间不太可能捕获与GC相关的问题。正确的垃圾收集调整将要求您执行加载并使用来自同时用户的高容量执行测试。
  • 红线:幸存世代的数量是java对象不同年龄的百分比 在JVM的堆上。当幸存的世代的价值低时,它表明最多 堆上的对象大约在相同的时间内。但是,如果 幸存世代的价值随着时间的推移以更高的速度增长,然后它表明你的应用程序正在分配新对象,同时保持对已分配的许多旧对象的引用,因此浪费内存甚至内存泄漏。

图表(3) 第3个图显示了JVM中活动线程的数量。 线程活动计数的过多变化会占用CPU(上下文切换)。

答案 4 :(得分:0)

如果您将运行此应用程序较长时间,并且指示JVM堆大小的图形将如下所示:

enter image description here

然后你可以确定内存泄漏。

Creating a memory leak with Java