java.lang.OutOfMemoryError即使很多
发布时间:2020-12-14 05:45:32 所属栏目:Java 来源:网络整理
导读:我正在尝试将2.5GB的txt文件读入我的应用程序.我正在运行Win7 x64并且有43GB的内存可用(64GB).我尝试使用-Xmx -XX:MaxParmSize -XX:ParmSize等.这些都不会影响错误.我还能尝试什么?这个错误看起来很奇怪,因为我当然有足够的堆空间可用. Exception in thre
我正在尝试将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索引其元素.有关详细信息,请参见
Do Java arrays have a maximum size?.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |