Je prévois d'utiliser un DirectByteBuffers pour interfacer une bibliothèque tierce écrite en C++.Répliquer DirectByteBuffers OutOfMemoryError
Je me suis inquiété de the hadoop docs en disant:
DirectByteBuffers sont des ordures collectées à l'aide d'une référence fantôme et une file d'attente de référence. De temps en temps, la JVM vérifie la file d'attente de référence et nettoie le DirectByteBuffers. Cependant, comme cela ne se produit pas immédiatement après avoir ignoré toutes les références à un DirectByteBuffer, il est facile de OutOfMemoryError d'utiliser DirectByteBuffers.
D'abord, je ne suis pas sûr que toutes les implémentations de DirectByteBuffers sont les mêmes depuis le OpenJDK 7 ne semble pas utiliser la référence fantôme, mais repose sur la méthode finale qui devrait avoir des pénalités de performance.
En second lieu, j'ai essayé de reproduire un OutOfMemoryError utilisant
public static void main(String[] args) {
for(;;){
ByteBuffer buff = ByteBuffer.allocateDirect(1000*1000);
}
}
et il semble que tout se correctement les déchets collectés. Si tel est le cas sur ma machine en utilisant
java version "1.6.0_31"
Java(TM) SE Runtime Environment (build 1.6.0_31-b04-415-11M3635)
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01-415, mixed mode)
puis-je compter que cela fonctionnera sur toutes les autres versions de la machine et java> = 1.6?
Merci
La documentation Hadoop est incorrecte: ils ont le processus de retour à l'avant. L'état d'accessibilité de l'élément est d'abord modifié, puis ajouté à la file d'attente de référence. La JVM ne vérifie pas du tout la file d'attente de référence: c'est le code Java. En fait, je ne trouve aucune file d'attente de référence dans le code source: peut-être parle-t-il de sa propre utilisation de DirectByteBuffers? – EJP