【问题标题】:Valgrind to detect memory leaks in java web applicationValgrind 检测 Java Web 应用程序中的内存泄漏
【发布时间】:2016-02-04 06:14:53
【问题描述】:
我有在 Tomcat 容器中运行的 Web 应用程序。我被要求调查使用 Valgrind 检测内存泄漏。是否可以使用 Valgrind 来分析 Java Web 应用程序?如果是,它是否是现有/内置 JVM 内存分析器的可行选择?我已经运行了 JConsole 和 VisualVM 来查看是否有内存泄漏,发现没有这样的泄漏。
根据我目前的调查,我发现 Valgrind 适用于具有本机代码(通过 JNI)的 C/C++ 应用程序和 Java 应用程序。
虽然在 Valgrind 网站上提到 Valgrind 可用于以任何编程语言编写的程序,但我找不到任何将 Valgrind 用于 Java 程序的示例。
谢谢
【问题讨论】:
标签:
java
memory-leaks
valgrind
【解决方案1】:
我真的不认为你可以将 Valgrind 用于 Java。 Valgrind 检测到的内存泄漏类型只是:你分配了一些东西却忘记释放它。在 Java 中,没有 free,所以没有什么可以忘记的......
还有其他资源需要回收(文件描述符、直接缓冲区等),但 Valgrind 不知道它们。有一些方法会导致 内存 泄漏,但它们通常涉及类加载器,即 Valgrind 对此一无所知。
Valgrind 检测到的内存泄漏类型在 Java 中是不可能的(JNI 除外)。
【解决方案2】:
valgrind 几乎适用于所有生成的代码。来到 java 它有点,但可以完成工作。确保在调试内存泄漏时使用 --smc-check=all 选项。
通常在任何目标机器上调试 c 二进制文件,
$ valgrind --tool=memcheck NAME-OF-BINARY-FILE
显示堆摘要、泄漏摘要的统计信息
类似地,你会为 java 做额外的 --smc-check=all 选项。