在Android Studio日志中等待阻塞GC Alloc

8

我有一个相当大的双精度数组,例如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的问题还是我的逻辑错误?


这意味着垃圾回收器正在等待释放内存。 - Aniket Sahrawat
因为数组在内存中的大小,所以有什么方法可以解决这个问题吗?我的意思是如何快速/轻松地清理堆或垃圾? - Sayan Sen
你可以尝试使用System.gc() - Aniket Sahrawat
不,这在这种情况下并不有用。需要找到其他解决方法。 - Sayan Sen
在我的情况下,我有一个无限递归循环。 - Michael Swan
2个回答

8

您的应用程序正在使用过多的堆内存(可能是在动态创建对象并未被垃圾回收)因此Java GC不断尝试释放内存,但由于您的应用程序正在生成大量“泄漏”,它无法进行。所以基本上您的应用程序内存需求不断增加,因此GC正在警告您,因为这最终将导致崩溃。

您应该:

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

System.gc()(如之前某人建议的)无法帮助您保证/强制GC。

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


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

2
那没帮助 :( - Liker777
2
这只是一个临时解决方案,而不是一个适当的解决方案,应该避免使用。 - Cyril

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