Android-Java堆栈与本机堆栈
在Android中,当我使用adb shell dumpsys meminfo检查应用程序内存时,我观察到单独的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 ------ ------
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堆可以是连续的,也可以拆分为单独的区域
我不熟悉Dalvik或ART的细节,但在这方面,它们可能与其他JVM一样。为什么认为您需要知道这一点?顺便说一下,在您返回Java后,JNI中的任何本机堆栈都将被“弹出”(堆栈指针重置),所以我不知道您可以用这些内存做什么。我正在探索沙箱解决方案。例如,检查我发现的现有工作: