内存泄漏和内存溢出
内存溢出
简单地说内存溢出就是指程序运行过程中申请的内存大于系统能够提供的内存,导致无法申请到足够的内存,于是就发生了内存溢出。
常见的内存溢出
创建的对象太多,在进行垃圾回收之前对象数量达到了最大堆的容量限制造成堆溢出;常量池溢出;虚拟机栈和本地方法栈溢出
场景:是一个没有实现hasCode 和 equals 方法的 Key 类在 HashMap 中保存的情况。最后会生成很多重复的对象
内存泄漏
内存泄漏指程序运行过程中分配内存给临时变量,用完之后却没有被 GC 回收,始终占用着内存,既不能被使用也不能分配给其他程序,于是就发生了内存泄漏。
常见的内存泄露
静态集合类(如 HashMap,Vector)引起的内存泄漏;修改 HashSet 中对象的参数值,且参数是计算哈希值的字段;监听器忘了释放;各种连接(如数据库连接)
比方说 HashMap 当集合里面的对象属性被修改后,再调用 remove() 方法时不起作用
避免内存泄漏的几点建议:
- 尽早释放无用对象的引用。
- 避免在循环中创建对象。
- 使用字符串处理时避免使用
String
,应使用StringBuffer
。 - 尽量少使用静态变量,因为静态变量存放在永久代,基本不参与垃圾回收。
如何定位找到内存泄漏
使用 top 指令,动态的观察进程的动态内存总额。
可以使用 ps、kill 两个命令检测内存使用情况和进行回收。
或者使用 VLD 这个内存泄露检测系统