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