黑马程序员技术交流社区

标题: 关于JAVA内存泄露和资源未释放的问题 [打印本页]

作者: 水蓝    时间: 2014-3-16 23:04
标题: 关于JAVA内存泄露和资源未释放的问题
本帖最后由 水蓝 于 2014-3-18 10:24 编辑

问题1:
编程学习过程中,老师一直在强调JAVA中也存在内存泄漏。能不能够明确的举出相关事例,说明在什么情况下,会发生泄漏?

问题2:
正在运行的文件流资源没有被正常释放。会不会产生内存泄漏?

如果资源未释放存在内存泄露,那除了资源未释放的场景,还有没有其它场景会导致内存泄漏?
如果资源未释放不存在内存泄露,那相同文件是否能够被其它虚拟机进程调用?



作者: dapeng111    时间: 2014-3-17 00:44
问题1:定义一个数组如:int[] arr = new int[5].当你要访问arr[5]的时候就发生了内存泄露。你说的资源没有释放也是会发生内存泄露的一种吧。
问题2:如果正在运行的文件流资源没有被正常释放。不一定会造成内存泄露。但是如果继续打开多个资源,而不关闭的话,把分配给虚拟机的内存资源给占用完了,这样就会造成内存泄露的。因为分给虚拟机的内存大小是固定的。
如果资源未释放不存在内存泄露,那相同文件是否能够被其它虚拟机进程调用?
这个问题,如果你说的这个指在硬盘上存的文件,那是可以的。如果这个文件你指的是已经被现在的虚拟机调用的内存中的文件的话,是不可以的。因为如果你再调用一个虚拟机的话,会再在电脑的内存中分配给一块区域给这个新的虚拟机。这两个虚拟机内存地址是不同的。

作者: 水蓝    时间: 2014-3-17 01:22
dapeng111 发表于 2014-3-17 00:44
问题1:定义一个数组如:int[] arr = new int[5].当你要访问arr[5]的时候就发生了内存泄露。你说的资源没有 ...

多谢。先纠正一下:
关于问题1的回答:
int[] arr = new int[5]
抛的异常是数组下标越界异常java.lang.ArrayIndexOutOfBoundsException,好像跟内存泄露没有直接联系的。内存泄漏,当时应该不报异常,直到内存达到虚拟机上限,抛OutOfMemoryError异常吧。

关于问题2的回复有以下疑点:
如果文件没有被释放,文件应该是被程序一直引用吧?那为什么不一定造成内存泄露呢?这个引用是在哪里被保持的?

关于:"如果继续打开多个资源,而不关闭的话,把分配给虚拟机的内存资源给占用完了,这样就会造成内存泄露的。因为分给虚拟机的内存大小是固定的。"
虚拟机默认内存空间分配是64M,如果我需要拷贝2G的视频文件。那是为了读入2G的文件,我得把虚拟机内存上调至2G以上呢?:)


作者: dapeng111    时间: 2014-3-17 10:08
原来以为ArrayIndexOutOfBoundsException也是内存泄露的一种方式,但是又查了一下,才知道:内存泄漏专指“内存空间使用完毕之后未回收”这种情况。
如果是拷贝一个文件文件的话,要么一次读写一个字符。
要么用缓冲字符流的形式,一次读写一行字符
要么用定义一个字符数组的形式,一次读写定义数组大小的字符数。
但是无论是用哪种方式,都不会超过默认定义的虚拟机内存的大小的空间,如果每拷贝一个文件,都要调整成2G的空间,系统不疯了:)。


作者: 刘凯旋    时间: 2014-3-17 13:37
我记得在高新技术里张孝祥老师讲到内存泄漏,在Java高新技术_ArrayList_HashSet的比较及Hashcode分析第26个视频自己去看吧




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2