Question

J'ai une bibliothèque C qui veut un tampon temporaire pour l'espace de travail. Je songe à faire passer l'adresse d'un tampon d'octets directement.

  • est la machine virtuelle jamais permis de déplacer le tampon avant qu'il ne soit finalement libéré? La bibliothèque native sera tenue sur le pointeur après la trame JNI disparaît. Je crois comprendre que les références d'objets locaux JNI ne peuvent pas être mises en cache, car la machine virtuelle peut les déplacer pendant GC. Est-ce que cela s'applique à l'adresse tampon?

  • Je comprends que la machine virtuelle libérera la mémoire tampon si j'Allouer un tampon en Java, puis laissez l'objet tampon hors de portée. Si je crée un nouveau tampon dans le code natif à l'aide NewDirectByteBuffer, dont la responsabilité est à libérer la mémoire de soutien?

  • Qu'est-ce qui se passe si je crée un nouveau tampon dans le code natif à l'aide NewDirectByteBuffer et une adresse déjà utilisée par un tampon directe? Est-ce que la mémoire est doublement libéré? Est-ce que la référence VM compter le bloc de mémoire et tenter de le libérer lorsque le dernier tampon référençant est détruite?

Était-ce utile?

La solution

  

est la machine virtuelle jamais permis de déplacer la   un tampon avant d'être finalement libéré?

Il ne sera pas délocaliser, parce que la mémoire tampon directe ne fait pas partie du tas de GC.

  

Si je crée un nouveau tampon en natif   code en utilisant NewDirectByteBuffer, dont   la responsabilité est à la libérer   La mémoire sauvegarde?

Il est de votre responsabilité (code natif) pour le libérer. La machine virtuelle Java ne pouvait pas savoir quelle méthode a été utilisée pour allouer ce magasin de support (pourrait être malloc'd, pourrait être un tampon statique, etc.)

  

Qu'est-ce qui se passe si je crée un nouveau tampon   dans le code natif à l'aide   NewDirectByteBuffer et une adresse   déjà utilisé par un tampon directe?

Étant donné que la machine virtuelle ne tentera pas de libérer la mémoire dont l'adresse est transmise à NewDirectByteBuffer, rien ne se passera si vous passez la même adresse deux fois.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top