小编dka*_*azi的帖子

Android中的"未知"("其他")内存泄漏?

Android Studio Memory Profiler报告Others类别中的分配.

在此输入图像描述

根据https://developer.android.com/studio/profile/memory-profiler.html:其他:您的应用程序使用的内存,系统不确定如何分类.

如果我们深入挖掘,可以使用https://developer.android.com/reference/android/os/Debug.MemoryInfo.html#getMemoryStat(java.lang.String)在运行时检索类似的内存占用信息.

它看起来像Others在Android Studio Memory Profiler中对应summary.private-otherDebug.MemoryInfo类.该参数报告为:

public int getSummaryPrivateOther() {
            return getTotalPrivateClean()
              + getTotalPrivateDirty()
              - getSummaryJavaHeap()
              - getSummaryNativeHeap()
              - getSummaryCode()
              - getSummaryStack()
              - getSummaryGraphics();
        }
Run Code Online (Sandbox Code Playgroud)

哪种内存分配最终会出现在该类别中?它显然不是Java,Native,Code,Stack和Graphics.

如果我的应用程序(具有非常大的代码库,所以我无法确定某个导致它的特定代码)消耗大量Other内存,是否有某种源/模式导致这种消费?

编辑1 我能够部分回答第一部分我自己的问题:

哪种内存分配最终会出现在该类别中?它显然不是Java,Native,Code,Stack和Graphics.

也可以使用以下内容检索RAM信息adb shell dumpsys meminfo <your proc name>,通常如下所示:

在此输入图像描述

在实验上,我可以看到Unknown最有可能包括在内 Private Other.这提出了下一个问题:什么是Unknown?根据https://developer.android.com/studio/command-line/dumpsys.html#meminfo:

系统无法将任何RAM页面分类为其他更具体的项目之一.目前,这主要包含本机分配,由于地址空间布局随机化(ASLR),该工具在收集此数据时无法识别.就像Dalvik堆一样,Pss Total for Unknown考虑了与Zygote的共享,而Private Dirty是专门用于你的app的未知RAM.

它看起来仍然是原生分配.可识别的本机分配最终Native归类,但是,由于ASLR而无法识别其数据的本机分配似乎最终会出现Unknown.

然而,主要问题仍然存在:

如果我的应用程序(具有非常大的代码库,所以我无法确定某个导致它的特定代码)消耗大量Other …

java android memory-leaks

11
推荐指数
1
解决办法
1162
查看次数

Android Gradle annotationProcessor 在父模块中不可用

我有以下设置:

项目A build.grade:

dependencies {
    compile (project(':ProjectB'))
}
Run Code Online (Sandbox Code Playgroud)

项目B build.gradle:

dependencies {
    annotationProcessor 'com.ryanharter.auto.value:auto-value-parcel:0.2.5'
    compile "com.google.auto.value:auto-value:1.3"
    annotationProcessor "com.google.auto.value:auto-value:1.3"
}
Run Code Online (Sandbox Code Playgroud)

SomeClass在项目A,而实现Parcelable

@AutoValue
public abstract class SomeClass implements Parcelable {
...
}
Run Code Online (Sandbox Code Playgroud)

AutoValue 不会在 AutoValue_SomeClass 中生成任何 Parcelable 相关的方法。

但是,如果我将 auto-value-parcel annotationProcessor 直接包含到 ProjectA 中,问题就解决了。

项目A build.grade:

dependencies {
    compile (project(':projectB'))
    annotationProcessor 'com.ryanharter.auto.value:auto-value-parcel:0.2.5'
}
Run Code Online (Sandbox Code Playgroud)

谁能解释一下auto-value-parcelannotationProcessor 是如何从 ProjectA 中排除的?

android gradle auto-value

4
推荐指数
1
解决办法
1983
查看次数

使用 GSON 在 JSON 到对象期间拦截值

我有以下设置:

public static class MyPojoImpl {
    @SerializedName("myNumber")
    private int myNumber;
    @SerializedName("myType")
    private String myType;

    @Override
    public List<String> getMyNumber() {
        return myNumber;
    }

    @Override
    public @Type String getMyType() {
        return myType;
    }

    @StringDef({Type.ONE,
            Type.TWO,
            Type.THREE})
    @Retention(RetentionPolicy.SOURCE)
    @interface Type {
        String ONE = "ONE";
        String TWO = "TWO";
        String THREE = "THREE";
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个myType来自 JSON的字符串值。我想将此字符串值限制为某些值。myType在设置为我的对象之前有什么方法可以拦截吗?

我知道我可以通过转换为type枚举来实现这一点,但我想完全避免使用枚举。或者,我也可以将检查逻辑放在 getter 中,但这不是太有效。

Jackson 允许使用 setter。GSON中有类似的东西吗?

android gson

1
推荐指数
1
解决办法
694
查看次数

标签 统计

android ×3

auto-value ×1

gradle ×1

gson ×1

java ×1

memory-leaks ×1