【发布时间】:2020-09-21 17:56:17
【问题描述】:
我有一个相当大的双数组,比如 1,71,00,000 个元素。我需要遍历数组,将数组切成较小的数组,每个数组有 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
当我对相当小的数组做同样的事情时,输出不是这样的。为什么它会显示“Waiting for a blocking GC Alloc”和这些消息?这是一个严重的问题吗? JVM问题还是我的逻辑错误?
【问题讨论】:
-
表示GC正在等待释放内存。
-
因为存储在内存中的数组的大小对吗?所以有什么方法可以解决这个问题,我的意思是快速/轻松地清理堆或垃圾?
-
您可以通过
System.gc()试试运气。 -
不,在这种情况下它没有用。需要另辟蹊径。
-
就我而言,我有一个无限递归循环。
标签: java android arrays jvm heap-memory