我有一个相当大的双数组,比如1710万个元素。我需要遍历数组,将数组划分为每个10k点的较小数组,其余的点(如果有的话)划分到最后一个片段中。
我有一个基本代码:
public static boolean getSliceOfArray(double[] arr,int slice_len)
{
//arr: big array
//slice_len: 10,000
System.out.println(arr.length);
int n_times=(arr.length/slice_len);
int i=0;
for(int n=0;n<n_times;n++)
{
Arrays.copyOfRange(arr,i,i+slice_len);
i=i+slice_len;
}
System.out.println(n_times);
if(i!=arr.length)
{
System.out.println( Arrays.copyOfRange(arr,i,arr.length).length);
}
return true;
}
它给了我以下输出:
I/System.out: 17100000
I/xample.styleap: Waiting for a blocking GC Alloc
I/xample.styleap: WaitForGcToComplete blocked Alloc on HeapTrim for 13.428ms
Starting a blocking GC Alloc
I/xample.styleap: Waiting for a blocking GC Alloc
I/xample.styleap: WaitForGcToComplete blocked Alloc on HeapTrim for 36.867ms
I/xample.styleap: Starting a blocking GC Alloc
I/xample.styleap: Waiting for a blocking GC Alloc
I/xample.styleap: WaitForGcToComplete blocked Alloc on HeapTrim for 26.012ms
Starting a blocking GC Alloc
I/xample.styleap: Waiting for a blocking GC Alloc
I/xample.styleap: WaitForGcToComplete blocked Alloc on HeapTrim for 32.625ms
Starting a blocking GC Alloc
I/xample.styleap: Waiting for a blocking GC Alloc
I/xample.styleap: WaitForGcToComplete blocked Alloc on HeapTrim for 21.645ms
Starting a blocking GC Alloc
I/System.out: 1710
当我对小得多的数组也这样做时,输出就不是这样了。为什么它显示“等待阻塞的GC分配”和这些消息?这是个严重的问题吗?JVM问题还是我的逻辑错误?
发布于 2022-01-01 18:03:12
您的应用程序正在使用过多的堆内存(可能是动态创建对象,而不是垃圾收集),因此Java不断地尝试释放内存,但是它无法这样做,因为应用程序正在产生大量的“泄漏”。因此,基本上,您的应用程序内存需求在不断增加,因此GC警告您,因为它最终会导致崩溃。
您应该:
使用Android内存分析器分析内存allocation
!
System.gc() (如前面有人建议的那样)不会有帮助,因为您无法保证/强制GC。
与其使用标志来增加JVM args中的堆大小,我建议首先改进/编辑自己的代码基。
https://stackoverflow.com/questions/62165994
复制相似问题