Gestione della memoria Java per JNI

Ho due domande:

  1. Cosa succede se ho una chiamata JNI a un metodo e il metodo JNI perde memoria. Una volta completato questo metodo, il Garbage Collector di JVM sarà in grado di recuperare quella memoria. Ho sentito che la JVM non gestisce lo spazio di heap utilizzato da JNI? Ma la memoria utilizzata da JNI è una parte della memoria utilizzata dal processo Java?

  2. È assolutamente necessario utilizzare JNI per ottenere IPC? Quali sono le altre popolari tecniche Java o esiste una libreria Open Source per ottenere la memoria condivisa in Java?

  1. No: “il framework JNI non fornisce alcuna garbage collection automatica per le risorse di memoria non JVM allocate dal codice in esecuzione sul lato nativo” ( Wikipedia ).
  2. No, Java ha socket e infatti ProcessBuilder. La memoria condivisa può essere raggiunta con MappedByteBuffer .
  1. È necessario deallocare qualsiasi risorsa os creata nel codice nativo, come File Descriptor, indirizzo di memoria (allocata da malloc ecc.) Perché non sono vincolanti con alcuna istanza di jvm.
  2. È ansible considerare l’uso di file mappati in memoria ( esempio ).

  3. È ansible utilizzare RPC (tra computer e computer) in contesto IPC, come socket, servizio Web, JMS, ecc.

  1. con tutta probabilità si, anche se non sono del tutto sicuro che non esista un modo per cancellare quella memoria.
  2. dare un’occhiata a ProcessBuilder – potrebbe essere di aiuto escludere JNI per ottenere IPC.