¿Cuáles son las consecuencias si intentamos conectar un hilo nativo permanentemente a la DVM (JVM)?

¿Es factible adjuntar un subproceso nativo de forma permanente a la JVM (AttachCurrentThread) (o) es mejor adjuntar cuando sea necesario (llamando a las funciones de java) y desconectarse inmediatamente una vez que el trabajo está terminado

Escribí una muestra de aplicación nativa con los casos anteriores, no encontré ninguna diferencia. Pero por google, vaguamente llegué a saber que, cuando se adjunta a JVM, la programación de hilo JVMs es responsable de la programación de otro sistema operativo se programa el hilo nativo (si no se adjunta). ¿Es esto cierto?

Es importante separar cualquier hilo que haya sido conectado anteriormente; De lo contrario, el programa no saldrá cuando llame a DestroyJavaVM. – http://java.sun.com/developer/onlineTraining/Programming/JDCBook/jniref.html#attach

¿Habrá algún problema de rendimiento?
Por favor, hágamelo saber si alguien sabe, su uno mi aspecto de diseño importante.

Gracias y Saludos.

3 Solutions collect form web for “¿Cuáles son las consecuencias si intentamos conectar un hilo nativo permanentemente a la DVM (JVM)?”

En términos generales, el coste de rendimiento principal es la creación de subprocesos a nivel de sistema operativo. Ya sea el subproceso está creando de forma nativa y luego adjunto o directamente creado como java.lang.Thread de Java API.

Si vuelve a usar el mismo subproceso nativo, el rendimiento será bueno. Por cierto, no cree docenas de hilos nativos.

La JVM no programa hilos propios . Puede forzarlos en estado de reposo por diversas razones como la recolección de basura. En ese caso específico, tiene que esperar una llamada JNI de un hilo nativo antes de recopilar. Por lo que tiene que evitar la ejecución de código demasiado largo sin llamada JNI para mantener el consumo de montón de VM bajo.

Por otra parte, debe tener cuidado de llamar a DeleteLocalRef antes de separar un hilo nativo o bien su VM perderá memoria.

Cuando un hilo nativo está conectado permanentemente, no es capaz de salir del hilo nativo. Se está estrellando cuando intentamos salir del hilo nativo sin separarnos. Pero cuando nos separamos, el hilo nativo fue capaz de hacer una salida graciosa.

No he experimentado ninguna consecuencia excepto para el funcionamiento aumentado.

Eso es exactamente lo que hago en una aplicación que está ByteBuffer datos ByteBuffer directamente asignados entre las dos capas. Descubrí que el costo de adjuntar / separar constantemente era muy alto, como uno podría esperar. Mi enfoque es lanzar un solo subproceso gestionado por Java que hace una llamada JNI de bloqueo en el lanzamiento, que en la capa C / C ++ contiene un bucle condition / signal-style (para no comer ciclos de CPU). Entonces puedo señalar hacia abajo al bucle en cualquier momento los datos están listos para el procesamiento, y por el contrario, puedo señalar a Java cuando el trabajo duro se hace.

 new Thread(() -> myBlockingJNICall()).start(); 

Luego hacia abajo en la capa C:

 #ifdef __cplusplus extern "C" { #endif // __cplusplus static JavaVM *jvm = nullptr; // captures the JVM on load JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *the_jvm, void* /*reserved*/) { jvm = the_jvm; return JNI_VERSION_1_2; // must export 1_2 to use any of the new functions, 1_1 otherwise } JNIEXPORT jboolean JNICALL Java_myBlockingJNICall(JNIEnv *env, jobject) { // loop forever waiting for work and using env for signalling // jvm is stored in case we need to manually attach (or perform more complex work requiring jvm access) return JNI_TRUE; } #ifdef __cplusplus } #endif // __cplusplus 
  • Android: forma estándar de hacer correr un hilo cada segundo
  • Inicio de un runnable en el hilo de fondo
  • Cómo ejecutar un hilo Runnable en Android?
  • La mejor manera de enviar solicitudes HTTP GET ansynchronously en Android?
  • ¿Hay RxJava equivalente a Handler.postDelayed (Runnable r, delayMillis largo)
  • Nuevo Runnable () pero no nuevo hilo?
  • Cómo crear un hilo en Android NDK?
  • ¿Cuál es la mejor manera de depurar los problemas de RxJava con mensajes no recibidos?
  • ¿Cómo puedo ejecutar código en un hilo de fondo en Android?
  • ¿Es legal llamar al método de inicio dos veces en el mismo hilo?
  • Cuando está fuera del hilo principal, ¿cómo puedo obtener algún código para ejecutarse en el hilo principal lo más rápido posible?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.