2017-10-20 21 views
11

J'ai une région de mémoire enveloppée avec JNI NewDirectByteBuffer. Je voudrais courir le code libre/libérer dans le nettoyeur du ByteBuffer. Y at-il un moyen de le faire ou dois-je offrir une méthode gratuite personnalisée que l'utilisateur devra appeler avec le ByteBuffer?Libérer la mémoire enveloppée avec NewDirectByteBuffer

Modifier

Pour clarifier les choses, je me suis réparti la mémoire et appelé moi-même NewDirectByteBuffer. Je voudrais savoir comment je devrais coordonner le nettoyage avec le nettoyeur.

+2

Dans DirectByteBuffer de Java 8, vous pouvez appeler la méthode Cleaner.clean() bien qu'il ne s'agisse pas d'une API publique, utilisez-la sachant qu'elle n'est pas portable. –

+0

@PeterLawrey Et cela appellera gratuitement() toujours? Que faire si j'ai besoin d'une autre fonction de nettoyage que free()? –

+0

Il fera tout ce qui est approprié pour libérer la mémoire. Vous n'avez aucune preuve que cela implique d'appeler 'free()'. – EJP

Répondre

2

Vous utilisez JNI.newDirectByteBuffer, vous pouvez et vous devriez libérer de la mémoire manuellement, et vous nettoyez le travail en même temps.

Si vous voulez un nettoyage automatique, ce dont vous avez besoin est de surveiller le cycle de vie de l'objet. Et si vous voulez seulement travailler avec l'API et n'utilisez pas la réflexion, vous pouvez utiliser un PhantomReference avec ReferenceQueue, et créer un thread de démon pour interroger la file d'attente. Faites votre travail de nettoyage une fois la référence dans la file d'attente de référence.

+0

Veuillez lire la question. Je n'utilise pas 'ByteBuffer.allocateDirect', j'utilise' NewDirectByteBuffer' de JNI. Parce que 'NewDirectByteBuffer' ne prend pas un pointeur de fonction libre, la JVM n'a aucun moyen de savoir comment libérer la zone de mémoire. 'free' peut ou peut ne pas être approprié. –

+0

'NewDirectByteBuffer' renvoie un jobject de type 'DirectByteBuffer'. Donc, la solution est la même, mais de changer le nettoyeur pour créer un nettoyeur. –

+0

Alors, comment contrôlez-vous la fonction libre appelée? –