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的内存分配,以及定位到代码问题的所在!!!