最近了解了一下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的内存分配,以及定位到代码问题的所在!!!
来源:oschina
链接:https://my.oschina.net/u/4397276/blog/4142979