Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在没有源代码的情况下发现J2EE应用程序中的内存泄漏_Java_Jakarta Ee_Memory Leaks - Fatal编程技术网

Java 如何在没有源代码的情况下发现J2EE应用程序中的内存泄漏

Java 如何在没有源代码的情况下发现J2EE应用程序中的内存泄漏,java,jakarta-ee,memory-leaks,Java,Jakarta Ee,Memory Leaks,最近我经历了Adobe Systems的面试过程。他们向我提出的一个问题是: “有一个J2EE应用程序,该应用程序中存在内存泄漏,我们没有应用程序的源代码,因此您如何找到内存泄漏” 我当时不知道,所以我说:- “有很多第三方工具,即有一个与eclipse集成,还有更多。我不知道这些工具的机制。” 我仍然在寻找答案。 谢谢你你说得对,有很多工具,比如visualvm、jmeter。他们所做的只是挂接到运行的jvm并收集数据,就像您使用jstat或heapdump获取线程转储一样,这些工具只是一个奇

最近我经历了Adobe Systems的面试过程。他们向我提出的一个问题是: “有一个J2EE应用程序,该应用程序中存在内存泄漏,我们没有应用程序的源代码,因此您如何找到内存泄漏

我当时不知道,所以我说:- “有很多第三方工具,即有一个与eclipse集成,还有更多。我不知道这些工具的机制。”

我仍然在寻找答案。
谢谢你

你说得对,有很多工具,比如visualvm、jmeter。他们所做的只是挂接到运行的jvm并收集数据,就像您使用
jstat
或heapdump获取线程转储一样,这些工具只是一个奇特的数据分析器,并提供可视化,引擎盖下的所有内容都位于
heapdump
threaddump
上,可以告诉您内存泄漏。

在JDK文件夹中,查找/bin并找到“jvisualvm.exe”(Java VisualVM)并双击。它将扫描机器进程以查找当前正在运行的任何Java,并允许您开始监视其内存使用情况(包括内存本身!)。界面非常直观,因此您应该了解如何足够快地使用它

很高兴看到一个带有免费应用开发工具包的免费实用工具船,它不是完全无用的。。。事实上,这本书帮助我找到了一个大型、数据密集型项目代码库中的一些地方,在这些地方我确实需要在特定时间执行System.gc(),以使我需要大于1GB的内存。(与宗教信仰相反,当您需要尽快释放所需的内存时,运行System.gc()实际上是一件非常合理的事情。)以前,我在所有错误的时间(没有正确的时间)释放堆空间,但是这个实用程序帮助我找到了代码中记忆最深的地方,这样我就可以阻止这种情况的发生

编辑:两年后,我想补充如下。我自己没有使用引用的JVM交换机来跟踪内存泄漏,但我想分享这一信息b/c它可能会帮助其他人

地址:

Quote:'8)用于跟踪类加载和卸载的JVM参数
-XX:+TraceClassLoading和-XX:+TraceClassLoading是两个JVM选项,每当类加载到JVM或从JVM卸载时,我们都使用它们来打印日志信息。如果您有任何与classloader相关的内存泄漏,或者怀疑类没有卸载或垃圾收集,这些JVM标志非常有用。

拥有源代码在查找资源泄漏方面很少有用。至少在您将位置缩小很多之前。除了@Gaël的建议之外,可能存在问题的J2EE容器的副本可能有一些MBean,您可以通过
jconsole
(或容器控制台)访问这些MBean