4
Fatal Exception: java.lang.OutOfMemoryError: int[] of length 1083403672 exceeds the VM limit
   at android.util.ArrayMap.allocArrays(ArrayMap.java:196)
   at android.util.ArrayMap.ensureCapacity(ArrayMap.java:307)
   at android.os.Bundle.unparcel(Bundle.java:247)
   at android.os.Bundle.getString(Bundle.java:1118)
   at com.test.example.pushnotification.LocalyticsReceiver.handleNotificationReceived(LocalyticsReceiver.java:61)
   at com.test.example.pushnotification.LocalyticsReceiver.onReceive(LocalyticsReceiver.java:52)
   at android.app.ActivityThread.handleReceiver(ActivityThread.java:2426)
   at android.app.ActivityThread.access$1700(ActivityThread.java:139)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1276)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:136)
   at android.app.ActivityThread.main(ActivityThread.java:5103)

它指向的代码:-

String message = intent.getExtras().getString("message");

请在下面找到代码快照:

 @Override
    public void onReceive(Context context, Intent intent) {

        String appKey = context.getResources().getString(R.string.localytics_api_key);
        if (!TextUtils.isEmpty(appKey)) {
            Localytics.integrate(context.getApplicationContext(), appKey);
        }

        if (intent.getAction().equals("com.google.android.c2dm.intent.REGISTRATION")) {
            LocalyticsUtil.handleRegistration(intent);
        } else {
            Localytics.handlePushNotificationReceived(intent);
            handleNotificationReceived(context, intent);
        }
    }

    //handle notification when received
    private void handleNotificationReceived(Context context, Intent intent) {


        // Get the notification message
        String message = intent.getExtras().getString("message");

...

知道为什么在从意图中获取额外信息时会发生这种情况吗?

4

1 回答 1

0

当您遇到 java.lang.OutOfMemoryError: Requested array size超出 VM 限制时,这意味着因错误而崩溃的应用程序正在尝试分配一个大于 Java 虚拟机可以支持的数组。

该错误由 JVM 中的本机代码引发。当 JVM 执行特定于平台的检查时,它发生在为数组分配内存之前:分配的数据结构在该平台中是否可寻址。此错误并不像您最初想象的那么常见。

您很少遇到此错误的原因是 Java 数组是由 int 索引的。Java 中的最大正整数为 2^31 – 1 = 2,147,483,647。特定于平台的限制可能非常接近这个数字——例如,在我的 Java 1.7 上的 64 位 MB Pro 上,我可以愉快地初始化最多包含 2,147,483,645 或 Integer.MAX_VALUE-2 元素的数组。

将数组的长度增加一到 Integer.MAX_VALUE-1 会导致线程“main”中熟悉的 OutOfMemoryError 异常 java.lang.OutOfMemoryError:请求的数组大小超出 VM 限制

解决办法是什么?

java.lang.OutOfMemoryError: Requested array size exceeded VM limit 可能是以下任一情况的结果:

您的数组变得太大,最终的大小在平台限制和 Integer.MAX_INT 之间

您故意尝试分配大于 2^31-1 个元素的数组来试验限制。

在第一种情况下,检查你的代码库,看看你是否真的需要那么大的数组。也许您可以减小数组的大小并完成它。或者将阵列分成更小的块,并根据您的平台限制分批加载您需要处理的数据。

在第二种情况下——记住 Java 数组是由 int 索引的。因此,在平台内使用标准数据结构时,您的数组中的元素不能超过 2^31-1 个。事实上,在这种情况下,您已经被编译器在编译期间宣布“错误:整数太大”阻止。

但是,如果您真的使用真正的大型数据集,您需要重新考虑您的选择。您可以以较小的批量加载需要处理的数据,并且仍然使用标准 Java 工具,或者您可能会超出标准实用程序。实现此目的的一种方法是查看 sun.misc.Unsafe 类。这允许您像在 C 中一样直接分配内存。

于 2016-08-11T05:50:33.507 回答