java内存问题排查及分析

时间:2023-03-09 05:58:10
java内存问题排查及分析

最近了解了一下jdk对于jvm分析工具的使用,下面通过一个简单的列子介绍一下,以下内容部分来自其他帖子。

下面这段代码明显有问题(从网上抄的)

 import java.util.HashMap;
import java.util.Map; public class MemoryLeak { public static void main(String[] args) {
Map<Key, String> map = new HashMap<Key, String>(1000); int counter = 0;
while (true) {
// creates duplicate objects due to bad Key class
map.put(new Key("dummyKey"), "value");
counter++;
if (counter % 1000 == 0) {
System.out.println("map size: " + map.size());
System.out.println("Free memory after count " + counter
+ " is " + getFreeMemory() + "MB"); sleep(1000);
} }
} // inner class key without hashcode() or equals() -- bad implementation
static class Key {
private String key; public Key(String key) {
this.key = key;
} } //delay for a given period in milli seconds
public static void sleep(long sleepFor) {
try {
Thread.sleep(sleepFor);
} catch (InterruptedException e) {
e.printStackTrace();
}
} //get available memory in MB
public static long getFreeMemory() {
return Runtime.getRuntime().freeMemory() / (1024 * 1024);
} }

执行这个代码以后通过JDK自带工具jconsole查看jvm的使用情况

java内存问题排查及分析

连接后查看果然和猜想的一样堆内存的使用蹭蹭蹭的往上窜

java内存问题排查及分析

然后通过jps命令找到对应进程的id

java内存问题排查及分析

通过进程的ID把内存dump下来

java内存问题排查及分析

然后通过jvisualvm工具分析该文件

java内存问题排查及分析

发现HashMap的实例数很多。

可以通过 jhat -port 5000 heap.hrof 命令 启动服务我们就可以在浏览器中,通过http://localhost:5000/进行访问,如下所示

java内存问题排查及分析

java内存问题排查及分析

通过以上的手段分析 可以或多或少的了解jvm的内存分配,以及定位到代码问题的所在!!!