java - 如果我们尝试将 Native Thread 永久附加到 DVM (JVM) 会产生什么后果?

标签 java android multithreading android-ndk java-native-interface

将 native 线程永久附加到 JVM (AttachCurrentThread) 是否可行(或者)在需要时附加(调用 java 函数)并在工作完成后立即分离是否更好

我用上述案例编写了一个示例 native 应用程序,没有发现任何区别。但是通过谷歌搜索,我模糊地知道,当附加到 JVM 时,JVM 线程调度负责调度,否则操作系统将调度 native 线程(如果未附加)。这是真的吗?

分离之前连接的任何线程很重要;否则,调用 DestroyJavaVM 时程序不会退出。 - http://java.sun.com/developer/onlineTraining/Programming/JDCBook/jniref.html#attach

会不会有什么性能问题?
如果有人知道,请告诉我,这是我重要的设计方面之一。

感谢和问候。

最佳答案

一般来说,主要的性能成本是操作系统级别的线程创建。线程是 native 创建然后附加或直接从 Java API 创建为 java.lang.Thread

如果您重复使用同一个 native 线程,性能会很好。顺便说一下,不要创建几十个 native 线程。

JVM does not schedule threads itself .它可能会出于各种原因(例如垃圾收集)而迫使它们进入休眠状态。在那种特定情况下,它必须在收集之前等待来自 native 线程的 JNI 调用。因此,您必须避免在没有 JNI 调用的情况下执行太长的代码,以保持较低的 VM 堆消耗。

此外,在分离 native 线程之前,您必须小心调用 DeleteLocalRef,否则您的 VM 将泄漏内存。

关于java - 如果我们尝试将 Native Thread 永久附加到 DVM (JVM) 会产生什么后果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8575413/

相关文章:

c# - 新线程的开始选项卡,关闭选项卡和结束线程

java - getGlobalVisibleRect 当前可见屏幕

android - 多语言持久性数据库处理

java - 可以使用多线程来使这个矩阵 vector 乘法算法更加高效吗?

c++ - gcc 4.3 的 std::string 线程安全吗?

安卓用户界面 : when can I directly modify a view?

java - 如何从 java 运行 python 脚本?

java - 使用运行时从 Java 运行 smbclient 命令

java - 应用设计模式设置和获取货币矩阵值

android - 在 ios 和 android 上 react native 完全相同的 header ?