如何解读分析结果?

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

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

在此处输入图像描述

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

传达的是什么

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

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

作为一个起点,我会看一下你的程序花费多少时间在GC(GC的相对时间)中花费多少时间。 如果它超过5%,您可以考虑调整堆或进一步挖掘以找出分配发生的位置。

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

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

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

内存测试示例程序

 public class MemoryTest { public static void main(String[] args) { ArrayList temp = new ArrayList(); 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测试您的程序。 您还可以使用它来分析特定包。

在此处输入图像描述

在此处输入图像描述

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

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

以上三个图的总结如下:

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

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

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

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

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

在此处输入图像描述

那么你可以确定内存泄漏。

使用Java创建内存泄漏