例如:
jstatd -p 1234 -J-Djava.security.policy=D:\jstatd.all.policy
通过在目标VM中启动jstatd,我们可以连接到目标计算机并远程分析应用程序的内存泄漏。
5. 3.连接到远程主机
在客户端计算机上,打开提示并键入jvisualvm以打开VisualVM工具。
接下来,我们必须在VisualVM中添加一个远程主机。当启用目标JVM来允许来自另一台具有J2SE 6或更高版本的计算机的远程连接时,我们启动Java VisualVM工具并连接到远程主机。如果与远程主机的连接成功,我们将看到Java应用程序在目标JVM中运行,如下所示:

要在应用程序上运行内存分析器,我们只需要在侧面板中双击其名称即可。
现在我们已经设置了内存分析器,让我们研究一个存在内存泄漏问题的应用程序,我们将其称为MemLeak。
6. MemLeak
当然,有很多方法可以在Java中创建内存泄漏。为简单起见,我们在HashMap中将一个类定义为键,但不会定义equals()和hashcode()方法。
HashMap是Map接口的哈希表实现,因此它定义了键和值的基本概念:每个值都与唯一键相关,因此,如果给定键值对的键已经存在于HashMap中,其当前值将被替换。
我们的键类必须提供equals()和hashcode()方法的正确实现。没有它们,就不能保证会生成一个好的密钥。
通过不定义equals()和hashcode()方法,我们一次又一次地向HashMap添加相同的键,而不是按原样替换键,HashMap不断增长,无法识别这些相同的键,并且抛出OutOfMemoryError。
MemLeak类:
package com.post.memory.leak;
import java.util.Map;
public class MemLeak {
public final String key;
public MemLeak(String key) {
this.key =key;
}
public static void main(String args[]) {
try {
Map map = System.getProperties();
for(;;) {
map.put(new MemLeak("key"), "value");
}
} catch(Exception e) {
e.printStackTrace();
}
}
}
注意:内存泄漏不是由于第14行中的无限循环引起的:无限循环可能会导致资源耗尽,但不会导致内存泄漏。如果我们正确实现了equals()和hashcode()方法,那么即使在无限循环中,代码也可以正常运行,因为HashMap中只有一个元素。
(对于感兴趣的人,这里有一些(有意地)创建泄漏的替代方法。)
7.使用Java VisualVM
使用Java VisualVM,我们可以监视Java Heap的内存并确定其行为是否存在内存泄漏。
这是MemLeak的Java堆分析器初始化后的图形表示(回想我们对每一代的讨论):
仅在30秒之后,老年期几乎已满,这表明即使使用Full GC,老年期也在增长,这显然是内存泄漏的迹象。
检测泄漏原因的一种方法如下图所示(单击放大),该图是使用Java VisualVM和heapdump生成的。在这里,我们看到50%的Hashtable $ Entry对象在堆中,第二行指向MemLeak类。因此,内存泄漏是由MemLeak类中使用的哈希表引起的。
最后,观察OutOfMemoryError之后的Java堆,在那里,年轻一代和老一代完全填满了。
8.结论
内存泄漏是要解决的最困难的Java应用程序问题之一,因为症状多种多样且难以重现。在这里,我们概述了一种逐渐发现内存泄漏并确定其来源的方法。但最重要的是,请仔细阅读错误消息并注意堆栈跟踪-并非所有的泄漏都像它们看上去那样简单。
9.附录
与Java VisualVM一起,还有其他一些工具可以执行内存泄漏检测。许多泄漏检测器通过拦截对内存管理例程的调用来在库级别进行操作。例如,HPROF是与Java 2 Platform Standard Edition(J2SE)捆绑在一起的简单命令行工具,用于堆和CPU分析。 HPROF的输出可以直接分析或用作其他工具(如JHAT)的输入。当我们使用Java 2 Enterprise Edition(J2EE)应用程序时,有许多更友好的堆转储分析器解决方案,例如用于Websphere应用程序服务器的IBM Heapdumps。
原文:...
作者:Jose Ferreirade Souza Filho
翻译者:艾玛(Emma)
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-359705-2.html
看看岛礁建设中还存在什么不足之处
╯□╰)o