【发布时间】:2017-04-12 06:41:49
【问题描述】:
BlueJ 的 Java 堆空间有问题。 我编写了一个程序,它将 .txt 读入字符串并遍历字符串的所有字符并做一些事情(猜想这不是很重要)。一些 .txt 文件非常大(大约 2 亿)。 如果我尝试使用这些 .txt 执行程序,我会得到这个“线程中的异常”AWT-EventQueue-0“java.lang.OutOfMemoryError:Java 堆空间”错误代码。我将 bluej.def 中的 bluej.windows.vm.args 和 bluej.windows.vm.args 增加到 8gb。它仍然不起作用。但我实际上猜想即使是 2 亿个字符的字符串也不会超过这个限制。 这是我在 .txt 中阅读的代码
try
{
FileReader reader = new FileReader(input.getText());
BufferedReader bReader = new BufferedReader(reader);
String parcour = "";
String line = bReader.readLine();
while(line != null)
{
parcour += line;
line = bReader.readLine();
}
input.getText() 获取文件路径。 我将非常感谢您的回答。谢谢 :) - Cyaena
【问题讨论】:
-
您将整个文件存储在
parcour变量中。这会吃掉很多内存。另外,在将数据附加到字符串时考虑使用StringBuilder -
但实际上一个字符串不应该吃那么多内存,不是吗?我必须使用 StringBuilder 有什么好处?我该如何大致设置?
-
我不是解释内存使用的合适人选,而是存储 2 亿。记忆中的字符听起来不是很有希望。在循环中连接字符串时,
StringBuilder更快。你想用这 2 亿行做什么?也许这可以帮助你:stackoverflow.com/questions/10202905/…更多关于内存使用的信息:javamex.com/tutorials/memory/string_memory_usage.shtml -
好吧,我实际上猜它是 200MB,可能会更多,但不是 8GB。这是一场比赛,其中有一些例子。较小的例子没有任何问题。我的算法运行良好,运行时也不错。但是对于这些很棒的文件,是的,我得到了这个错误。
-
也许如果您解释您的用例,其他人可以帮助解决问题。您不能在 while 循环中处理一行而不是将所有内容都存储在变量中吗?
标签: java heap-memory ram bluej