java 内存泄漏
程序员文章站
2024-01-31 16:01:16
...
Java内存泄漏一边分为下面两种情况。
一:内存对象明明已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用)
例子:
pop方法中弹出的对象即使程序不再引用这些对象,但是栈内部维护着这些对象的过期引用,所以它们也不会被垃圾回收。
修复的方法:
二:一个内存对象的生命周期超出了程序需要它的时间长度
例子:
在这段代码中,FileSearch类中有一个函数hasString,用来判断文档中是否含有指定的字符串。流程是先将mFile加载到内存中,然后进行判断。但是,这里的问题是,将content声明为了实例变量,而不是本地变量。于是,在此函数返回之后,内存中仍然存在整个文件的数据。而很明显,这些数据我们后续是不再需要的,这就造成了内存的无故浪费。
修复的方法:
一:内存对象明明已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用)
例子:
import java.util.*; public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements[size++] = e; } public Object pop() { if (size == 0) throw new EmptyStackException(); return elements[--size]; } /** * Ensure space for at least one more element, roughly * doubling the capacity each time the array needs to grow. */ private void ensureCapacity() { if (elements.length == size) elements = Arrays.copyOf(elements, 2 * size + 1); } }
pop方法中弹出的对象即使程序不再引用这些对象,但是栈内部维护着这些对象的过期引用,所以它们也不会被垃圾回收。
修复的方法:
public Object pop() { if (size == 0) throw new EmptyStackException(); Object result = elements[--size]; elements[size] = null; //Eliminate obsolete reference return result; }
二:一个内存对象的生命周期超出了程序需要它的时间长度
例子:
1 public class FileSearch{ 2 3 private byte[] content; 4 private File mFile; 5 6 public FileSearch(File file){ 7 mFile = file; 8 } 9 10 public boolean hasString(String str){ 11 int size = getFileSize(mFile); 12 content = new byte[size]; 13 loadFile(mFile, content); 14 15 String s = new String(content); 16 return s.contains(str); 17 } 18 }
在这段代码中,FileSearch类中有一个函数hasString,用来判断文档中是否含有指定的字符串。流程是先将mFile加载到内存中,然后进行判断。但是,这里的问题是,将content声明为了实例变量,而不是本地变量。于是,在此函数返回之后,内存中仍然存在整个文件的数据。而很明显,这些数据我们后续是不再需要的,这就造成了内存的无故浪费。
修复的方法:
1 public class FileSearch{ 2 3 4 private File mFile; 5 6 public FileSearch(File file){ 7 mFile = file; 8 } 9 10 public boolean hasString(String str){ 11 int size = getFileSize(mFile); 12 private byte[] content = new byte[size]; 13 loadFile(mFile, content); 14 15 String s = new String(content); 16 return s.contains(str); 17 } 18 }
上一篇: 前端优化方法 web