java内存问题排查及分析

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

 

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

 1 import java.util.HashMap;
 2 import java.util.Map;
 3 
 4 public class MemoryLeak {
 5 
 6  public static void main(String[] args) {
 7   Map<Key, String> map = new HashMap<Key, String>(1000);
 8 
 9   int counter = 0;
10   while (true) {
11        // creates duplicate objects due to bad Key class
12    map.put(new Key("dummyKey"), "value");
13    counter++;
14    if (counter % 1000 == 0) {
15     System.out.println("map size: " + map.size());
16     System.out.println("Free memory after count " + counter
17       + " is " + getFreeMemory() + "MB");
18 
19     sleep(1000);
20    }
21 
22     
23   }
24  }
25 
26  // inner class key without hashcode() or equals() -- bad implementation
27  static class Key {
28   private String key;
29 
30   public Key(String key) {
31    this.key = key;
32   }
33 
34  }
35 
36  //delay for a given period in milli seconds
37  public static void sleep(long sleepFor) {
38   try {
39    Thread.sleep(sleepFor);
40   } catch (InterruptedException e) {
41    e.printStackTrace();
42   }
43  }
44 
45  //get available memory in MB
46  public static long getFreeMemory() {
47   return Runtime.getRuntime().freeMemory() / (1024 * 1024);
48  }
49 
50 }

 

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

 

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

 

 

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

 

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

 

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

 

发现HashMap的实例数很多。

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

 

 

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

 

posted @ 2018-05-24 16:07  happyfresher  阅读(243)  评论(0编辑  收藏  举报