Dalvik VM进程是否释放系统RAM?

常用软件

Android开发人员文档(作为Svelte项目的一部分)(座右铭:“您曾经尝试将Bugdroid安装到紧身牛仔裤上吗?!?”),上有一个页面“管理应用程序的内存”它包含了:

当用户导航到其他应用程序且您的UI不再可见时,您应释放仅由UI使用的所有资源。此时释放UI资源可以显着增加系统用于缓存进程的容量,这直接影响用户体验的质量。

和:

TRIM_MEMORY_RUNNING_LOW:您的应用程序正在运行并且不被认为可以杀死,但是设备的内存消耗却要低得多,因此您应该释放未使用的资源以提高系统性能(这直接影响您的应用程序的性能)。

等等。

但是,只有在“释放资源”实际上以某种方式影响系统RAM的情况下,这些才有意义。

我给人的印象是Dalvik VM的行为就像Java VM一样(或者,如果他们在我不看的时候改变了它,则可能是“做”的)。AFAIK,Java VM分配系统RAM以增加堆大小,但从不释放它-分配后,只要进程运行,它就一直是堆空间的一部分。

如果Dalvik VM的行为方式相同,那么我看不到在我们的进程中增加未分配堆空间的数量将如何对整体系统性能产生任何影响。现在,为我们的进程释放堆空间是一件好事,也许这样做可以减少我们将来需要更多系统RAM的可能性……但这不是文档所暗示的。该文档指出:“此时释放UI资源可以显着增加系统用于缓存进程的容量”;它并没有说“此时释放UI资源不会立即产生影响,但将来将有助于减少应用程序的系统RAM占用空间”。

现在,让指令告诉我们释放通过NDK分配的内存,这很有意义,因为它发生在Dalvik堆之外,并且会影响系统RAM。但是文档并没有区别。

除了终止进程之外,Dalvik VM是否真的将分配的RAM释放回系统?如果是这样,什么时候?而且,在较小程度上,考虑到垃圾收集器是非压缩且非复制的,该如何完成?

谢谢!

淡淡的

是。基本思想是,如果有一个4K页面,上面没有任何内容,则该页面将返回给系统。

trimHeaps()dalvik / vm / alloc / HeapSource.cpp中,在VM中执行此功能的函数称为您可以使用看到它mspace_trim(),它使用OS调用来取消映射不再需要的块(请参阅malloc.c中第1203行的malloc_trim()注释)。然后mspace_inspect_all(),它使用遍历堆releasePagesInRange()每个区域都调用回调测试是否通过了没有分配的区域,如果是,则将边界截断为4K对齐。如果结果不为空,则表明该区域跨越一个或多个物理4K页面,可以使用将该页面返回给系统madvise(MADV_DONTNEED)

trimHeaps()是从几个地方调用的,最值得注意的是gcDaemonThread(),它将在并发GC后五秒钟启动修整。如果并发GC发生在五秒钟之前,计时器将重置,其想法是,如果我们正在进行GC,则VM正在忙于分配,而这种空闲时间调整将适得其反。

由于Dalvik GC不会进行压缩,因此效果不如预期。随着时间的流逝,碎片趋于堆积,因此,随着过程寿命的延长,情况可能会变得更糟。应用程序框架可以“回收”长期存在的服务来缓解这种情况。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Dalvik VM进程是否释放系统RAM?

来自分类Dev

Android Dalvik VM Logcat

来自分类Dev

Android Dalvik VM Logcat

来自分类Dev

关闭Dalvik VM的所有优化

来自分类Dev

Android Studio Dalvik vm无法找到课程

来自分类Dev

检测到堆栈损坏,dalvik VM崩溃

来自分类Dev

Dalvik VM的同步代码是什么?

来自分类Dev

Android Studio Dalvik vm无法找到课程

来自分类Dev

Dalvik是否在Android中使用本机库?

来自分类Dev

如何获取Dalvik VM使用的标准Java库的类文件或Dalvik字节代码?

来自分类Dev

