Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android-Java堆栈与本机堆栈_Java_Android_Java Native Interface_Native Code - Fatal编程技术网

Android-Java堆栈与本机堆栈

Android-Java堆栈与本机堆栈,java,android,java-native-interface,native-code,Java,Android,Java Native Interface,Native Code,在Android中,当我使用adb shell dumpsys meminfo检查应用程序内存时,我观察到单独的Java堆和本机堆,但堆栈只有一个条目 Pss Private Private Swapped Heap Heap Heap Total Dirty Clean Dirty Size Alloc Free ------ ------

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

              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堆栈分配到连续内存位置的,还是它们是非连续的(实际上是两个独立的堆栈)

从对的描述来看,java堆栈和本机堆栈似乎是连续的(但我无法确认此图像是否确实表明了这一点,或者只是页面作者将它们相邻绘制)

另外,是否有人有一张图片展示了在Dalvik/ART中如何进行内存管理?我知道存在几个这样的问题,但我仍然无法很好地理解,特别是:

  • java堆栈/堆和本机堆栈/堆之间的区别
  • 共享图书馆位置

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

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


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

    为什么认为您需要知道这一点?顺便说一下,在您返回Java后,JNI中的任何本机堆栈都将被“弹出”(堆栈指针重置),所以我不知道您可以用这些内存做什么。我正在探索沙箱解决方案。例如,检查我发现的现有工作: