Android - Java Stack vs Native Stack

时间:2016-02-21 21:56:03

标签: java android java-native-interface native-code

在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. 共享库位置

1 个答案:

答案 0 :(得分:1)

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

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

我不熟悉Dalvik或ART的具体细节,但在这方面它们可能与其他JVM一样。