- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
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
类(class)。该参数报告为:
public int getSummaryPrivateOther() {
return getTotalPrivateClean()
+ getTotalPrivateDirty()
- getSummaryJavaHeap()
- getSummaryNativeHeap()
- getSummaryCode()
- getSummaryStack()
- getSummaryGraphics();
}
哪种内存分配最终属于该类别?显然不是Java、Native、Code、Stack和Graphics。
如果我的应用程序(具有非常大的代码库,所以我无法真正查明导致它的特定代码)消耗大量 Other
内存,是否有某种来源/模式导致这种消耗?
编辑 1我能够部分回答第一部分我自己的问题:
Which kind of memory allocations end up in that category? It is obviously not Java, Native, Code, Stack and Graphics.
RAM 信息也可以使用 adb shell dumpsys meminfo <your proc name>
检索通常看起来像:
通过实验,我可以看到 Unknown
很可能包含在 Private Other
中.这就引出了下一个问题:什么是 Unknown
?根据https://developer.android.com/studio/command-line/dumpsys.html#meminfo :
Any RAM pages that the system could not classify into one of the other more specific items. Currently, this contains mostly native allocations, which cannot be identified by the tool when collecting this data due to Address Space Layout Randomization (ASLR). Like the Dalvik heap, the Pss Total for Unknown takes into account sharing with Zygote, and Private Dirty is unknown RAM dedicated to only your app.
看起来它仍然是 native 分配。可识别的 native 分配最终在 Native
中然而,由于 ASLR 的原因,其数据不再可识别的 native 分配似乎最终出现在 Unknown
中。 .
然而,主要问题仍然存在:
If my app (with enormously large codebase so I can't really pin point a certain code that causes it) consumes a lot of
Other
memory, is there a certain source/pattern that leads to such consumption? I'm looking for answers such as hanging threads, open cursors, webviews and etc.
最佳答案
经过数小时的研究,我终于找到了一种导致高Unknown
内存消耗的常见模式:启用Javascript
的WebView
.
以下示例代码将导致在 HTC One API 19 上消耗大约 100mb
的 unknown
内存,在 Samsung Galaxy Note 4 上消耗大约 120mb
(API23) 和大约 94mb
在 Samsung Galaxy S8 (API-24) 上:
val webView1 = findViewById<WebView>(R.id.webview_1)
webView1.settings.javaScriptEnabled = true
webView1.webViewClient = WebViewClient()
findViewById<Button>(R.id.load_webview_1).setOnClickListener {
webView1.loadUrl("http://www.nbcsports.com/") // can be any arbitrary URL
}
以下命令将每秒输出 kb 类别的 Unknown
内存):
while sleep 1; do adb shell dumpsys meminfo com.dkarmazi.memoryleakerapp | grep Unknown; done
输出:
现在它提出了一系列超出这个特定问题的后续问题:
dumpsys meminfo
中的 Unknown
下报告 WebView 内存还是一个错误?如果是错误,它是否特定于某些操作系统和 API 级别?如果是故意的,那么拥有 4-5 个 Activity 的 WebView
将使应用程序崩溃并留下非常困惑的痕迹。http://stackoverflow.com/
等较简单的网站占用 23mb
。与任何新闻网站一样,具有更丰富用户体验的页面将占用 120mb-130mb
。TLDR:启用Javascript
的WebView
是一种常见用例,会导致某些制造商消耗大量未知
内存.
2018-07-23 更新:chromium bug tracker 上有一个 Unresolved 问题,与此调查直接相关:https://bugs.chromium.org/p/chromium/issues/detail?id=819901
TL;DR:只有某些版本的 WebView (>52) 会导致高内存消耗,而较旧的 WebView 没问题。原因仍然未知。
关于java - Android 中的 `Unknown` ( `Other` ) 内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47839681/
这是我的代码 14 20 {"Confirm Email"} 21 在第 17 行我得到错误 Type '{ pathname: string; user: { em
这是我的代码 14 20 {"Confirm Email"} 21 在第 17 行我得到错误 Type '{ pathname: string; user: { em
这个问题已经有答案了: How do I compare strings in Java? (23 个回答) 已关闭 8 年前。 为什么 KeyEvent.getKeyText(0).substrin
我正在尝试 Rust 的新 wasm32-unknown-unknown 目标,我在调用数学函数(例如 sin、cos、exp、atan2)时遇到问题。 cargo .toml: [package]
当我为 spring-boot 创建启动项目时,我在 pom 文件中收到此错误。这只是为了创建一个基本的 Spring Boot 项目 Project build error: Invalid pac
我已经订阅了我想要传输的数据。但不知何故它不起作用。我收到此错误: The property pipe is not available for type "OperatorFunction" 这是我
运行以下查询时。select * from surgerys where to_char(dt_surgery ,'DD-MM-YYYY' ) = to_char('12-02-2012','DD-M
我在运行存储过程时遇到以下异常: com.microsoft.sqlserver.jdbc.SQLServerException:不支持从 UNKNOWN 到 UNKNOWN 的转换。 过程定义如下:
我尝试运行以下代码。顺便说一句,我对 python 和 sklearn 都是新手。 import pandas as pd import numpy as np from sklearn.linear
我已经阅读了关于未知类型的官方文档,但我很难真正理解它是如何工作的。 人们可以在文档中读到:“在没有首先断言或缩小到更具体的类型之前,不允许对未知进行任何操作。” 但如果我有这个功能: const f
我正在尝试在Mac OS中设置Hadoop 2.6.0 我正在关注这篇文章: http://hadoop.apache.org/docs/r2.4.0/hadoop-project-dist/hado
配置 Nexus docker 注册表和代理“dockerhub-proxy”后,如下所述: https://help.sonatype.com/repomanager3/formats/docker
我收到此错误 - “ValueError:未知标签类型:'unknown'” 我已经在网上搜索但无法摆脱这个错误,顺便说一句,我是 python 的新手:) 我的数据有 5 行 22 列,最后一列是标
使用 SHA256 摘要标识符 拉取图像失败 最佳答案 不幸的是,这是 DockerHub 删除 Docker 1.9 守护进程的向后兼容性的副作用。当使用 Docker 1.10 推送图像时,较旧的
我是 postgresql 的新手,正在尝试使用全文搜索 to_tsvector但是我遇到了错误。 SQL 和错误 SELECT to_tsvector('english', 'The quick b
每当我这样做时 npm run watch ,第一次编译工作正常 - 但经过几次编译后,我最终会得到这个错误: 95% emitting unnamed compat pluginError: UNK
在一个新的 Angular 应用程序中,我收到以下错误:Error from chokidar : Error: UNKNOWN: unknown error, watch我已经删除并重新安装 nod
使用 Typescipt 4.x.x 我写了一些代码来实现其他语言 Elm/Rust/Haskell 中常用的 Maybe/Option 类型。 我想写一个可以接受映射类型的通用函数 type MyM
const submitted = useSelector((state) => state.post.submitted) 对于上面的状态。我得到错误: (参数)状态:未知对象的类型为“未知”。 这
我正在尝试将多架构 docker 镜像推送到 docker hub 并遇到错误(在 https://github.com/docker/distribution/issues/3100 处打开了 do
我是一名优秀的程序员,十分优秀!