【发布时间】:2011-08-29 23:24:35
【问题描述】:
我之前也问过类似的问题:Java String Memory Leak
但我不知道该问什么:
这是我写的另一段代码:
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.InputStreamReader;
public class TestString {
public static int readLineXX(BufferedReader br) throws Exception {
String s = br.readLine();
if ( s == null ) return 0;
return 1;
}
public static void main(String args[]) {
while (true) {
try {
FileInputStream fstream = new FileInputStream("bigfile.txt");
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
while ( readLineXX (br)!= 0) {
//System.out.print(".");
}
br.close();
in.close();
fstream.close();
} catch (Exception e) {
}
}
}
}
由于 Java 中的字符串是不可变的,String s 是否会被垃圾回收。
我使用-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails 选项运行了这段代码很长时间,它运行良好。
这是我的主要应用程序的小 sn-p 代码,我认为这是泄漏并导致OOM。
bigfile.txt 在 1GB 附近。
【问题讨论】:
-
如果您在主应用程序中收到 OutOfMemoryError,但在运行时却没有收到,是什么让您认为是您的应用程序的这一部分导致了错误?如果您可以在一个小程序中重现它,您将更容易诊断问题。由于您没有重现错误,我怀疑此代码与您的应用程序之间存在关键差异。
-
我会让您从 readLineXX 返回的内容为“return s == null ? 0 : 1;”。但是,要回答这个问题,如果这没有泄漏,那么您的问题就在其他地方。我们无法推测您的代码可能有什么问题。我们会写一些 Core Java 大小的东西......
标签: java memory-leaks garbage-collection out-of-memory