国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Java > 正文

Java中典型的內(nèi)存泄露問(wèn)題和解決方法

2019-11-26 15:31:29
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

Q:在Java中怎么可以產(chǎn)生內(nèi)存泄露?
A:Java中,造成內(nèi)存泄露的原因有很多種。典型的例子是一個(gè)沒(méi)有實(shí)現(xiàn)hasCode和
equals方法的Key類在HashMap中保存的情況。最后會(huì)生成很多重復(fù)的對(duì)象。所有的內(nèi)存泄露
最后都會(huì)拋出OutOfMemoryError異常,下面通過(guò)一段簡(jiǎn)短的通過(guò)無(wú)限循環(huán)模擬內(nèi)存泄露
的例子說(shuō)明一下。

復(fù)制代碼 代碼如下:

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);
 }

}

結(jié)果如下:

復(fù)制代碼 代碼如下:

map size: 1000
Free memory after count 1000 is 4MB
map size: 2000
Free memory after count 2000 is 4MB
map size: 1396000
Free memory after count 1396000 is 2MB
map size: 1397000
Free memory after count 1397000 is 2MB
map size: 1398000
Free memory after count 1398000 is 2MB
map size: 1399000
Free memory after count 1399000 is 1MB
map size: 1400000
Free memory after count 1400000 is 1MB
map size: 1401000
Free memory after count 1401000 is 1MB
.....
.....
map size: 1452000
Free memory after count 1452000 is 0MB
map size: 1453000
Free memory after count 1453000 is 0MB
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
 at java.util.HashMap.addEntry(HashMap.java:753)
 at java.util.HashMap.put(HashMap.java:385)
 at MemoryLeak.main(MemoryLeak.java:10)

Q:怎么解決上面的內(nèi)存泄露?
A:實(shí)現(xiàn)Key類的equals和hasCode方法。
 

復(fù)制代碼 代碼如下:

    .....
static class Key {
 private String key;

 public Key(String key) {
  this.key = key;
 }

 
 @Override
 public boolean equals(Object obj) {

  if (obj instanceof Key)
   return key.equals(((Key) obj).key);
  else
   return false;

 }

 @Override
 public int hashCode() {
  return key.hashCode();
 }
}
.....
 

 重新執(zhí)行程序會(huì)得到如下結(jié)果:
 

復(fù)制代碼 代碼如下:

 map size: 1
Free memory after count 1000 is 4MB
map size: 1
Free memory after count 2000 is 4MB
map size: 1
Free memory after count 3000 is 4MB
map size: 1
Free memory after count 4000 is 4MB
...
Free memory after count 73000 is 4MB
map size: 1
Free memory after count 74000 is 4MB
map size: 1
Free memory after count 75000 is 4MB
 

Q:在實(shí)際場(chǎng)景中,你怎么查找內(nèi)存泄露?
A:通過(guò)以下代碼獲取線程ID

復(fù)制代碼 代碼如下:

C:/>jps
5808 Jps
4568 MemoryLeak
3860 Main

通過(guò)命令行打開(kāi)jconsole

復(fù)制代碼 代碼如下:

C:/>jconsole 4568

實(shí)現(xiàn)了hasCode和equals的Key類和沒(méi)有實(shí)現(xiàn)的圖表如下所示:

沒(méi)有內(nèi)存泄露的:

造成內(nèi)存泄露的:



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 兰考县| 镇雄县| 共和县| 连城县| 会东县| 晴隆县| 湘潭市| 牡丹江市| 闸北区| 南涧| 武鸣县| 页游| 台安县| 南川市| 和田市| 铜梁县| 多伦县| 二手房| 清原| 榆林市| 崇礼县| 华坪县| 四平市| 民丰县| 泸溪县| 山西省| 扬州市| 武强县| 方山县| 贵阳市| 武威市| 尚志市| 青冈县| 东乌珠穆沁旗| 张家川| 礼泉县| 阳谷县| 时尚| 德兴市| 米脂县| 岐山县|