理论上 Java 因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是 Java 被

广泛使用于服务器端编程的一个重要原因);然而在实际开发中,可能会存在无

用但可达的对象,这些对象不能被 GC 回收,因此也会导致内存泄露的发生。例如

Hibernate 的 Session(一级缓存)中的对象属于持久态,垃圾回收器是不会回收

这些对象的,然而这些对象中可能存在无用的垃圾对象,如果不及时关闭(close)

或清空(flush)一级缓存就可能导致内存泄露。下面例子中的代码也会导致内存

泄露。

import java.util.Arrays;

import java.util.EmptyStackException;

public class MyStack<T> {

private T[] elements;

private int size = 0;

private static final int INIT_CAPACITY = 16;

public MyStack() {

elements = (T[]) new Object[INIT_CAPACITY];

}

public void push(T elem) {

ensureCapacity();

elements[size++] = elem;

}

public T pop() {

if(size == 0)

throw new EmptyStackException();

return elements[--size];

}

private void ensureCapacity() {

if(elements.length == size) {

elements = Arrays.copyOf(elements, 2 * size + 1);

}

}

}

第 235 页 共 485 页上面的代码实现了一个栈(先进后出(FILO))结构,乍看之下似乎没有什么明

显的问题,它甚至可以通过你编写的各种单元测试。然而其中的 pop 方法却存在

内存泄露的问题,当我们用 pop 方法弹出栈中的对象时,该对象不会被当作垃圾

回收,即使使用栈的程序不再引用这些对象,因为栈内部维护着对这些对象的过

期引用(obsolete reference)。在支持垃圾回收的语言中,内存泄露是很隐蔽的,

这种内存泄露其实就是无意识的对象保持。如果一个对象引用被无意识的保留起

来了,那么垃圾回收器不会处理这个对象,也不会处理该对象引用的其他对象,

即使这样的对象只有少数几个,也可能会导致很多的对象被排除在垃圾回收之外,

从而对性能造成重大影响,极端情况下会引发 Disk Paging(物理内存与硬盘的虚

拟内存交换数据),甚至造成 OutOfMemoryError。

最新文章

  1. iOS 统计App 的代码总行数
  2. Effective Java 读书笔记之九 并发
  3. UIkit框架之UIPickerView
  4. 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
  5. eclipse进行开发
  6. Ubuntu的which、whereis、locate和find命令
  7. handlebar.js使用
  8. Android Studio中使用Git进行代码管理(分支、合并)
  9. plt库
  10. Spring MVC 注解
  11. Flask蓝图
  12. Docker Dockerfile指令
  13. 【SQL】group by 和order by 的区别。
  14. QueryRunner类的八种结果处理集
  15. Daily Scrum - 11/24
  16. memcached(一):linux下memcached安装以及启动
  17. 模拟QQ分组
  18. 用curl去探测接口是否正常返回结果,若没有正常返回则触发报警
  19. 15、Java并发编程:Callable、Future和FutureTask
  20. opencv——pcb上找圆mark点(模板匹配)

热门文章

  1. 手把手教你vmware导入centos7虚拟机
  2. awvas启动不起来解决方案
  3. Ibgreslock漏洞利用
  4. 数据分析工具那么多,掌握Smartbi这一个就够了!
  5. DBCHM -最简单、最实用的数据库文档生成工具
  6. Ubuntu更新命令无法执行的,下一步该怎么办?
  7. win7重装系统过程关机 电脑开机黑屏 硬盘无法识别 无法使用u盘启动
  8. 『无为则无心』Python日志 — 67、logging日志模块处理流程
  9. WIN10:显示文件后缀.exe
  10. docker学习笔记(6)——docker场景问题汇总(centos7 由于内核版本低带来的一系列问题,docker彻底卸载,安装、启动日志报错分析)