void abc() {FileInputStream fin = new FileInputStream(strPathName);
}
解决方案 »
- 为什么数据库表的字段经过更新后的值仍然没有改变?代码见内容
- Bitmap的疑惑
- android通过jni调用c或c++读取assets下的文件吗?
- 被方向键选中的按钮变成橘色,这是什么事件
- 跪求大侠帮忙,createNormalSurfaceLocked() failed!!!
- 获取背景问题
- Android里怎么实现TextView里面的文字一个一个逐渐显示出来的动画效果
- android2.1中如何设置睡眠时间
- Android 入门级通讯录,一选取头像就崩溃,求大神帮忙修改下
- 有没有安卓没有安装成功的
- 求助关于android studio
- 自定义viewgroup的FadingEdge属性问题
FileInputStream fin = new FileInputStream(strPathName);
的时候,最后不是应该
fin.close();的吗?
按照 java 的说法 就是 local object ,会自动被 垃圾收集器 保持,当没有对象引用 就自动释放
这个引用空了 被回收了
但是打开的流 还是开启状态 必须手动close
当我们在程序中创建一个IO流对象的时候,同时系统也会创建
一个叫做流的东西,在这种情况下,计算机内存中实际产生了两个事物,一个是java程
序中类的实例对象,一个是系统本身产生的某种资源,而java垃圾回收器只能管理程序
中类的实例对象,没办法去管理系统产生的资源,所以程序需要调用close方法,去通
知系统释放其自身产生的资源。
Yes, 我刚才发现你说的应该是对的。// Begin -- 我在网上搜索的
public void close()
throws IOException 关闭此输入流并释放与该流关联的所有系统资源。 InputStream 的 close 方法不执行任何操作。垃圾回收器,只对于类实例对象有用,而对于系统产生的资源占用没有作用// End -- 我在网上搜索的
这样来看的确是会有内存泄漏的,不过该内存泄漏不是在类实例对象,而是系统资源。
但是现在又有一个新问题,就是网上给的方法只是给人一个感性上的认识,而没有实际验证该结果。谁有办法可以在ubuntu上面验证上述的代码的确有内存泄漏呢?
若有的话,请帖出来。LZ我要是研究好了的话也会帖出来的。
FileInputStream fin = new FileInputStream(strPathName);
}
fin对new FileInputStream(strPathName)内存块的引用,注意fin是局部的,fin离开其作用域后,fin无效,也即new FileInputStream(strPathName)内存块没有任何对象引用它,这时jvm会自动释放它。因此对于java而言,不会内存泄露。但对于c++来说,肯定会泄露。
void abc() {
FileInputStream fin = new FileInputStream(strPathName);
}
需加上fin.close(),否则io资源得不到释放,对于7X24小时的系统,如果频繁FileInputStream fin = new FileInputStream(strPathName);而不close,肯定会使系统io资源耗尽。
是的,我记得也是这样的,lz可以试试不写close的话,那个文件在别的地方是用不了的。
GC管理的就是JAVA的对象但是, FileInputStream是要打开文件的, 谁实现的呢?IoBridge类, open方法, 实际是jni调用,
所以, 不调用FileInputStream.close()的话, 尽管JAVA对象都被GC了,但是fd文件描述符(native层)不会主动释放,造成内存泄露(打开文件必然占内存)
对对对 fin这个流对象不会泄露 但是内存中流的缓冲区还是会泄露的
测试代码package com.test;import java.io.FileInputStream;
import java.io.FileNotFoundException;public class TestGC { private static String FILE_PATH = "E:\\test.txt"; /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub int times = Integer.MAX_VALUE; for (int i = 0; i < times; i++) {
test();
System.out.println("Time: " + i);
} } public static void test() {
try {
FileInputStream fin = new FileInputStream(FILE_PATH);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}}
结果只是CPU使用率提高,但内存使用率基本没变。