【问题标题】:Sorting 1 billion integers using collections.sort() gives out of memory error使用 collections.sort() 对 10 亿个整数进行排序会出现内存不足错误
【发布时间】:2015-05-18 11:06:49
【问题描述】:

我正在尝试使用 Collection.sort(List) 对包含 10 亿个整数的列表进行排序,它会引发以下异常 “线程“主”java.lang.OutOfMemoryError 中的异常:Java 堆空间” -xms 设置为 512m,xmx 设置为 1536m。我该如何排序?我的系统中有 8GB 内存,因此分配更多物理内存不是问题。我尝试给 -xmx 2048m 但 vm 无法使用该设置进行初始化。

【问题讨论】:

  • 10 亿个整数的数组是 10 亿乘以 4 个字节,差不多 4 GB,所以即使拼写正确,Xmx2048 也不够用。
  • 相关的,如果不是重复的话:stackoverflow.com/q/7203159/3419894
  • 另外,您可以考虑使用自定义列表的替代方法(比 java Lists 更小的内存占用),并且您可以编写自己的排序算法(两者都有教育价值)。

标签: java sorting


【解决方案1】:

它可能区分大小写并且应该没有空格,请尝试使用-Xmx2048m

非标准选项

-Xmxn

指定内存分配池的最大大小(以字节为单位)。此值必须是大于 2 MB 的 1024 的倍数。附加字母 k 或 K 表示千字节,或附加字母 m 或 M 表示兆字节。默认值是在运行时根据系统配置选择的。

对于服务器部署,-Xms 和 -Xmx 通常设置为相同的值。请参阅垃圾收集器人体工程学 http://docs.oracle.com/javase/7/docs/technotes/guides/vm/gc-ergonomics.html

例子:

-Xmx83886080

-Xmx81920k

-Xmx80m

docs

【讨论】:

  • -启动插件/org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar --launcher.library plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.200。 v20120522-1813 -product org.eclipse.epp.package.jee.product --launcher.defaultAction openFile --launcher.XXMaxPermSize 256M -showsplash org.eclipse.platform --launcher.XXMaxPermSize 256m --launcher.defaultAction openFile -vmargs - Dosgi.requiredJavaVersion=1.5 -Dhelp.lucene.tokenizer=standard -Xms512m -Xmx1024m 这是我的 eclipse.ini 文件
  • eclipse 配置无关紧要,当您启动应用程序时,它会生成一个新的 jvm,您必须在项目运行时配置参数中添加该选项。
  • 我应该在运行配置的哪个位置添加这些选项?
【解决方案2】:

我尝试给 -xmx 2048m 但 vm 无法使用该设置进行初始化。

您可能正在使用 32 位 JVM,which have a practical max heap size below 2GB。您应该尝试 64 位 JVM。

还请注意,您应该为程序设置 VM 参数,而不是为 Eclipse(看起来您正在为每个 cmets 执行此操作)。您可以通过选择 Run 中的下拉菜单然后选择 Run Configurations 来实现。然后选择您的程序并打开“参数”面板。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-03
    • 2018-05-10
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 2014-07-03
    相关资源
    最近更新 更多