2011-05-27 7 views
13

J'utilise une JVM 64 bits (Oracle), lorsque j'essaie d'allouer des tailles de tampon supérieures à 256 Mo, il se plaint et génère une erreur de "segmentation fault". I et l'allocation des tampons de mémoire directe en utilisant Java NIO, et le transfert et la réception de ces objets vers et à partir d'un programme client RMI sur la même machine (Linux 64 bits).Erreur de segmentation Java

Une idée?

+9

Pouvez-vous poster un peu de code? –

+1

Quel est votre paramètre de tas max? – jtahlborn

+5

Une erreur de segmentation ne peut se produire que si vous avez un bogue dans une bibliothèque JNI ou dans la JVM. La première chose que je voudrais essayer est de vous assurer que vous avez Java 6 mise à jour 25 ou la dernière version. –

Répondre

0

Avez-vous essayé la solution de contournement suivante du rapport de bogue?

Run System.gc() avant ByteBuffer.allocateDirect() ...

+0

Complètement non pertinent. Les tampons directs ne sortent pas de l'espace de collecte des ordures. – EJP

+0

@EJP: si vous lisez le rapport de bug, cela donne une justification plausible pour expliquer pourquoi cela pourrait aider le problème. –

+0

Vous ne pouvez jamais être sûr que System.gc() fait quoi que ce soit ... donc ce n'est pas un bon moyen de résoudre n'importe quel problème ... je suis d'accord avec EJP et j'étendrai sa déclaration à cet appel dans la majorité des cas cas complètement hors de propos. C'est juste un conseil à la JVM que le programme aimerait faire un GC mais vous ne pouvez jamais dire si la JVM le fera. – Chris

2

erreurs de segmentation se produisent dans les programmes (comme la machine virtuelle Java) en raison d'erreurs de mémoire. Soit la JVM a un bug qui lui fait essayer d'utiliser la mauvaise section de la mémoire sur l'ordinateur quand il est monté pour utiliser autant d'espace tampon, ou il essaie d'allouer 256M de mémoire et dans le processus il utilise plus d'espace que l'ordinateur l'a donné. En bref, il me semble que la JVM 64 bits n'a pas été construite pour allouer autant d'espace avec ses paramètres actuels. Peut-être pourriez-vous essayer de configurer la JVM pour qu'elle demande plus de mémoire à l'ordinateur avant de démarrer. Le commentaire de jtahlborn sur le fait de demander quel est le paramètre de tas maximum sur la JVM est aussi une question que vous devriez poser avant de lancer à nouveau le programme.