2011-02-25 3 views
2

Dans mon projet, j'ai un module pour télécharger plusieurs images et créer les vignettes à la fois. Pour le téléchargement, j'utilise JavaFX et pour créer des vignettes, j'utilise Java.Java tas espace (java.lang.OutOfMemoryError)

J'ai écrit le code de téléchargement et l'appel de la fonction de création de vignettes dans une boucle for. Si le nombre d'images téléchargement est plus de cinq ans, je reçois cette erreur:

Java heap space (java.lang.OutOfMemoryError) 

Je pense, le code pour le téléchargement est très bien, et le problème avec le code de création de vignettes. Comment puis-je résoudre ce problème? Comment devrais-je changer la structure de mon code?

Ceci est mon code JavaFX:

fgUrl = fc.getSelectedFiles(); 
for(fg in fgUrl) { 
    try { 
     System.gc(); 
     fileURL = "file:///{fg.toString()}"; 
     fileURL = fileURL.replace("\\", "/"); 
     def dt = DateTime{}.instant; 
     var datetime = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss:SSS").format(dt); 
     pic_url = datetime.replace("-", "_").replace(":", "_").replace(" ", "_"); 
     datetime = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(dt); 
     f = new File("C:\\uploaded\\{pic_url}.jpg"); 
     uploadFile(fileURL, f,save_index,datetime,pic_url); // This function will save selected image in the working directory of the system. 
     var resize_ob = new resizeImage(url.replace("file:///", ""),"C:/thumbnails/{pic_url2}.jpg");// This will call the java thumbnail creation function. 
     save_index++; 
    } 
    catch(e:Exception) { } 
} 
+0

Avez-vous des appels récursifs en elle? Voyons une partie du code. – corsiKa

+0

Libérez-vous ensuite la mémoire utilisée par les images? Est-ce que Java peut faire ça? –

+0

Quelles technologies utilisez-vous? Cadres? – Koekiebox

Répondre

3

Vous pouvez essayer d'utiliser des profileurs de mémoire pour voir quelle portion de code/classe/méthode consomme plus de mémoire. Vous pouvez commencer avec JVisualVM ou JConsole gratuit qui vient avec JDK.

D'autres bien connus profileurs sont:

->Optimize IT

->JProfiler

+4

Un bon profileur de départ gratuit est jvisualvm dans le JDK. –

+0

Le problème de mémoire dans le code JavaFX que vous avez écrit ou provient-il du framework? – Ansgar

2

Tant que vous avez une référence à ces images (dans une variable ou à l'intérieur Liste ou quelque chose) le Garbage Collector automatique de Java nettoyer wont vers le haut. Vous ne devez les charger que lorsque vous en avez besoin, puis définissez les variables sur null dès que vous avez terminé avec chaque image.

Les images sont assez volumineuses et Java les décompresse probablement en bitmaps (comme les fichiers bmp, énormes) donc ce n'est pas une surprise.

La récupération de place ne s'exécute pas constamment (elle se nettoie de temps en temps), donc si vous voulez lui demander de s'exécuter maintenant (vous ne pouvez pas la forcer), vous pouvez appeler System.gc() ;. La récupération de place est lente cependant, cela peut ralentir votre traitement.

Si nécessaire, vous pouvez augmenter votre maximum de mémoire, mais il est préférable de faire ce qui précède.

Pour plus d'informations je peux fournir une réponse plus détaillée.

+0

Merci beaucoup pour votre réponse, – laradev

+0

J'ai ajouté le code javafx à la question – laradev

Questions connexes