BlueJ的Java堆空间
我对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亿字符的字符串也不会超过这个限制。 这是我的我在.TXTBlueJ的Java堆空间
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
回答:
在下面的说明中,只有数据的纯内存在范围内。所有额外的内存需求的结构被遗漏。这是更详细的概述。
存储器被在那些线
String parcour = ""; ...
String line = bReader.readLine();
...
parcour += line;
线parcour += line
吃掉编译成类文件作为
new StringBuilder().append(parcour).append(line).toString()
假设parcour
包含大小为10 MB的字符串和line
将大小的2 MB。然后在parcour += line;
分配的内存将是(大约)需要
// creates a StringBuilder object of size 12 MB new StringBuilder().append(parcour).append(line)
// the `.toString()` would generate a String object of size 12 MB
new StringBuilder().append(parcour).append(line).toString()
你的代码之前,新创建的字符串被分配到parcour
约34 MB。
parcour = 10 MB the temporary StringBuilder object = 12 MB
the String fromStringBuilder = 12 MB
------------------------------------------
total 34 MB
一个小的演示片段,表明OutOfMemoryException
比目前预期的要早得多。
OOMString.java
class OOMString { public static void main(String[] args) throws Exception {
String parcour = "";
char[] chars = new char[1_000];
String line = new String(chars);
while(line != null)
{
System.out.println("length = " + parcour.length());
parcour += line;
}
}
}
OOMStringBuilder.java
class OOMStringBuilder { public static void main(String[] args) throws Exception {
StringBuilder parcour = new StringBuilder();
char[] chars = new char[1_000];
String line = new String(chars);
while(line != null)
{
System.out.println("length = " + parcour.length());
parcour.append(line);
}
}
}
两个片段做同样的。他们在parcour
中添加了1000个charcater字符串,直到OutOfMemoryException
被引发。为了加快速度,我们将堆大小限制为10 MB。
的输出java -Xmx10m OOMStringBuilder
length = 2052000 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
java -Xmx10m OOMString
length = 1048000 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
输出当你执行的代码,你会发现,OOMString
需要更多的时间来失效(甚至在更短的长度)比OOMStringBuilder
。
您还需要记住单个字符是两个字节长。如果您的文件包含100个ASCII字符,则它们在内存中占用200个字节。
也许这个小小的演示可以为你解释一点点。
回答:
我也有BlueJ和堆空间错误以及一些问题。就我而言,打开终端会使整个应用程序崩溃。我怀疑这与生成大量输出有关,与您的大型字符串类似。就我而言,我意外地创造了一个无处不在的循环,打破了终端窗口。我不得不删除所有的属性文件。现在BlueJ再次工作,不再发生OutOfMemoryErrors。 我希望这可能对其他情况也有帮助。
以上是 BlueJ的Java堆空间 的全部内容, 来源链接: utcz.com/qa/266848.html