在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问题,但我仍然无法理解,特别是:
答案 0 :(得分:1)
执行堆栈的合理实现将Java和本机帧混合在一个堆栈中。也就是说,如果Java方法调用一个调用Java方法的本机函数,那么与调用相对应的帧都被推送到同一个堆栈上。
一般而言,本机堆是用于动态分配内存的存储区域。 Java堆是为Java对象保留的本机堆中的一个区域,其内容由垃圾收集器管理。根据垃圾收集器的实现,Java堆可能是连续的,也可能被分成不同的区域。
我不熟悉Dalvik或ART的具体细节,但在这方面它们可能与其他JVM一样。