在 Android 工作室日志中等待阻塞的 GC 分配



我有一个相当大的双数组,比如 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

当我对相当小的数组做同样的事情时,输出不是这样的。为什么它显示">等待阻塞的 GC 分配"和这些消息?这是一个严重的问题吗?JVM问题还是我的逻辑错误?

您的应用程序使用了太多的堆内存(可能是动态创建对象并且没有进行垃圾回收(,因此Java GC不断尝试释放内存,但它无法做到这一点,因为您的应用程序正在生成大量"泄漏"。所以基本上你的应用程序内存需求在不断增加,因此GC会警告你,因为它最终会导致崩溃

。您应该:

  1. 使用 Android Studio Memory Profiler 分析内存分配
  2. 分析堆转储
  3. 检查内存泄漏(一个原因可能是静态变量太多!

System.gc(((如之前有人建议的那样(将无济于事,因为您无法保证/强制GC

与其使用标志来增加 JVM 参数中的堆大小,我建议先改进/编辑您自己的代码库。

在我的清单中使用android:largeHeap="true".xml解决了这个问题。

最新更新