JVM Heap Space / Serveur Unix

Fermé
Halcyon Messages postés 21 Date d'inscription dimanche 29 juin 2008 Statut Membre Dernière intervention 15 juin 2014 - 12 sept. 2012 à 13:48
KX Messages postés 16760 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 - 13 sept. 2012 à 12:46
Bonjour,

Je rencontre un problème à mon travail.
Je maintiens un module codé en Java, qui est censé compiler des fichiers XML en entrée dans un seul en sortie.
Les clients pour qui je travaille m'ont fait parvenir les fichiers, le programme fonctionne très bien sauf pour un seul fichier trop gros.

Du coup le programme s'interrompt et l'erreur OutOfMemory du Java Heap Space apparaît.
Je ne pense pas pouvoir optimiser plus ce code qui n'est pas de moi et qui l'a déjà été, et je suis au max d'allocation mémoire de la JVM lorsque je lance le programme (je ne peux pas excéder les 3go dans l'option java -Xmx3g sinon je me fait jeter).

Je n'ai que des connaissances en programmation en objet mais très peu sur tout ce qui est technique et propre au Java.

Je voulais savoir comment est gérée la mémoire de la JVM lors de l'appel d'un programme Java (et surtout y'a-t-il un rapport direct avec la Ram ou autre mémoire physique) ?
Le serveur sur lequel est lancé le programme est un serveur Unix.

Merci pour vos réponses
A voir également:

3 réponses

KX Messages postés 16760 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
12 sept. 2012 à 15:06
"y'a-t-il un rapport direct avec la Ram"
Bien sûr, si tu utilises l'option -Xmx3g ça veut dire que tu autorises la JVM à utiliser jusqu'à 3 Go de RAM. Si tu fais plus et que ça plante c'est que le système ne dispose pas plus de RAM utilisable (peut-être : 4Go de RAM - utilisation système - programmes tiers = 3 Go)

Mais l'interprétation d'un fichier ne devrait pas utiliser autant de ressources !


"Je ne pense pas pouvoir optimiser plus ce code"
À mon avis, là tu te trompes !
Il y a quelques temps, dans une autre discussion, on avait à peu près le même problème, et une fois résolu l'erreur ne venait pas du tout de la lecture du fichier, et encore moins d'une erreur physique du serveur, ou autre, c'était une bête erreur dans le code...
(En l'occurrence, des requêtes de BDD étaient ouvertes pour chaque ligne du fichier, mais jamais fermées, on a corrigé le code en utilisant une seule requête pour tout le fichier.)

Il faudrait qu'on puisse voir la partie de code qui concerne la lecture de ton fichier (ouverture du flux, traitement des lignes, et fermeture), avec quelques commentaires pour expliquer ce que ça fait...
0
Halcyon Messages postés 21 Date d'inscription dimanche 29 juin 2008 Statut Membre Dernière intervention 15 juin 2014 3
13 sept. 2012 à 12:21
Bonjour,

Merci pour cette réponse.
Malheureusement je ne pense pas avoir le droit de divulguer mon code (secret professionnel oblige, sinon je l'aurais déjà fait), d'autant plus qu'il n'est pas de moi mais d'un prestataire (qui a déjà rencontré mon problème auparavant et m'a simplement précisé qu'il n'y avait rien à faire pour corriger ce problème).

Quand je dis que je ne peux pas plus l'optimiser, c'est parce qu'il est censé déjà l'être par ce prestataire justement.

Les fournisseurs des fichiers quant à eux utilisent 6go de mémoire allouée à leur JVM (sûrement pour générer leurs fichiers XML que j'utilise dans mon programme ensuite).
0
KX Messages postés 16760 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
13 sept. 2012 à 12:46
Dans ce cas contacte ton prestataire, mais puisque "il n'y a rien à faire pour corriger ce problème", on ne peux pas faire grand chose...

Après tu peux toujours augmenter la RAM de ton serveur, mais ça peux coûter cher !
0