IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API standards et tierces Java Discussion :

[ExecutorService] transmettre les paramètres JVM


Sujet :

API standards et tierces Java

  1. #1
    Membre habitué
    Homme Profil pro
    Architecte senior Java EE/Spring - ScrumMaster
    Inscrit en
    Juin 2010
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Architecte senior Java EE/Spring - ScrumMaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2010
    Messages : 229
    Points : 162
    Points
    162
    Par défaut [ExecutorService] transmettre les paramètres JVM
    Bonjour à tous,

    Pour pouvoir exécuter un traitement (Ghost4j), j'ai dû augmenter les capacités mémoire de la JVM ; ainsi j'ai pu exécuter mes tests :
    -Xms64m
    -Xmx512m
    -XX:MaxPermSize=128m
    Comme ces traitements sont répétitifs et prennent pas mal de temps par rapport au temps d'exécution de l'application, j'ai voulu passer la section concernée dans un thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    this.executor = Executors.newCachedThreadPool();
    ...
    this.executor.execute(new Runnable() {
    	public void run() {
    		File thumbnail = generatePdfThumbnail(file); // Ghost4j
    		if (thumbnail != null) {
    			String thumbnailLink = buildLink(refDir, thumbnail);
    			builder.buildThumbnailNode(node, thumbnail, thumbnailLink);
    		}
    	}
    });
    ...
    this.executor.shutdown();
    Seulement, lorsque j'exécute le traitement, il s'avère que les paramètres mémoire ne sont manifestement pas transmis au thread :
    Exception in thread "pool-1-thread-13" java.lang.OutOfMemoryError: Java heap space
    Quelqu'un sait-il ce qu'il convient de faire, SVP ?
    Merci d'avance.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par tooms4444 Voir le message
    Seulement, lorsque j'exécute le traitement, il s'avère que les paramètres mémoire ne sont manifestement pas transmis au thread :
    Bien sûr que si. Les threads font partie de l'application, ils utilisent la même mémoire.

    Par contre, si tu fais ça dans une logique de threads avec Executors.newCachedThreadPool(), ce code va être exécuté pas plusieurs threads à la fois, et chacun d'eux va consommer de la mémoire.

    Du coup, même si la mémoire suffit pour faire un traitement à la fois, elle ne suffit pas pour en faire plus d'un.
    Il ne faut pas avoir plusieurs threads. Seulement un seul. Avec newSingleThreadExecutor().
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Ou un fixedThreadPool, qui s'assure du nombre maximum de threads en parallèle.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  4. #4
    Membre habitué
    Homme Profil pro
    Architecte senior Java EE/Spring - ScrumMaster
    Inscrit en
    Juin 2010
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Architecte senior Java EE/Spring - ScrumMaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2010
    Messages : 229
    Points : 162
    Points
    162
    Par défaut
    Merci à tous les deux ; mais je ne voix pas l'intérêt du SingleThread ??
    Quant au FixedThread, j'ai mis à 2 ; et ça plante encore...

  5. #5
    Membre éclairé Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Points : 718
    Points
    718
    Par défaut
    mais je ne voix pas l'intérêt du SingleThread ??
    A lancer une tache asynchrone par exemple.
    Ou encore éviter que plus d'une tache qui parait anormalement gourmande ne tourne en parallèle.

    Tu peux encore augmenter ton Xmx (au moins à 1024, après ça dépendra de ton runtime et de ton OS 32 ou 64 bits).
    Etant donné que t'as mémoire gonflera à coup sur tu peux mettre ton Xms à la même valeur (ça ne changera rien au pb mais ca evite de perdre du temps à allouer plusieurs fois)
    Tu peux sans doute gratter de la mémoire sur ton MaxPermSize.

    Je ne connais pas Ghost4j mais je trouve particulièrement louche que tu aies besoin de 512M pour générer des pdfs.

    Je suppose que la meilleure solution ne réside pas dans l'augmentation infinie de la mémoire allouée à la JVM.

  6. #6
    Membre habitué
    Homme Profil pro
    Architecte senior Java EE/Spring - ScrumMaster
    Inscrit en
    Juin 2010
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Architecte senior Java EE/Spring - ScrumMaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2010
    Messages : 229
    Points : 162
    Points
    162
    Par défaut
    éviter que plus d'une tache qui parait anormalement gourmande ne tourne en parallèle
    Ouaich, on en est là...

    En fait c'est un traitement qui crée des vignettes PNG à partir de fichiers PDF.
    J'ai fait des essais avec PDF Renderer, PDF box et jPedal, mais seul GhostScript a traité l'ensemble des éléments affichés, qui plus est sur des formats multiples.
    L'extraction de la première page (cover) prend 25 minutes, tandis que le traitement sans extraction PNG passe en 3s. Je précise toutefois qu'il y a environ 300 fichiers PDF (on n'a donc que quelques secondes d'extraction par fichier).

    J'avais augmenté les paramètres JVM pour que ça fonctionne, mais je pensais (bêtement) passer entre les gouttes avec du threading. Je comprends maintenant que le ratio entre le temps "sans" et celui "avec" traitement GhostScript est beaucoup trop grand pour que ça donne quelque chose, eu égard au nombre de fichiers PDF.

    Il me reste à faire des essais avec IcePdf ; quelqu'un a des infos là-dessus, SVP ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Modifier les paramètre -Xms -Xmx par défaut de la JVM
    Par xb70walkyrie dans le forum Débuter avec Java
    Réponses: 12
    Dernier message: 23/02/2013, 21h17
  2. transmettre les paramètres a l'url jquery
    Par diengkals dans le forum jQuery
    Réponses: 7
    Dernier message: 04/07/2012, 13h17
  3. Réponses: 0
    Dernier message: 21/06/2012, 12h22
  4. Comment transmettre les paramètres d'une requête ?
    Par verbose dans le forum Développement Web en Java
    Réponses: 5
    Dernier message: 12/05/2011, 22h10
  5. Réponses: 4
    Dernier message: 04/07/2003, 19h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo