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-other的Debug.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 …
我有以下设置:
项目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 中排除的?
我有以下设置:
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中有类似的东西吗?