Java中典型的内存泄露问题和解决方法
来源:互联网 发布:access 多少条数据 编辑:程序博客网 时间:2024/05/21 06:24
这篇文章主要介绍了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中的内存泄露及解决方法示例
- 浅谈Java编程中的内存泄露情况
0 0
- Java中典型的内存泄露问题和解决方法
- Java中典型的内存泄露问题和解决方法
- “内存泄露”问题的分析和解决方法
- C++中典型的内存泄露
- ATS插件开发中内存泄露问题的解决方法探讨
- Java中内存泄露问题
- 一个C语言典型的内存泄露问题
- Typical memory leak (C++中典型的内存泄露)
- JAVA的内存泄露问题
- Java的内存泄露问题
- Java中内存泄露和内存溢出的区别
- Java中隐藏的this变量和局部变量可能引发的内存泄露问题
- 内存泄露的部分原因和解决方法
- JAVA中内存溢出和内存泄露
- Android内存泄露检测工具和实际开发中遇到的内存泄露问题解析
- JAVA程序中也可能会发生内存泄露的问题
- Java中内部类的内存泄露问题
- Qt中内存泄露和退出崩溃的问题
- IOS基本手势介绍
- 关系型数据库/非关系型数据库
- Navicat Premium数据库管理工具
- Unity 常用常找的东西存放
- [LeetCode325] Maximum Size Subarray Sum Equals k
- Java中典型的内存泄露问题和解决方法
- 基于jquery封装的一个调色板,用到了Deferred对象回调
- Angularjs全局Modal
- 个人对container_of宏的理解
- MylSQL索引
- mac os源码编译MYSQL
- CentOS 设置 svn 提交后自动自动更新到 web 目录
- CentOS6.5安装Tab增强版:bash-completion 自动补全
- 华为机试——坐标移动