当前位置: 首页 > 面试题库 >

即使有很多java.lang.OutOfMemoryError

屈畅
2023-03-14
问题内容

我正在尝试将2.5GB的txt文件读入我的应用程序。我正在运行Win7 x64,并且有43GB的可用内存(64GB中的可用空间)。我尝试使用-Xmx
-XX:MaxParmSize -XX:ParmSize等。这些都不影响错误。我还能尝试什么?因为我当然有足够的可用堆空间,所以这个错误似乎很奇怪。

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)

我在跑步

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)

非常感谢。

=============答案==============

好,我刚刚用

StringBuilder sb = new StringBuilder();
for ( int i=1; i<Integer.MAX_VALUE; i++ )
    sb.append("x");

并得到

Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
at java.util.Arrays.copyOf(Unknown Source)
...

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

如果有兴趣

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。


问题答案:

您正在尝试分配太大的数组。这是因为您试图创建一个很长的String。由于数组由整数索引,因此数组不能包含多个Integer.MAX_VALUE元素。即使您的堆大小很大,您也将无法分配一个数组,该数组具有多个Integer.MAX_VALUE元素,这仅仅是因为您无法使用进行索引Integer



 类似资料:
  • 我在mongostat的输出中看到了巨大的每秒(约200次)故障数,尽管锁率非常低: 我的Mongo服务器运行在Amazon云上的m1.large实例上,因此它们每个都有7.5GB的RAM:: 显然,我没有足够的内存来满足cahing mongo想要做的所有事情(顺便说一句,由于磁盘IO,这会导致巨大的CPU使用率%)。 我发现这篇文档表明,在我的场景中(高故障、低锁定%),我需要“扩展读取”和“

  • 我正在使用Swift中的实现实质上是一个缓存。演出远未达到我的预期。我读过一些其他问题,例如关于数组排序的问题,它似乎暗示是答案(如果您准备接受它带来的更改)。但是,即使在编译时,性能也比其他语言差。我使用的是Swift 1.0版(Swift-600.0.34.4.8)。 下面是一个简单的例子来说明这个问题: 使用编译时,运行时间超过两秒: 相比之下,这个Java实现: 又快了6倍: 难道仅仅是复

  • 问题内容: 我试图弄清楚如何在MySQL中优化一个非常慢的查询(我没有设计这个): 比较一下: 说明语句对我没有帮助: 好的,它仍然认为它需要大约400万个条目才能计数,但是我可以计算文件中的行数比这还要快!我不明白为什么MySQL要花这么长时间。 这是表的定义: 版: 有什么明显的我想念的东西吗?(是的,我已经尝试过“ SELECT COUNT(change_event_id)”,但是没有性能差

  • 问题内容: 对于一个项目,我们有一堆始终具有相同结构且未链接在一起的数据。有两种保存数据的方法: 为每个池创建一个新的数据库(约15-25个表) 在一个数据库中创建所有表,并根据表名称更改池。 对于MySQL来说,哪一个更容易和更快地处理? 编辑: 我对数据库设计没有兴趣,只是对两种可能性中的哪一种更快感到兴趣。 编辑2: 我将尝试使其更加清晰。如前所述,我们将获得数据,其中一些日期很少会属于不同

  • 问题内容: 我有以下的JSON,我只有在获得元素感兴趣,和。 使用 Gson ,可以解析此JSON以获取那些值,而无需创建表示JSON内容的整个类结构吗? JSON: 问题答案: 您无需定义任何新类,只需使用Gson库随附的JSON对象即可。这是一个简单的例子: 干净利落。如果发现自己一遍又一遍地重复相同的代码,则可以创建类来简化映射并消除重复。

  • 我的Laravel项目有问题。我有范文和评论。一篇帖子有很多评论,这是我帖子评论中的关系。当我想获得所有帖子和评论时,一切都很好: 我有问题,因为我想写搜索引擎的模型。我只想得到帖子和评论,如果搜索条件为真的评论。我尝试以下代码: 但这段代码返回所有要发布的注释,而不仅仅是条件为true的注释。