java - 在 Android studio 日志中等待阻塞 GC Alloc

标签 java android arrays jvm heap-memory

我有一个相当大的 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

当我对相当小的数组执行相同操作时,输出不是这样的。为什么它显示“等待阻塞 GC Alloc”和这些消息?这是一个严重的问题吗? JVM 问题还是我的逻辑错误?

最佳答案

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

你应该:

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

System.gc()(正如之前有人建议的那样)不会有帮助,因为你不能保证/强制GC

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

关于java - 在 Android studio 日志中等待阻塞 GC Alloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62165994/

相关文章:

java - 如何使用 get 方法从链表中获取元素

java - 使用数组计算字符串中的上限和下限字符

javascript - 带有 Material-UI 的 ReactJS : How to sort an array of Material-UI's <TableRow> alphabetically?

java - 在MATLAB中编写Java的pw.println()等

java - Puppet:无法为对象堆保留足够的空间。无法创建Java虚拟机

java - 创建一个空的 CD-ROM 镜像并使用 Java 将文件注入(inject)其中或从中提取文件

android - Gradle 同步在全新安装的 Android Studio、Ubuntu 16.04 上失败

java - 无法 Autowiring repo bean

android - 如何使用设备字体避免 React Native 应用程序中的字体缩放

arrays - 使用 DataContractJsonSerializer WP7 将数组解析为 Json 字符串