【问题标题】:Unified stack for native and Java in Android Runtime (ART)Android 运行时 (ART) 中本机和 Java 的统一堆栈
【发布时间】:2014-09-13 03:59:29
【问题描述】:

https://developer.android.com/guide/practices/verifying-apps-art.html#Stack_Size

该文档说 ART 有一个用于原生和 Java 的统一堆栈。 你能告诉我这是什么意思吗? 我知道线程的堆栈大小只能在创建时定义,例如在 Java 代码中使用 Thread 类的构造函数或在本机代码中使用 pthread API。 所以我无法理解统一堆栈如何影响应用程序的行为。 请指导我一些好的教程或 sn-p 抛出 StackOverflowError 由统一堆栈导致。

【问题讨论】:

  • 我不确定您所说的“示例”是什么意思。您是否曾经为您在应用程序中创建的线程明确设置堆栈大小(如果您不知道,答案可能是“否”)?如果没有,您似乎没有什么可担心的。或者,您在使用 ART 的设备上运行应用时遇到过与堆栈相关的错误?
  • 我的意思是这个例子是代码 sn-p throws StackOverflowError 导致统一堆栈。我已经在 J​​ava 中明确指定了堆栈大小,但我在 ART 上没有任何问题。感谢您的评论。
  • 您是说您的代码会导致您尝试调试的错误吗?如果是这样,请将其发布在问题中,而不是作为链接。或者您只是想知道什么样的代码可以做到这一点?
  • 感谢您的评论。我有代码,但无法做出仅在 ART 上而不是在 Dalvik 上重现引发 StackOverflowError 的条件。在上述网站中,谷歌提到如下; “在 Java 中,查看对指定显式堆栈大小的 Thread 构造函数的调用。例如,如果发生 StackOverflowError,您将需要增加大小。”

标签: android dalvik stack-size android-runtime


【解决方案1】:

在 Dalvik 中,每个线程都有两个独立的堆栈,一个用于本地代码,一个用于 Java 代码。在 ART 中,每个线程都有一个用于本地代码和 Java 代码的堆栈。如果您在代码(本机或 Java)的某个地方创建了一个线程并指定了它的堆栈大小,那么您现在应该知道这个大小对于两个代码环境是共享的,您应该相应地调整它。

【讨论】:

  • 感谢您的帮助。我明白了,但我不知道什么样的实现会引发由统一堆栈引起的 StackOverflowError。
  • 在 ART 中,由 java.lang.Thread 创建的堆栈大小始终大于 1MB 的 Thread::FixStackSize,即使指定的堆栈大小很小。所以我认为 java.lang.Thread 的线程永远不会只在 ART 上进入 StackOverflow(而不是在 Dalvik 上),因此不明白谷歌说什么; “在 Java 中,查看对指定显式堆栈大小的 Thread 构造函数的调用。例如,如果发生 StackOverflowError,您将需要增加大小。”
  • 但是您可以指定大于 1 mb 的大小并仍然使用它,不是吗?你能在这里发布那个固定大小的东西的来源吗?谢谢
  • 感谢您的评论。我们可以在 /art/runtime/thread.cc 的第 205 行看到 FixStackSize。 android.googlesource.com/platform/art/+/master/runtime/... 根据它,我认为如果在 Dalvik 中没有发生 StackOverflowError,在 ART 中也不会发生,因为在 ART 中我们总是有 1MB 的剩余空间(这是 Dalvik 中默认的原生堆栈大小)除了我们指定给 java.lang.Thread 的构造函数之外。谢谢。
猜你喜欢
  • 2019-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多