继续出现:请求的数组大小超过了VM限制错误

4

我在这里看到了几个关于接收Java错误的线程:java.lang.OutOfMemoryError:请求的数组大小超过VM限制,但是我尝试了建议,但对我没有用。以下是我使用的脚本:

#!/bin/bash
#$ -cwd
#$ -N Sample_S06-9841_A4_primary
#$ -S /bin/bash
module load picard/1.130

java -Xmx12g -XX:MaxPermSize=8192m -XX:+UseCompressedOops -Djava.io.tmpdir=/mnt/work1/users/home2/loldfiel/tmp -jar $picard_dir/picard.jar AddOrReplaceReadGroups INPUT=/mnt/work1/users/roehrlgroup/GCT_2/star_aligner/final_alignment/Sample_S06-9841_A4_primary/Aligned.out.sam OUTPUT=./Sample_S06-9841_A4_primary/S06-9841_A4_primary_rg.bam SORT_ORDER=coordinate RGID=S06-9841_A4_primary RGLB=lib RGPL=Illumina RGPU=none RGSM=Sample_S06-9841_A4_primary

我尝试了多种不同的选项,例如将-Xmx参数增加到20g,并删除MaxPermSize参数(我还尝试将其降低到256m)。我在不使用UseCompressedOops参数的情况下运行它。

我以前曾运行过此脚本(没有MaxPermSize和UsedCompressedOops参数),并且完全没有任何问题,因此我不确定为什么在这个样本上它无法运行。

是否有人对问题可能是什么有其他想法? 您认为我的bam文件存在问题吗?

注意:我在输出目录中收到一个文件,但它是空的。

谢谢,

莱斯利


https://dev59.com/YXA75IYBdhLWcg3w6Nn8 - Rustam
1个回答

2

Java中的数组受限于数组索引类型为int,并且索引必须为正数(以及数组大小)。

但是,在虚拟机内部可能存在限制,防止使用大小为Integer.MAX_VALUE((2 ^ 31)-1)的数组;确切的最大值似乎是特定于VM的实现。因此,当请求的数组长度为Integer.MAX_VALUE或非常接近它时,VM可能会抛出异常。请注意,这无法通过分配更多内存来解决,因为这是由VM实现方式导致的限制。

更糟糕的是,据我所知,在JDK中没有任何常量/方法可用于指示VM支持的实际最大数组大小;因此,对于这种情况,安全地进行硬编码很困难。

可能有一种方法可以通过修改其参数来防止程序尝试分配那么大的数组。您最好直接从供应商/帮助论坛寻求帮助,专门针对您的软件。如果其他VM真正支持最大大小的数组,则切换到不同的VM(版本或供应商)也可能解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接