Précédent   Forum des professionnels en informatique > Java > Général Java > APIs
APIs Forum sur les API standard et API complémentaires. Avant de poster -> FAQ Java, Les meilleures API Java
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/01/2012, 17h35   #1
Membre habitué
 
Homme Thomas Escolan
Architecte JEE/Spring - ScrumMaster
Inscription : juin 2010
Messages : 200
Détails du profil
Informations personnelles :
Nom : Homme Thomas Escolan
Âge : 38
Localisation : France

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

Informations forums :
Inscription : juin 2010
Messages : 200
Points : 116
Points : 116
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 :
Citation:
-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 :
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 :
Citation:
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.
tooms4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 18h18   #2
Expert Confirmé Sénior
 
Inscription : septembre 2004
Messages : 5 095
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 095
Points : 7 021
Points : 7 021
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().
thelvin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 18h41   #3
Modérateur
 
Avatar de sinok
 
Inscription : août 2004
Messages : 8 227
Détails du profil
Informations personnelles :
Âge : 32
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : août 2004
Messages : 8 227
Points : 10 910
Points : 10 910
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.
sinok est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 18h44   #4
Membre habitué
 
Homme Thomas Escolan
Architecte JEE/Spring - ScrumMaster
Inscription : juin 2010
Messages : 200
Détails du profil
Informations personnelles :
Nom : Homme Thomas Escolan
Âge : 38
Localisation : France

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

Informations forums :
Inscription : juin 2010
Messages : 200
Points : 116
Points : 116
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...
tooms4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 19h15   #5
Membre chevronné
 
Avatar de Heimdal
 
Inscription : avril 2006
Messages : 535
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 535
Points : 601
Points : 601
Citation:
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.
Heimdal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2012, 09h41   #6
Membre habitué
 
Homme Thomas Escolan
Architecte JEE/Spring - ScrumMaster
Inscription : juin 2010
Messages : 200
Détails du profil
Informations personnelles :
Nom : Homme Thomas Escolan
Âge : 38
Localisation : France

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

Informations forums :
Inscription : juin 2010
Messages : 200
Points : 116
Points : 116
Citation:
é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 ?
tooms4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h23.


 
 
 
 
Partenaires

Hébergement Web