首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >java.lang.OutOfMemoryError,即使有很多

java.lang.OutOfMemoryError,即使有很多
EN

Stack Overflow用户
提问于 2012-12-08 07:45:27
回答 4查看 23.2K关注 0票数 7

我正在尝试将一个2.5 my的txt文件读取到我的应用程序中。我正在运行Win7 x64,并且有43 of的内存可用(总共64 of )。我尝试使用-Xmx、-XX:MaxParmSize、-XX:ParmSize等,但这些都不会影响错误。我还能尝试什么呢?这个错误看起来非常奇怪,因为我肯定有足够的堆空间可用。

代码语言:javascript
复制
Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
    at java.util.Arrays.copyOf(Unknown Source)
    at java.lang.AbstractStringBuilder.expandCapacity(Unknown Source)
    at java.lang.AbstractStringBuilder.ensureCapacityInternal(Unknown Source)
    at java.lang.AbstractStringBuilder.append(Unknown Source)
    at java.lang.StringBuilder.append(Unknown Source)
    at j.utilities.IO.loadString(IO.java:187)
    at j.utilities.IO.loadString(IO.java:169)
    at city.PreProcess.main(PreProcess.java:78)

我在跑步

代码语言:javascript
复制
java version "1.7.0_09"
Java(TM) SE Runtime Environment (build 1.7.0_09-b05)
Java HotSpot(TM) 64-Bit Server VM (build 23.5-b02, mixed mode)

在此之前非常感谢。

==============应答==============

好的,我只是测试了一下

代码语言:javascript
复制
StringBuilder sb = new StringBuilder();
for ( int i=1; i<Integer.MAX_VALUE; i++ )
    sb.append("x");

并得到了

代码语言:javascript
复制
Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
at java.util.Arrays.copyOf(Unknown Source)
...

因此,实际上是StringBuilder试图构建一个比Integer.MAX_VALUE更大的数组。

如果感兴趣的话

代码语言:javascript
复制
StringBuilder sb = new StringBuilder();
int i=1;
try {
    for ( ; i<Integer.MAX_VALUE; i++ )
        sb.append("x");
} catch ( OutOfMemoryError e ) {
    System.out.println(i); // OUTPUT: 1207959551
    System.out.println(Integer.MAX_VALUE); // OUTPUT: 2147483647
}

使用StringBuilder,您可以累积1,207,959,550个字符-远远少于Integer.MAX_VALUE。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-12-08 07:50:22

您正在尝试分配的数组太大。这是因为您正在尝试创建一个非常长的字符串。由于数组由整数编制索引,因此一个数组不能有多个Integer.MAX_VALUE元素。即使你的堆非常大,你也不能分配一个超过Integer.MAX_VALUE元素的数组,因为你不能使用Integer索引它的元素。有关更多详细信息,请参阅Do Java arrays have a maximum size?

票数 10
EN

Stack Overflow用户

发布于 2012-12-08 08:42:19

您可以创建一个具有大小的新StringBuilder,例如

代码语言:javascript
复制
    StringBuilder sb = new StringBuilder(Integer.MAX_VALUE);

问题是,您正在尝试读取的文件比StringBuilder数组中可以包含的文件大。您有几个选项,例如:

1)你真的需要一次将整个文件读入内存吗?如果是这样,您将不得不将其读入几个StringBuilders中。

2)按顺序处理文件。

3)读入压缩结构,需要的部分解压。

票数 3
EN

Stack Overflow用户

发布于 2012-12-08 07:53:05

您应该查看java命令的-Xmsn选项。

它指定内存分配池的初始大小。

编辑:我看你已经这么做了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13772802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档