一、概述
什么是内存泄漏?如果GC无法回收内存中不再使用的对象,则定义为内存有泄露
二、详解
出现内存泄漏的主要原因:
1. 未关闭的资源类
2.未正确实现equals()和hashCode()
3.非静态内部类
4.重写了finalize()的类
5.针对长字符串调用String.intern()
6.ThreadLocal的误用
7.类的静态变量
1. 未关闭的资源类。当我们在程序中打开一个新的流或者是新建一个网络连接的时候,JVM都会为这些资源类分配内存做缓存,常见的资源类有网络连接,数据库连接以及IO流。值得注意的是,如果在业务处理中异常,则有可能导致程序不能执行关闭资源类的代码内存泄露的例子java,因此最好按照下面的做法处理资源类
<pre>
`public void handleResource() {
try {
// open connection
// handle business
} catch (Throwable t) {
// log stack
} finally {
// close connection
}
pre>
2.未正确实现equals()和hashCode()。
假如有下面的这个类
<pre data-tool="mdnice编辑器">
`public class Person {
public String name;
public Person(String name) {
this.name = name;
}
}
`</pre>
并且如果在程序中有下面的操作
<p><pre data-tool="mdnice编辑器">@Test
public void givenMapWhenEqualsAndHashCodeNotOverriddenThenMemoryLeak() {
Map map = new HashMap();
for(int i=0; i