Dalvik 的内存模型和 Java 的一样吗?

Posted

技术标签:

【中文标题】Dalvik 的内存模型和 Java 的一样吗?【英文标题】:Is Dalvik's memory model the same as Java's? 【发布时间】:2011-06-03 01:13:15 【问题描述】:

Dalvik的内存模型和Java's一样吗?我特别感兴趣的是引用和非long/non-double原始变量的读写是否是原子的,但我也想知道两个平台的内存模型之间是否有任何差异。

【问题讨论】:

【参考方案1】:

从 4.0(冰淇淋三明治)开始,Dalvik 的行为应该与 JSR-133(Java 内存模型)相匹配。

从 3.0 (Honeycomb) 开始,大部分部件都已到位,但忽略了一些在实践中难以遇到的小问题(例如最终确定中的一些边缘情况)。

从 2.3 (Gingerbread) 开始,Dalvik 在单处理器上通常是正确的,但缺少在 SMP 硬件上正常运行所需的一些关键功能(例如正确的final 字段处理)。

Gingerbread 之前,根本没有记忆障碍,像volatile long 这样的基本东西被打破了。

【讨论】:

模糊相关:android+SMP Primer at developer.android.com/training/articles/smp.html 上面的 SMP 入门读物对于任何处理线程间共享内存的人来说都是必读的。非常感谢你链接这个! @fadden 使用 volatile 修复进行双重检查锁定怎么样?就像这里描述的en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java 它可以在Android上运行吗?任何版本?它适用于 ART 吗?【参考方案2】:

有a document in the Dalvik source 说:

从以 Java 编程语言编写或以相同方式针对 .class 文件的一段代码的角度来看,Dalvik VM 旨在以完全符合该语言定义的方式运行。也就是说,在 Dalvik 中运行的代码的行为与在任何其他虚拟机中运行的代码相同。

这应该意味着该行为与正确的 Java 中的行为相同。不管是不是真的,我不知道。

【讨论】:

【参考方案3】:

规范说对 32 位数字(非双精度、非长数字)的所有操作都是原子的。不能保证对 64 位数字的操作也是原子的。

【讨论】:

这是哪个规范?如果您指的是 Java 规范,我认为问题的重点是询问 Dalvik 是否实现了 Java 语义的那一部分。如果您指的是其他规范,有没有机会提供链接?

以上是关于Dalvik 的内存模型和 Java 的一样吗?的主要内容,如果未能解决你的问题,请参考以下文章

什么是 Dalvik 和 dalvik-cache?

Java 虚拟机原理Dalvik 虚拟机 ( 简介 | CPU 指令集 | Dalvik 虚拟机内存 )

安卓art和dalvik的区别

Android Dalvik虚拟机 堆内存管理 增长&释放

Android Dalvik虚拟机 堆内存管理 增长&释放

Android Dalvik虚拟机 对象创建内存分配流程