最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2014年04月28日 08:37:04   作者:  
這篇文章主要介紹了Java中典型的內(nèi)存泄露問題和解決方法,典型的內(nèi)存泄露例子是一個沒有實(shí)現(xiàn)hasCode和 equals方法的Key類在HashMap中保存的情況,可以通過實(shí)現(xiàn)Key類的equals和hasCode方法解決這種內(nèi)存泄漏問題,需要的朋友可以參考下

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

復(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í)行程序會得到如下結(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í)際場景中,你怎么查找內(nèi)存泄露?
A:通過以下代碼獲取線程ID

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

C:\>jps
5808 Jps
4568 MemoryLeak
3860 Main

通過命令行打開jconsole

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

C:\>jconsole 4568

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

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

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



相關(guān)文章

  • mybatis多數(shù)據(jù)源動態(tài)切換的完整步驟

    mybatis多數(shù)據(jù)源動態(tài)切換的完整步驟

    這篇文章主要給大家介紹了關(guān)于mybatis多數(shù)據(jù)源動態(tài)切換的完整步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • SpringSecurity根據(jù)自定義異常返回登錄錯誤提示信息(賬戶鎖定)

    SpringSecurity根據(jù)自定義異常返回登錄錯誤提示信息(賬戶鎖定)

    本文介紹了在SpringSecurity中根據(jù)自定義異常返回登錄錯誤提示信息的方法,特別是在賬戶鎖定時,通過記錄輸錯次數(shù)、重寫校驗(yàn)方法并拋出自定義異常,感興趣的可以了解一下
    2025-01-01
  • SpringMVC和Spring的配置文件掃描包詳解

    SpringMVC和Spring的配置文件掃描包詳解

    這篇文章主要介紹了SpringMVC和Spring的配置文件掃描包,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-05-05
  • 詳解SpringCloud eureka服務(wù)狀態(tài)監(jiān)聽

    詳解SpringCloud eureka服務(wù)狀態(tài)監(jiān)聽

    這篇文章主要介紹了詳解SpringCloud eureka服務(wù)狀態(tài)監(jiān)聽,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • Java計(jì)算兩個時間相差的秒數(shù)怎么算

    Java計(jì)算兩個時間相差的秒數(shù)怎么算

    這篇文章主要介紹了Java計(jì)算兩個時間相差的秒數(shù),通過實(shí)例代碼補(bǔ)充介紹了Java 獲取兩個時間的時間差(時、分、秒)問題,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • Java中 log4j日志級別配置詳解

    Java中 log4j日志級別配置詳解

    這篇文章主要介紹了Java中 log4j日志級別配置詳解,需要的朋友可以參考下
    2018-01-01
  • 使用sharding-jdbc實(shí)現(xiàn)水平分庫+水平分表的示例代碼

    使用sharding-jdbc實(shí)現(xiàn)水平分庫+水平分表的示例代碼

    本文主要介紹了使用sharding-jdbc實(shí)現(xiàn)水平分庫+水平分表,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Java中HashMap如何解決哈希沖突

    Java中HashMap如何解決哈希沖突

    本文主要介紹了Java中HashMap如何解決哈希沖突,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • MybatisPlus自帶的queryWrapper實(shí)現(xiàn)時間倒序方式

    MybatisPlus自帶的queryWrapper實(shí)現(xiàn)時間倒序方式

    這篇文章主要介紹了MybatisPlus自帶的queryWrapper實(shí)現(xiàn)時間倒序方式,具有很好的參考價值,希望對的有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Spring Boot Admin監(jiān)控服務(wù)如何使用

    Spring Boot Admin監(jiān)控服務(wù)如何使用

    這篇文章主要介紹了Spring Boot Admin監(jiān)控服務(wù)如何使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04

最新評論

邯郸市| 青河县| 牟定县| 泸溪县| 商南县| 彰武县| 诏安县| 南雄市| 百色市| 常宁市| 怀集县| 渝中区| 夹江县| 嵊州市| 南和县| 安溪县| 鹤壁市| 正蓝旗| 囊谦县| 灵武市| 隆安县| 通城县| 旅游| 台南市| 运城市| 黄陵县| 西平县| 柘荣县| 永仁县| 瓦房店市| 怀来县| 临邑县| 会宁县| 瑞金市| 温宿县| 明水县| 汝城县| 财经| 湖口县| 哈巴河县| 枝江市|