jvm 等待Android Studio日志中的阻塞GC Alloc

fcwjkofz  于 2022-11-07  发布在  Android
关注(0)|答案(2)|浏览(574)

我有一个非常大的double数组,比如说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问题还是我的逻辑错误?

6kkfgxo0

6kkfgxo01#

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

niknxzdl

niknxzdl2#

您的应用程序使用了太多的堆内存(可能是在动态创建对象,而没有进行垃圾收集),因此Java GC不断尝试释放内存,但由于您的应用程序产生了大量的“泄漏”,它无法做到这一点。因此,基本上您的应用程序内存需求不断增加,因此GC会就此发出警告,因为它最终会导致崩溃
您应该:
1.使用Android Studio Memory Profiler分析内存分配
1.分析堆转储
1.检查内存泄漏(一个原因可能是静态变量太多!)
gc()(正如前面有人所建议的)将不会有帮助,因为您不能保证/强制GC
我建议首先改进/编辑您自己的代码库,而不是使用该标志来增加JVM参数中的Heap Size。

相关问题