【问题标题】:How to Profile JVM memory in the code?如何在代码中分析 JVM 内存?
【发布时间】:2011-03-18 07:09:12
【问题描述】:

我正在编写一个无法在 Eclipse 中测试的 servlet,我需要在服务器上运行。我想做内存分析并查明任何泄漏。所以,我想我需要编写可以告诉我当前内存使用情况的调试语句。有人可以向我指出有关如何执行此操作和/或 JDK 中的哪些类执行此操作的良好参考吗?

请注意,我不能使用“Eclipse MAT”。

【问题讨论】:

  • @所有回答者。非常好的东西,但我在设置方面受到限制,因为我必须将 servlet 部署到 Domino 设置上,虽然可以运行 Apache Web 服务器,但正在运行专有的 Domino servlet 引擎。所以,我有点坚持运行内部代码来获取性能信息。

标签: java servlets jvm memory-profiling


【解决方案1】:

不能用jdk自带的工具jvisualvm吗?

【讨论】:

    【解决方案2】:

    JConsole来救你!

    【讨论】:

      【解决方案3】:

      分析应用程序内存和查找泄漏将是一项艰巨的任务,更不用说用简单的调试语句误导了。如果您不能使用远程连接到您的进程的工具,使用hprof 将是一个不错的选择 IMO。另外,请查看故障排除文档here

      但我仍然认为,如果可能的话,如果您尝试在本地执行相同的操作(即修复泄漏)会更好。

      【讨论】:

      • 是的,hprof 帮助我们找到了服务器应用程序中的内存泄漏。 (+1)
      【解决方案4】:

      所以,我想我需要编写可以告诉我当前内存使用情况的调试语句。

      这很可能对您没有太大帮助,因为垃圾收集器仅通过查看计数就很难找到内存泄漏(您并不真正知道 gc 何时运行以及它实际收集的内容,有时它不知道'不要收集所有可收集的东西)。因此,您可能需要制作一些内存快照并对其进行分析,即查看哪些对象(或哪些类型的对象)未被收集,从而创建了越来越多的实例。

      为此,请查看建议的工具(JVisualVM、JConsole)。

      如果您仍想从程序内部获取内存使用信息,请尝试java.lang.management 包中的类;

      【讨论】:

        【解决方案5】:

        所以,我想我需要编写可以告诉我当前的调试语句 内存使用情况。

        我想你和我一样喜欢在代码中而不是使用像 JVisualVM 或 JConsole 这样的外部分析工具。

        您可以使用CoralBits 中的一个名为MemorySampler(由我编写)的工具,它会准确地告诉您代码内存分配在哪一行。下面是一个例子:

        ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<String>();
        MemorySampler.start();
        for(int i = 0; i < strings.length; i++) queue.offer(strings[i]);
        for(int i = 0; i < strings.length; i++) queue.poll();
        MemorySampler.end();
        if (MemorySampler.wasMemoryAllocated()) MemorySampler.printSituation();
        

        为您提供以下输出:

        Memory allocated on last pass: 24576
        Memory allocated total: 24576
        
        Stack Trace:
            java.util.concurrent.ConcurrentLinkedQueue.offer(ConcurrentLinkedQueue.java:327)
            TestGC.main(TestGC2.java:25)
        

        现在,如果您转到ConcurrentLinkedQueue 源代码的第 327 行,您将看到它在那里分配了一个 Node 实例。

        免责声明:我是 CoralBits 的开发者之一。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-11-30
          • 1970-01-01
          • 2014-12-08
          • 1970-01-01
          • 1970-01-01
          • 2016-05-31
          • 2016-10-04
          相关资源
          最近更新 更多