Android – Java Stack vs Native Stack

在Android中,当我使用adb shell dumpsys meminfo检查应用程序内存时,我观察到单独的Java和本机堆,但只有1个堆栈条目。

  Pss Private Private Swapped Heap Heap Heap Total Dirty Clean Dirty Size Alloc Free ------ ------ ------ ------ ------ ------ ------ Native Heap 4516 4480 0 1848 11520 7412 4107 Dalvik Heap 9726 9668 0 12924 33436 28477 4959 Dalvik Other 1417 1416 0 28 Stack 288 288 0 0 

我想问一下,在Android中,当一个java类通过JNI使用本机代码时,是在java堆栈中连续内存位置分配的本机堆栈,还是它们是非连续的(实际上是两个独立的堆栈)?

从JVM的描述看来,java堆栈和本机堆栈似乎是连续的(但我不能确认这个图像确实表明了这一点,或者只是页面作者将它们彼此相邻)。

此外,有没有人有一张图片显示如何在Dalvik / ART中完成内存管理? 我知道存在几个SO问题,但我仍然无法得到很好的理解,特别是:

  1. java堆栈/堆与本机堆栈/堆之间的区别
  2. 共享库位置

执行堆栈的合理实现将Java和本机帧混合在一个堆栈中。 也就是说,如果Java方法调用调用Java方法的本机函数,则与调用相对应的帧都被推送到同一堆栈上。

一般而言,本机堆是用于动态分配的内存的存储区域。 Java堆是为Java对象保留的本机堆中的一个区域,其内容由垃圾收集器管理。 根据垃圾收集器实现,Java堆可能是连续的,也可能被拆分为单独的区域。

我不熟悉Dalvik或ART的细节,但它们可能就像其他JVM一样。