Java 中会存在内存泄漏吗,请简单描述?
理论上 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。
最新文章
- iOS 统计App 的代码总行数
- Effective Java 读书笔记之九 并发
- UIkit框架之UIPickerView
- 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
- eclipse进行开发
- Ubuntu的which、whereis、locate和find命令
- handlebar.js使用
- Android Studio中使用Git进行代码管理(分支、合并)
- plt库
- Spring MVC 注解
- Flask蓝图
- Docker Dockerfile指令
- 【SQL】group by 和order by 的区别。
- QueryRunner类的八种结果处理集
- Daily Scrum - 11/24
- memcached(一):linux下memcached安装以及启动
- 模拟QQ分组
- 用curl去探测接口是否正常返回结果,若没有正常返回则触发报警
- 15、Java并发编程:Callable、Future和FutureTask
- opencv——pcb上找圆mark点(模板匹配)
热门文章
- 手把手教你vmware导入centos7虚拟机
- awvas启动不起来解决方案
- Ibgreslock漏洞利用
- 数据分析工具那么多,掌握Smartbi这一个就够了!
- DBCHM -最简单、最实用的数据库文档生成工具
- Ubuntu更新命令无法执行的,下一步该怎么办?
- win7重装系统过程关机 电脑开机黑屏 硬盘无法识别 无法使用u盘启动
- 『无为则无心』Python日志 — 67、logging日志模块处理流程
- WIN10:显示文件后缀.exe
- docker学习笔记(6)——docker场景问题汇总(centos7 由于内核版本低带来的一系列问题,docker彻底卸载,安装、启动日志报错分析)