Java 创建大宝藏收藏时的奇怪OutOfMemory

Java 创建大宝藏收藏时的奇怪OutOfMemory,java,jvm,trove4j,Java,Jvm,Trove4j,在我的应用程序启动中,我正在创建容量为75*10^6的特洛伊长哈希集 Profiler显示,该应用程序使用1.4g。我正在尝试设置-Xmx1600m,并捕获内存不足 -Xmx2000m相同 -Xmx2030m相同 -Xmx2040m正常 Profiler没有看到这么大的分配,在哪里以及为什么会发生这种情况?很可能您的终身空间不够大。jvm可能不够聪明,无法收缩其他区域以允许您使用如此大的连续块。注意CMS不进行碎片整理,所以你可以用更小的阵列来解决这个问题 对于一个大的集合,你可能会考虑使用堆内

在我的应用程序启动中,我正在创建容量为75*10^6的特洛伊长哈希集

Profiler显示,该应用程序使用1.4g。我正在尝试设置-Xmx1600m,并捕获内存不足

-Xmx2000m相同

-Xmx2030m相同

-Xmx2040m正常


Profiler没有看到这么大的分配,在哪里以及为什么会发生这种情况?

很可能您的终身空间不够大。jvm可能不够聪明,无法收缩其他区域以允许您使用如此大的连续块。注意CMS不进行碎片整理,所以你可以用更小的阵列来解决这个问题


对于一个大的集合,你可能会考虑使用堆内存。

你认为我们可以从1000英里以外的地方解决这个问题,而没有任何具体的细节吗?设置JVM选项以在OOME的情况下创建堆转储,并使用适当的工具(如Eclipse Memory Analyzer)对其进行分析。我通过减少新比率-XX:NewRatio=10(我的情况)来增加永久空间,这样就行了@MikhailErofeev当你减少新的定量时,你增加了新的空间,减少了终身空间。但是,您要做的是减少垃圾量,使其进入永久空间并减少碎片。