激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java中典型的內存泄露問題和解決方法

Java中典型的內存泄露問題和解決方法

2019-11-21 14:12Java教程網 JAVA教程

這篇文章主要介紹了Java中典型的內存泄露問題和解決方法,典型的內存泄露例子是一個沒有實現hasCode和 equals方法的Key類在HashMap中保存的情況,可以通過實現Key類的equals和hasCode方法解決這種內存泄漏問題,需要的朋友可以參考下

Q:在Java中怎么可以產生內存泄露?
A:Java中,造成內存泄露的原因有很多種。典型的例子是一個沒有實現hasCode和
equals方法的Key類在HashMap中保存的情況。最后會生成很多重復的對象。所有的內存泄露
最后都會拋出OutOfMemoryError異常,下面通過一段簡短的通過無限循環模擬內存泄露
的例子說明一下。

 

復制代碼代碼如下:

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

}

 

結果如下:

 

復制代碼代碼如下:

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:怎么解決上面的內存泄露?
A:實現Key類的equals和hasCode方法。
 

復制代碼代碼如下:

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

 

 重新執行程序會得到如下結果:
 

復制代碼代碼如下:

 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:在實際場景中,你怎么查找內存泄露?
A:通過以下代碼獲取線程ID

 

復制代碼代碼如下:

C:\>jps
5808 Jps
4568 MemoryLeak
3860 Main

 

通過命令行打開jconsole

 

復制代碼代碼如下:

C:\>jconsole 4568

 

實現了hasCode和equals的Key類和沒有實現的圖表如下所示:

沒有內存泄露的:
Java中典型的內存泄露問題和解決方法

造成內存泄露的:


Java中典型的內存泄露問題和解決方法

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品视频一区二区噜噜 | 国产一级毛片高清视频完整版 | 91精品动漫在线观看 | 青草伊人网 | 午夜伦情电午夜伦情电影 | 欧美一级全黄 | 欧美激情猛片xxxⅹ大3 | 啪啪毛片 | 国产精品一 | 在线a毛片| 成人一级视频在线观看 | 亚洲狠狠入| 日本在线免费观看视频 | 午夜精品成人一区二区 | 黄色片的网站 | 久久生活片| 久久久国产视频 | 欧美男女爱爱视频 | 毛片免费视频播放 | 日本欧美国产 | 在线高清中文字幕 | 91精品国产福利尤物免费 | 久色婷婷 | 黄色影院av | 国产乱淫a∨片免费观看 | 亚洲影视在线观看 | 国产一级一级片 | 成人不卡在线观看 | 网站激情 | 91av在线免费视频 | 中文字幕在线播放一区 | aa级黄色片 | 亚洲91网 | 亚洲精品成人18久久久久 | 成人一级黄色大片 | 中文字幕在线一 | 国产成人午夜精品 | 高清国产午夜精品久久久久久 | 国产亚洲小视频 | 91视频站| 亚洲极色|