模拟器或Genymotion是否支持替代dalvik的ART?

来自分类Dev

.apk在ART中的安装过程。与Dalvik VM安装过程的区别

来自分类Dev

在Dalvik vm中运行.dex文件(用smali编写)证明存在验证错误

来自分类Dev

DEX和Dalvik是否支持Java二进制兼容性?

来自分类Dev

Android ART运行时是否具有与Dalvik相同的方法限制限制?

来自分类Dev

Android ART是否像Dalvik一样支持运行时动态类加载?

来自分类Dev

Android上的Qt-C ++代码是否在Dalvik虚拟机中运行

来自分类Dev

在Android中执行Dalvik堆限制时是否计算共享内存?

来自分类Dev

使用Android的NDK构建的代码是否可以像在Dalvik上那样在ART上运行?

来自分类Dev

Android ART运行时是否具有与Dalvik相同的方法限制限制?

来自分类Dev

是否可以通过分析Java字节码来估计Dalvik字节码执行的指令数

来自分类Dev

Android ART是否像Dalvik一样支持运行时动态类加载?

来自分类Dev

是否可以将JVM准备的jar文件转换为Dalvik兼容的jar?

来自分类Dev

Android上的Qt-C ++代码是否在Dalvik虚拟机中运行

来自分类Dev

Rad Studio XE6是否可以生成Dalvik字节码

来自分类Dev

ART沙箱应用程序是否像Dalvik一样?

来自分类Dev

在dalvik初始堆大小

来自分类Dev

什么是Android Dalvik?

来自分类Dev

确实的Android运行时(ART或Dalvik的)包含Java VM堆栈或本地方法堆栈如JVM?

Related 相关文章

  1. 1

    Dalvik VM进程是否释放系统RAM?

  2. 2

    Android Dalvik VM Logcat

  3. 3

    Android Dalvik VM Logcat

  4. 4

    关闭Dalvik VM的所有优化

  5. 5

    Android Studio Dalvik vm无法找到课程

  6. 6

    检测到堆栈损坏,dalvik VM崩溃

  7. 7

    Dalvik VM的同步代码是什么?

  8. 8

    Android Studio Dalvik vm无法找到课程

  9. 9

    Dalvik是否在Android中使用本机库?

  10. 10

    如何获取Dalvik VM使用的标准Java库的类文件或Dalvik字节代码?

  11. 11

    模拟器或Genymotion是否支持替代dalvik的ART?

  12. 12

    .apk在ART中的安装过程。与Dalvik VM安装过程的区别

  13. 13

    在Dalvik vm中运行.dex文件(用smali编写)证明存在验证错误

  14. 14

    DEX和Dalvik是否支持Java二进制兼容性?

  15. 15

    Android ART运行时是否具有与Dalvik相同的方法限制限制?

  16. 16

    Android ART是否像Dalvik一样支持运行时动态类加载?

  17. 17

    Android上的Qt-C ++代码是否在Dalvik虚拟机中运行

  18. 18

    在Android中执行Dalvik堆限制时是否计算共享内存?

  19. 19

    使用Android的NDK构建的代码是否可以像在Dalvik上那样在ART上运行?

  20. 20

    Android ART运行时是否具有与Dalvik相同的方法限制限制?

  21. 21

    是否可以通过分析Java字节码来估计Dalvik字节码执行的指令数

  22. 22

    Android ART是否像Dalvik一样支持运行时动态类加载?

  23. 23

    是否可以将JVM准备的jar文件转换为Dalvik兼容的jar?

  24. 24

    Android上的Qt-C ++代码是否在Dalvik虚拟机中运行

  25. 25

    Rad Studio XE6是否可以生成Dalvik字节码

  26. 26

    ART沙箱应用程序是否像Dalvik一样?

  27. 27

    在dalvik初始堆大小

  28. 28

    什么是Android Dalvik?

  29. 29

    确实的Android运行时(ART或Dalvik的)包含Java VM堆栈或本地方法堆栈如JVM?

热门标签

归档