【问题标题】:Waiting for a blocking GC Alloc in Android studio logs在 Android Studio 日志中等待阻塞 GC Alloc
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 那没有帮助:(
  • 这应该避免并且比适当的解决方案更快速修复。
【解决方案2】:

您的应用程序使用了过多的堆内存(可能在运行中创建对象而没有收集垃圾),因此 Java GC 不断尝试释放内存,但在您的应用程序生成时它无法做到这一点很多“泄漏”。所以基本上你的应用程序内存需求在不断增加,因此 GC 会警告你,因为它最终会导致崩溃

你应该:

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

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

我建议先改进/编辑您自己的代码库,而不是使用该标志来增加 JVM args 中的堆大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多