Java 如何解释分析结果?

Java 如何解释分析结果?,java,netbeans-7,profiler,performance-testing,visualvm,Java,Netbeans 7,Profiler,Performance Testing,Visualvm,我使用NetBeans和VisualVM运行内存分析器,收到了结果,但不知道如何分析结果,我对此进行了研究,但它没有教授或给出如何解释结果的线索 我还发现了关于在Netbeans 4上解释结果的内容,但我正在寻找一篇更详细的文章,或者一种解释以下结果的方法来学习 此条目并非特定于Netbeans 7,但在JVM内存使用和评测基础知识方面有一些很好的简单入门知识。有时,更好地理解基础知识可以发现更好的编程技术,从而避免未来的内存问题。 我不太了解netbeans中的分析器,但我更喜欢visualv

我使用NetBeans和VisualVM运行内存分析器,收到了结果,但不知道如何分析结果,我对此进行了研究,但它没有教授或给出如何解释结果的线索

我还发现了关于在Netbeans 4上解释结果的内容,但我正在寻找一篇更详细的文章,或者一种解释以下结果的方法来学习


此条目并非特定于Netbeans 7,但在JVM内存使用和评测基础知识方面有一些很好的简单入门知识。有时,更好地理解基础知识可以发现更好的编程技术,从而避免未来的内存问题。
我不太了解netbeans中的分析器,但我更喜欢
visualvm
。它具有广泛的分析功能

VisualVM是一种可视化工具,集成了多个命令行JDK工具和轻量级评测功能。它设计用于生产和开发时,进一步增强了JavaSE平台的监控和性能分析能力

内存测试的示例程序

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());
    }
}
公共类内存测试{
公共静态void main(字符串[]args){
ArrayList temp=新的ArrayList();
对于(int i=0;i<1000000;i++){
临时添加(字符串值(i));
系统输出println(“索引:+temp.get(i));
}
System.out.println(temp.size());
}
}
打开
visualvm
。它将在左侧列出您的程序。还为您提供了多个选项,可根据
内存
CPU
测试程序。您还可以使用它来分析特定的包


您在问题中粘贴的遥测图中确实没有多少信息

所传达的内容

  • 您的程序被监视了大约3分钟
  • 堆利用率略低于200mb(无特殊情况)
  • 你有大约90个线程(这必须是一个应用服务器)
  • 您在GC中的平均花费不到5%(正常)
我敢打赌,内存可视化工具中传达的锯齿模式是您的程序启动——否则,为什么事情在最后一分钟左右会变得平滑呢。您的申请在问题中显示的3分钟内是否有负载

作为一个起点,我将了解当您的程序执行一些繁重的工作时,您的程序在GC(GC中的相对时间)中花费了多少时间。如果超过5%,您可以考虑调整堆或进一步挖掘以找出分配的位置。


接下来,我将查找瓶颈。找出你的应用程序在哪里花费了大部分时间,看看你是否能以某种方式优化代码。

在Netbeans profiler上找到好文章真的很难。我觉得很有帮助

以上三张图表汇总如下:

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

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

  • 蓝线是JVM执行GC所花费的执行时间的百分比。 如果您看到蓝线的百分比很大,那么应该增加JVM堆大小。(-Xmx参数)。对GC频率的正确分析将允许您确定您的应用程序是否面临问题。请记住,在开发或功能测试期间不太可能发现与GC相关的问题。正确的垃圾收集调优将要求您使用来自同时用户的大容量数据执行加载和测试
  • 红线:幸存世代数是java对象不同年龄段的百分比 在JVM的堆上。当存活世代的价值较低时,表明大多数 堆上的对象的时间大约相同。但是,, 存活世代的价值随着时间的推移以较高的速度增长,这表明您的应用程序正在分配新对象,同时保留对已分配的许多旧对象的引用,从而造成内存浪费甚至内存泄漏
图表(3) 第三个图显示JVM中活动线程的计数。
线程的活动计数变化太多会消耗CPU(上下文切换)

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

然后,您可以确定内存泄漏


查看@AneelAnsari这与我在问题中提到的第二篇文章相同。我注意到了,但我正在寻找更新的一篇和更多细节,这一个与netbeans 4相关,不是一个全面的参考。也许您想告诉我们您在评测时到底想分析什么?内存和cpu使用情况,以确保它没有内存泄漏,并且所有使用都是合理的。非常感谢,我也尝试过V-VM,但我的问题是需要知道如何解释结果。我的意思是在这种情况下,char[]和String被大量使用,那么如何找出代码的哪一部分导致它们呢?非常感谢,是的,这只是一个示例,它没有加载应用程序,只是出现了错误。它显示了严重警告:**探查器引擎警告:应该检测的类sun.reflect.GeneratedConstructorAccessor49未由目标VM加载严重:**请求的类加载器:sun.reflect。DelegatingClassLoader@f27821e严重:,它的class=class sun.reflect.DelegatingClassLoader,index=194,hashcode=25427454严重:**Profiler引擎警告:目标VM无法将类加载到instrument sun.reflect.generatedconstructor或accessor49它还显示实例不是GlassFish服务器4或它没有运行。您知道任何文档吗