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

Java Discussion :

Problème de Thread qui prend trop de mémoire


Sujet :

Java

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 193
    Points : 47
    Points
    47
    Par défaut Problème de Thread qui prend trop de mémoire
    Bonjour,

    Je developpe un outil qui va tester differents environnement d'un même outil. Il s'agit d'un gros Outil de gestion present sur 8 machines differentes et comptant avec en tout 14 environement (instances).


    L'API pour shooter l'outil est tres gourmande mais normallement la plus gros des instances ne demandent pas plus de 512 donc un Xmx512m devrait suffir...


    Le problème est que ma mémoire ne smble être relaché depuis les threads...

    Donc ca s'accumule et ca crash (pourtant je suis en Xmx1024 sur un poste en 2048)....

    Voila code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
     
    package ppaceMaker;
     
    import java.net.MalformedURLException;
    import java.util.ArrayList;
    import java.util.Iterator;
     
    import org.apache.log4j.Logger;
    import org.apache.log4j.PropertyConfigurator;
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
     
    import utilities.MonAppli;
    import utilities.Presta_XML;
    import utilities.Utils;
     
    import com.sciforma.psnext.api.PSException;
     
    public class NonStaticFullConnectionDiagnosis {
     
    	static final long start = System.currentTimeMillis();
     
    	static long env_start_time = start;
     
    	static long now = start;
     
    	final boolean OK = true;
     
    	private static int TIME_OUT = 300;
     
    	private static final Logger logger = Logger.getLogger("PACEMAKER");
     
    	static boolean timeOut = false;
     
    	static boolean success = false;
     
    	static Environment currentEnv;
     
    	static Exception rootError;
     
    	static ArrayList<Environment> environements;
     
    	Thread tMonAppli;
     
    	public NonStaticFullConnectionDiagnosis() {
    	}
     
    	private synchronized void lanchtest() throws PSException {
    		MonAppli mytest = new MonAppli(currentEnv.getUsername(), currentEnv
    				.getPassword(), currentEnv.getServerURL(), true, true);
    		mytest.closeSession();
     
    		long lUsedMemory = (Runtime.getRuntime().totalMemory() - Runtime
    				.getRuntime().freeMemory()) / 1048576;
    		logger.info("Used Memory: " + lUsedMemory + " Mo");
    		logger.info("Total Memory : " + (Runtime.getRuntime().totalMemory())
    				/ 1048576 + " Mo");
    		mytest.freeSessionMemory();
    		mytest = null;
     
    		// System.gc();
     
    		lUsedMemory = (Runtime.getRuntime().totalMemory() - Runtime
    				.getRuntime().freeMemory()) / 1048576;
    		logger.info("Used Memory: " + lUsedMemory + " Mo");
    		logger.info("Total Memory : " + (Runtime.getRuntime().totalMemory())
    				/ 1048576 + " Mo");
     
    		System.gc();
     
    		lUsedMemory = (Runtime.getRuntime().totalMemory() - Runtime
    				.getRuntime().freeMemory()) / 1048576;
    		logger.info("Used Memory: " + lUsedMemory + " Mo");
    		logger.info("Total Memory : " + (Runtime.getRuntime().totalMemory())
    				/ 1048576 + " Mo");
     
    	}
     
    	static ArrayList initializeOption() throws MalformedURLException,
    			DocumentException {
     
    		environements = new ArrayList<Environment>();
    		Document EnvXML = Presta_XML.parse(ConnectionDiagnosis.class
    				.getClassLoader().getResource("./conf/pacemaker.xml"));
     
    		TIME_OUT = Integer.valueOf(EnvXML.getRootElement().element("options")
    				.element("timeout").getText());
    		Element environementsNodes = EnvXML.getRootElement().element(
    				"environements");
     
    		for (Iterator i = environementsNodes.elementIterator(); i.hasNext();) {
    			Element curEnv = (Element) i.next();
     
    			environements.add(new Environment(curEnv.attributeValue("user"),
    					curEnv.attributeValue("pwd"), (String) curEnv
    							.attributeValue("url"), Boolean.valueOf(curEnv
    							.attributeValue("active"))));
     
    		}
     
    		return environements;
    	}
     
    	public void startEnvironement() {
     
    		tMonAppli = new Thread(new Runnable() {
    			public void run() {
    				try {
    					Thread.sleep(1);
    					lanchtest();
    					success = true;
    				} catch (InterruptedException Ie) {
    					rootError = Ie;
    				} catch (PSException pse) {
    					rootError = pse;
    				} catch (Exception e) {
    					rootError = e;
    				}
    			}
    		});
     
    		tMonAppli.start();
    		try {
    			tMonAppli.join(TIME_OUT * 1000);
    			if (tMonAppli.isAlive()) {
    				// Fin Echec
    				// tMonAppli.interrupt();
    				// PropertyConfigurator.
     
    				tMonAppli.stop();
     
    				while (rootError == null && !success) {
    					Thread.sleep(1000);
    				}
     
    				logger.warn("Time Out! Starting disconnection");
     
    				if (!logger.isInfoEnabled()) {
    					// On réinitilaise log4j
    					Logger.getRootLogger().removeAllAppenders();
    					PropertyConfigurator.configure(ConnectionDiagnosis.class
    							.getClassLoader().getResource(
    									"conf/log4j.properties"));
    				}
    				// Traitement:
    				logger.error(rootError);
    				logger.error("Echec TimeOut");
     
    			} else {
    				// Fin Succes
    				if (success) {
    					logger.info("Reussite");
    				} else {
     
    					Thread.sleep(1000);
    					Logger.getRootLogger().removeAllAppenders();
    					PropertyConfigurator.configure(ConnectionDiagnosis.class
    							.getClassLoader().getResource(
    									"conf/log4j.properties"));
    					// Erreur autre que TO
    					logger.error(rootError);
    				}
     
    			}
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    			System.err.println("LA3");
    		} catch (Exception ex) {
    			ex.printStackTrace();
    			System.err.println("LA4");
    		}
    	}
     
    	public static void main(java.lang.String[] args) {
     
    		NonStaticFullConnectionDiagnosis FC = new NonStaticFullConnectionDiagnosis();
    		PropertyConfigurator.configure(ConnectionDiagnosis.class
    				.getClassLoader().getResource("conf/log4j.properties"));
     
    		try {
    			initializeOption();
    		} catch (MalformedURLException e1) {
    			// TODO Auto-generated catch block
    			e1.printStackTrace();
    			System.exit(-1);
    		} catch (DocumentException e1) {
    			// TODO Auto-generated catch block
    			e1.printStackTrace();
    			System.exit(-1);
    		}
     
    		logger.info(environements.size() + " environments will be checked");
    		logger.info("Starting Diagnosis");
    		logger.info("Timeout :" + TIME_OUT + " s");
    		int i = 0;
    		for (Iterator iter = environements.iterator(); iter.hasNext();) {
    			currentEnv = (Environment) iter.next();
    			logger.info("Number: " + (++i));
    			if (currentEnv.isActive()) {
    				try {
    					Thread.sleep(1000);
    				} catch (InterruptedException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
     
    				if (FC.tMonAppli != null
    						&& (FC.tMonAppli.isAlive() || !FC.tMonAppli.isInterrupted())) {
    					FC.tMonAppli.interrupt();
    				}
     
    				success = false;
    				env_start_time = System.currentTimeMillis();
    				FC.startEnvironement();
    				logger.info("Executé en : "
    						+ Utils.timeIt(env_start_time, false));
    				// break;
    			} else {
    				logger.info(currentEnv.getServerURL() + " ignored");
    			}
    		}
     
    		long lUsedMemory = (Runtime.getRuntime().totalMemory() - Runtime
    				.getRuntime().freeMemory()) / 1048576;
    		logger.info("Used Memory: " + lUsedMemory + " Mo");
    		logger.info("Total Memory : " + (Runtime.getRuntime().totalMemory())
    				/ 1048576 + " Mo");
    		if (FC.tMonAppli != null)
    			FC.tMonAppli.stop();
     
    		System.gc();
    		logger.info("Used Memory: " + lUsedMemory + " Mo");
    		logger.info("Total Memory : " + (Runtime.getRuntime().totalMemory())
    				/ 1048576 + " Mo");
     
    		logger.info("Ending Diagnosis");
    		Utils.timeIt(start, true);
    		System.exit(0);
    	}
    }
    Voila le Log:



    [INFO ] [05-12-06 16:14:59] PACEMAKER : 14 environments will be checked
    [INFO ] [05-12-06 16:14:59] PACEMAKER : Starting Diagnosis
    [INFO ] [05-12-06 16:14:59] PACEMAKER : Timeout :600 s
    [INFO ] [05-12-06 16:14:59] PACEMAKER : Number: 1
    [INFO ] [05-12-06 16:15:00] PMONAPPLI : Connexion de admin sur http://instance:8080/pMONAPPLI
    [INFO ] [05-12-06 16:16:05] PMONAPPLI : Connection established
    [INFO ] [05-12-06 16:16:05] PMONAPPLI : Starting Resource import
    [INFO ] [05-12-06 16:17:45] PMONAPPLI : 9381 resources loaded
    [INFO ] [05-12-06 16:17:45] PMONAPPLI : Setting Resource Map by First and Last Name
    [INFO ] [05-12-06 16:17:45] PMONAPPLI : Starting Project import
    [INFO ] [05-12-06 16:17:48] PMONAPPLI : 2361 projects loaded
    [INFO ] [05-12-06 16:17:48] PMONAPPLI : Setting Project Map by ID
    [INFO ] [05-12-06 16:17:48] PMONAPPLI : Logging Out...
    [INFO ] [05-12-06 16:17:48] PACEMAKER : Used Memory: 333 Mo
    [INFO ] [05-12-06 16:17:48] PACEMAKER : Total Memory : 439 Mo
    [INFO ] [05-12-06 16:17:48] PACEMAKER : Used Memory: 333 Mo
    [INFO ] [05-12-06 16:17:48] PACEMAKER : Total Memory : 439 Mo
    [INFO ] [05-12-06 16:17:49] PACEMAKER : Used Memory: 207 Mo
    [INFO ] [05-12-06 16:17:49] PACEMAKER : Total Memory : 439 Mo
    [INFO ] [05-12-06 16:17:49] PACEMAKER : Reussite
    [INFO ] [05-12-06 16:17:49] PACEMAKER : Executé en : 00:02:49
    [INFO ] [05-12-06 16:17:49] PACEMAKER : Number: 2
    [INFO ] [05-12-06 16:17:50] PMONAPPLI : Connexion de admin sur http://instance2:8080/pMONAPPLI
    [INFO ] [05-12-06 16:18:38] PMONAPPLI : Connection established
    [INFO ] [05-12-06 16:18:38] PMONAPPLI : Starting Resource import
    [INFO ] [05-12-06 16:20:25] PMONAPPLI : 9381 resources loaded
    [INFO ] [05-12-06 16:20:25] PMONAPPLI : Setting Resource Map by First and Last Name
    [INFO ] [05-12-06 16:20:25] PMONAPPLI : Starting Project import
    [INFO ] [05-12-06 16:20:29] PMONAPPLI : 2361 projects loaded
    [INFO ] [05-12-06 16:20:29] PMONAPPLI : Setting Project Map by ID
    [INFO ] [05-12-06 16:20:29] PMONAPPLI : Logging Out...
    [INFO ] [05-12-06 16:20:29] PACEMAKER : Used Memory: 594 Mo
    [INFO ] [05-12-06 16:20:29] PACEMAKER : Total Memory : 651 Mo
    [INFO ] [05-12-06 16:20:29] PACEMAKER : Used Memory: 594 Mo
    [INFO ] [05-12-06 16:20:29] PACEMAKER : Total Memory : 651 Mo
    [INFO ] [05-12-06 16:20:33] PACEMAKER : Used Memory: 361 Mo
    [INFO ] [05-12-06 16:20:33] PACEMAKER : Total Memory : 651 Mo
    [INFO ] [05-12-06 16:20:33] PACEMAKER : Reussite
    [INFO ] [05-12-06 16:20:33] PACEMAKER : Executé en : 00:02:42
    [INFO ] [05-12-06 16:20:33] PACEMAKER : Number: 3
    [INFO ] [05-12-06 16:20:34] PMONAPPLI : Connexion de admin sur http://instance3:8080/pMONAPPLI
    [INFO ] [05-12-06 16:21:25] PMONAPPLI : Connection established
    [INFO ] [05-12-06 16:21:25] PMONAPPLI : Starting Resource import
    [INFO ] [05-12-06 16:23:07] PMONAPPLI : 9381 resources loaded
    [INFO ] [05-12-06 16:23:07] PMONAPPLI : Setting Resource Map by First and Last Name
    [INFO ] [05-12-06 16:23:07] PMONAPPLI : Starting Project import
    [INFO ] [05-12-06 16:23:10] PMONAPPLI : 2361 projects loaded
    [INFO ] [05-12-06 16:23:10] PMONAPPLI : Setting Project Map by ID
    [INFO ] [05-12-06 16:23:10] PMONAPPLI : Logging Out...
    [INFO ] [05-12-06 16:23:11] PACEMAKER : Used Memory: 771 Mo
    [INFO ] [05-12-06 16:23:11] PACEMAKER : Total Memory : 1016 Mo
    [INFO ] [05-12-06 16:23:11] PACEMAKER : Used Memory: 771 Mo
    [INFO ] [05-12-06 16:23:11] PACEMAKER : Total Memory : 1016 Mo
    [INFO ] [05-12-06 16:23:14] PACEMAKER : Used Memory: 542 Mo
    [INFO ] [05-12-06 16:23:14] PACEMAKER : Total Memory : 1016 Mo
    [INFO ] [05-12-06 16:23:14] PACEMAKER : Reussite
    [INFO ] [05-12-06 16:23:14] PACEMAKER : Executé en : 00:02:40
    [INFO ] [05-12-06 16:23:14] PACEMAKER : Number: 4
    [INFO ] [05-12-06 16:23:15] PMONAPPLI : Connexion de admin sur http://instance4:8080/pMONAPPLI
    [INFO ] [05-12-06 16:24:03] PMONAPPLI : Connection established
    [INFO ] [05-12-06 16:24:03] PMONAPPLI : Starting Resource import
    [INFO ] [05-12-06 16:25:52] PMONAPPLI : 9381 resources loaded
    [INFO ] [05-12-06 16:25:52] PMONAPPLI : Setting Resource Map by First and Last Name
    [INFO ] [05-12-06 16:25:52] PMONAPPLI : Starting Project import
    [INFO ] [05-12-06 16:25:55] PMONAPPLI : 2361 projects loaded
    [INFO ] [05-12-06 16:25:55] PMONAPPLI : Setting Project Map by ID
    [INFO ] [05-12-06 16:25:55] PMONAPPLI : Logging Out...
    [INFO ] [05-12-06 16:25:55] PACEMAKER : Used Memory: 886 Mo
    [INFO ] [05-12-06 16:25:55] PACEMAKER : Total Memory : 1016 Mo
    [INFO ] [05-12-06 16:25:55] PACEMAKER : Used Memory: 886 Mo
    [INFO ] [05-12-06 16:25:55] PACEMAKER : Total Memory : 1016 Mo
    [INFO ] [05-12-06 16:26:00] PACEMAKER : Used Memory: 715 Mo
    [INFO ] [05-12-06 16:26:00] PACEMAKER : Total Memory : 1016 Mo
    [INFO ] [05-12-06 16:26:00] PACEMAKER : Reussite
    [INFO ] [05-12-06 16:26:00] PACEMAKER : Executé en : 00:02:44
    [INFO ] [05-12-06 16:26:00] PACEMAKER : Number: 5
    [INFO ] [05-12-06 16:26:01] PMONAPPLI : Connexion de admin sur http://instance5:8080/copyprod
    [INFO ] [05-12-06 16:26:46] PMONAPPLI : Connection established
    [INFO ] [05-12-06 16:26:46] PMONAPPLI : Starting Resource import
    [INFO ] [05-12-06 16:30:13] PMONAPPLI : 9365 resources loaded
    [INFO ] [05-12-06 16:30:13] PMONAPPLI : Setting Resource Map by First and Last Name
    [INFO ] [05-12-06 16:30:13] PMONAPPLI : Starting Project import
    [INFO ] [05-12-06 16:30:33] PMONAPPLI : 2362 projects loaded
    [INFO ] [05-12-06 16:30:33] PMONAPPLI : Setting Project Map by ID
    [INFO ] [05-12-06 16:30:33] PMONAPPLI : Logging Out...
    [INFO ] [05-12-06 16:30:33] PACEMAKER : Used Memory: 1015 Mo
    [INFO ] [05-12-06 16:30:33] PACEMAKER : Total Memory : 1016 Mo
    [INFO ] [05-12-06 16:30:33] PACEMAKER : Used Memory: 1015 Mo
    [INFO ] [05-12-06 16:30:33] PACEMAKER : Total Memory : 1016 Mo
    [INFO ] [05-12-06 16:30:38] PACEMAKER : Used Memory: 894 Mo
    [INFO ] [05-12-06 16:30:38] PACEMAKER : Total Memory : 1016 Mo
    [INFO ] [05-12-06 16:30:44] PACEMAKER : Reussite
    [INFO ] [05-12-06 16:30:44] PACEMAKER : Executé en : 00:04:43
    [INFO ] [05-12-06 16:30:44] PACEMAKER : Number: 6
    [INFO ] [05-12-06 16:30:45] PMONAPPLI : Connexion de admin sur http://instance6:18080/certif
    Exception in thread "Thread-7" java.lang.OutOfMemoryError: Java heap space
    [ERROR] [05-12-06 16:35:36] PACEMAKER :
    [INFO ] [05-12-06 16:35:36] PACEMAKER : Executé en : 00:04:50
    [INFO ] [05-12-06 16:35:36] PACEMAKER : Number: 7
    [INFO ] [05-12-06 16:35:37] PMONAPPLI : Connexion de admin sur http://instance7:28080/dev
    Exception in thread "Thread-8" java.lang.OutOfMemoryError: Java heap space
    [ERROR] [05-12-06 16:36:28] PACEMAKER :
    [INFO ] [05-12-06 16:36:28] PACEMAKER : Executé en : 00:00:51
    [INFO ] [05-12-06 16:36:28] PACEMAKER : Number: 8
    [INFO ] [05-12-06 16:36:35] PMONAPPLI : Connexion de admin sur http://instance8:28080/pMONAPPLI_interfaces
    Exception in thread "Thread-9" java.lang.OutOfMemoryError: Java heap space
    [ERROR] [05-12-06 16:37:20] PACEMAKER :
    [INFO ] [05-12-06 16:37:20] PACEMAKER : Executé en : 00:00:44
    [INFO ] [05-12-06 16:37:20] PACEMAKER : Number: 9
    [INFO ] [05-12-06 16:37:25] PMONAPPLI : Connexion de admin sur http://instance9:28080/homol
    Exception in thread "Thread-10" java.lang.OutOfMemoryError: Java heap space
    [ERROR] [05-12-06 16:38:33] PACEMAKER :
    [INFO ] [05-12-06 16:38:33] PACEMAKER : Executé en : 00:01:07
    [INFO ] [05-12-06 16:38:33] PACEMAKER : Number: 10
    [INFO ] [05-12-06 16:38:34] PMONAPPLI : Connexion de admin sur http://instance10:8080/training1
    Exception in thread "Thread-11" java.lang.OutOfMemoryError: Java heap space
    [ERROR] [05-12-06 16:39:08] PACEMAKER :
    [INFO ] [05-12-06 16:39:08] PACEMAKER : Executé en : 00:00:34
    [INFO ] [05-12-06 16:39:08] PACEMAKER : Number: 11
    [INFO ] [05-12-06 16:39:09] PMONAPPLI : Connexion de admin sur http://instance11:8080/training2
    Exception in thread "Thread-12" java.lang.OutOfMemoryError: Java heap space
    [ERROR] [05-12-06 16:39:43] PACEMAKER :
    [INFO ] [05-12-06 16:39:43] PACEMAKER : Executé en : 00:00:34
    [INFO ] [05-12-06 16:39:43] PACEMAKER : Number: 12
    [INFO ] [05-12-06 16:39:44] PMONAPPLI : Connexion de admin sur http://instance12:8080/training3
    Exception in thread "Thread-13" java.lang.OutOfMemoryError: Java heap space
    [ERROR] [05-12-06 16:40:47] PACEMAKER :
    [INFO ] [05-12-06 16:40:47] PACEMAKER : Executé en : 00:01:02
    [INFO ] [05-12-06 16:40:47] PACEMAKER : Number: 13
    [INFO ] [05-12-06 16:40:48] PMONAPPLI : Connexion de admin sur http://instance13:8080/training4
    Exception in thread "Thread-14" java.lang.OutOfMemoryError: Java heap space
    [ERROR] [05-12-06 16:41:22] PACEMAKER :
    [INFO ] [05-12-06 16:41:22] PACEMAKER : Executé en : 00:00:33
    [INFO ] [05-12-06 16:41:22] PACEMAKER : Number: 14
    [INFO ] [05-12-06 16:41:23] PMONAPPLI : Connexion de admin sur http://instance14:8080/training5
    Exception in thread "Thread-15" java.lang.OutOfMemoryError: Java heap space
    [ERROR] [05-12-06 16:41:57] PACEMAKER :
    [INFO ] [05-12-06 16:41:57] PACEMAKER : Executé en : 00:00:34
    [INFO ] [05-12-06 16:41:57] PACEMAKER : Used Memory: 1013 Mo
    [INFO ] [05-12-06 16:41:57] PACEMAKER : Total Memory : 1016 Mo
    [INFO ] [05-12-06 16:42:03] PACEMAKER : Used Memory: 1013 Mo
    [INFO ] [05-12-06 16:42:03] PACEMAKER : Total Memory : 1016 Mo
    [INFO ] [05-12-06 16:42:03] PACEMAKER : Ending Diagnosis
    [INFO ] [05-12-06 16:42:03] UTILS : 1624 s
    [INFO ] [05-12-06 16:42:03] UTILS : Total Execution Time : 00:27:04
    Pour resumer voila mon analyse:

    Mes Threads continuent de vivrent et la memoire qu'ils ont bouffé n'est pas restituée...

    COmment je libere cette memoire?

    Comment liberer de la mémoire non critique?

  2. #2
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    bon franchement, j'ai pas le courage de lire tout ça ...

    mais si tu es en 1.5, tu devrais passer par des ThreadPoolExecutor. Il est beaucoup plus facile de gérer les thread en cours, en attente ... Bref, jette un oeil dans le package Concurrent, tu y trouveras pas mal de trucs sympas ...

    Sinon, toujours avec 1.5, tu as jconsole qui te permet de contrôler ta mémoire, tes threads. C'est de base avec le jdk et il faut simplement mettre des paramètres au lancement pour pouvoir l'utiliser. Tu pourras au moins voir si le nombre de threads alive ne fais qu'augmenter ou pas ...

    en espérant que ça puisse t'aider ...
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 193
    Points : 47
    Points
    47
    Par défaut
    Il est tres complexe ThreadPoolExecutor :'(

  4. #4
    Membre confirmé Avatar de broumbroum
    Profil pro
    Inscrit en
    Août 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 406
    Points : 465
    Points
    465
    Par défaut
    honnêtement, il faudrait passer un cache manager à tout ça... -> contribution dans le forum contribuez

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 193
    Points : 47
    Points
    47
    Par défaut
    Plus simple:

    Y' a t'il une commande pour vider la mémoire non critique donc trusté par ces threads censés être morts?


    (Non-critical memory)

  6. #6
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Citation Envoyé par petozak
    Il est tres complexe ThreadPoolExecutor :'(
    Franchement, je pensais pareil au début. Mais une fois que tu t'y es mis, la gestion des thread devient beaucoup plus simple.

    Le principe est simple.

    tu crée un pool de thread du type que tu veux (single ...)
    à chaque fois que tu crées un thread, un runnable ou un callable tu 'ajoute au pool.

    Ce pool, suivant les paramètres que tu lui donne va soit exécuter, soit mettre en attente le thread.

    Tu peux interroger le pool pour connaitre les éléments en attente, en cours ...

    En plus les Objets Future, ton thread peut ramener une valeur, ce qui est très pratique aussi.

    Enfin, tu peux facilement gérer les verrous, les timeout ...

    Tu dispose également de diverses collection concurrent (ConcurrentMap par exemple) qui te permette de gérer facilement une collection d'objets partagés par les thread (ex : prod/conso).

    Bref, je te conseille de regarder d'un peu plus près.

    La dans l'appli que je développe, au début j'avais un tableau de thread et je gérais à la mano les places libres, les accès ... Maintenant avec le package concurrent, mon code est plus clair, plus facilment modifiable ... bref tout bénef

    (on dirait une pub non )

    Bon courage ...
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  7. #7
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 193
    Points : 47
    Points
    47
    Par défaut
    Merci in j'ai une question à vous poser:
    Comme vous pouvez le voir dans ma boucle , je fais appel pour chaque environnement à startEnvironment() qui instancie le même Thread
    Mais apparemment mais si il s'agit de la même declaration (tpplus de Type Thread) , à chaque lancement de la méthode un thread est crée...

    JE COMPREND PAS

    Je voudrais que mon thread soit unique et donc ecrasé à chaque nouvel environnement...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    public void startEnvironement() {
     
    		tpplus = new Thread(new Runnable() {
    			public void run() {
    				try {
    					Thread.sleep(1);
    					lanchtest();
    					success = true;
    				} catch (InterruptedException Ie) {
    					rootError = Ie;
    				} catch (PSException pse) {
    					rootError = pse;
    				} catch (Exception e) {
    					rootError = e;
    				}
    			}
    		});
     
    		tpplus.start();
    		try {
    			tpplus.join(TIME_OUT * 1000);
    			if (tpplus.isAlive()) {
    				// Fin Echec
    				// tpplus.interrupt();
    				// PropertyConfigurator.
     
    				tpplus.stop();
     
    				while (rootError == null && !success) {
    					Thread.sleep(1000);
    				}
     
    				logger.warn("Time Out! Starting disconnection");
     
    				if (!logger.isInfoEnabled()) {
    					// On réinitilaise log4j
    					Logger.getRootLogger().removeAllAppenders();
    					PropertyConfigurator.configure(ConnectionDiagnosis.class
    							.getClassLoader().getResource(
    									"conf/log4j.properties"));
    				}
    				// Traitement:
    				logger.error(rootError);
    				logger.error("Echec TimeOut");
     
    			} else {
    				// Fin Succes
    				if (success) {
    					logger.info("Reussite");
    				} else {
     
    					Thread.sleep(1000);
    					Logger.getRootLogger().removeAllAppenders();
    					PropertyConfigurator.configure(ConnectionDiagnosis.class
    							.getClassLoader().getResource(
    									"conf/log4j.properties"));
    					// Erreur autre que TO
    					logger.error(rootError);
    				}
     
    			}
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    			System.err.println("LA3");
    		} catch (Exception ex) {
    			ex.printStackTrace();
    			System.err.println("LA4");
    		}
    	}

  8. #8
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Citation Envoyé par petozak
    Up
    heho c'est bon


    ben je sais pas moi. Pourquoi faire un new Thread si tu veux réutiliser le même ??

    tu peux t'en faire un singleton et dessus tu fais juste start(). pour le réutiliser.

    A moins que j'ai rien compris ...
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  9. #9
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 193
    Points : 47
    Points
    47
    Par défaut
    Je lance startEnv() pour chaque environnement.
    curEnv est une variable "globale" à la classe et à chaque nouveau lancement de thread corrspond un curEnv qui a changé...

    Tu veux dire que je peux faire comment sans new?
    Executer le même runnable vu que c'est le même code c'est ca?
    Si oui comment?

    Merci

  10. #10
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 193
    Points : 47
    Points
    47
    Par défaut
    Voila l'erreur que j'aie en reutilisant el même threasd :

    Exception in thread "main" java.lang.IllegalThreadStateException
    at java.lang.Thread.start(Thread.java:571)
    at ppaceMaker.NonStaticFullConnectionDiagnosis.startEnvironement(NonStaticFullConnectionDiagnosis.java:122)
    at ppaceMaker.NonStaticFullConnectionDiagnosis.main(NonStaticFullConnectionDiagnosis.java:218)



    C normal vu que je l'ai tué...D'ou mon new() à chaque fois

  11. #11
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Bon je crois que je comprends pas grand chose ...

    Si ton thread est mort, pourquoi est ce que le new ne te convient pas dans ce cas ? Tu as bien un seul thread à un instant t ??

    je comprends pas ton problème.

    Apres pour l'écraser, faut voir à quel endroit est déclaré ton thread. Si la référence est dans la classe qui instancie ces threads, normalement, il est écrasé à chaque fois je pense ... Sinon, as tu essayé en le mettant static ?
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  12. #12
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 193
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par in
    Bon je crois que je comprends pas grand chose ...

    Si ton thread est mort, pourquoi est ce que le new ne te convient pas dans ce cas ? Tu as bien un seul thread à un instant t ??

    je comprends pas ton problème.

    Apres pour l'écraser, faut voir à quel endroit est déclaré ton thread. Si la référence est dans la classe qui instancie ces threads, normalement, il est écrasé à chaque fois je pense ... Sinon, as tu essayé en le mettant static ?

    Si tu me relis tu verrais que moi aussi je suis etonnée de la mort seulement "apparente" de mon thread...
    Il meurt peut etre mais sans liberer les objets qu'il a créee...Mon but est simple recuperer mam mémoire
    Je le tue par consequent , il devrait liberer la memoire or il ne le fait pas...

  13. #13
    Membre confirmé Avatar de broumbroum
    Profil pro
    Inscrit en
    Août 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 406
    Points : 465
    Points
    465
    Par défaut Phantom Reference ?
    Si vous voulez vous assurer de la destruction des objets utilisés, les références java du package java.lang.ref sont les mieux adaptées. Par expérience, elles sont très fiables et il n'y a pas beaucoup de code à ajouter. Un exmple simple tiré du tutoriel de Gfx:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public uneClasseGrourmande {
     SoftReference unGrosObjet;
     ReferenceQueue leControleurDeReference = new ReferenceQueue();
     public ajouterUnGrosObjet(Object grosObjet) {
        unGrosObjet = new SoftReference(grosObjet, leControleurDeReference);
    }
     
    public laFonctionGroumande() {
     // ... leCodeGourmand
    // appelle le gros objet
    Object obj;
    ajouterUnGrosObjet(obj = new Object());
    // maintenant le controleur d'objet ne voit pas la Reference
    // ... leCodeGourmand se termine
    // fin de la méthode => l'objet sera libéré et repéré par le controleur
    }
     
    public fonctionEnveloppente() {
     laFonctionGourmande();
    // c'est le passage critique
    SoftReference lObjetGourmand;
     while( lObjetGourmand = leControleurDeReference.poll() instanceof Reference) 
            leControleurDeReference.remove(lObjetGourmand);
    }
    }
    Avec une structure pareille, tu t'assures de la libération de la mémoire allouée à la fin de chaque passage gourmand en mémoire, pour autant que les objets qui prennent bcp de resources NE SOIENT PLUS DECLARES
    De plus, ces derniers peuvent être surchargés de la méthode finalize() pour notifier chaque libération en mémoire.

    Selon un article de prog en anglais sur le net:
    Une PhantomReference serait dans un autre cas la bienvenue, car la reference ne souhaite qu'être supprimée après son utilisation; c.f les précédents messages.


  14. #14
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    Mémoire non libérée = une référence sur l'objet qui traîne. Ce n'est pas parce que Java n'oblige pas le programmeur à gérer sa mémoire qu'il faut faire n'importe quoi !
    Perso j'ai lu vite fait ton code et j'ai rien compris. Suis donc les conseils de in, utilise un Executor, ça évite de se faire du mal en gérant à la main les exécutions. Je n'ai pas trop compris ce que tu souhaitais faire (diagnostiquer l'utilisation de la mémoire lors du chargement des environnements ?).
    Commence par supprimer toutes ces variables statiques, relis ton code, tu vas y trouver plein d'incohérences, et surtout pose bien les choses à plat.
    Et enfin, un dernier truc : stop est dépréciée ! Lis la documentation et évite d'utiliser des méthodes dépréciées. Tu t'éviteras bien des surprises.

    public static ExecutorService newSingleThreadExecutor() te permet de n'avoir qu'un seul thread, auquel tu passe les tâches à exécuter.
    En premier lieu, utilisez un moteur de recherche.
    En second lieu, postez sur le forum adéquat !

  15. #15
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 193
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par Patriarch24
    Mémoire non libérée = une référence sur l'objet qui traîne. Ce n'est pas parce que Java n'oblige pas le programmeur à gérer sa mémoire qu'il faut faire n'importe quoi !
    Perso j'ai lu vite fait ton code et j'ai rien compris. Suis donc les conseils de in, utilise un Executor, ça évite de se faire du mal en gérant à la main les exécutions. Je n'ai pas trop compris ce que tu souhaitais faire (diagnostiquer l'utilisation de la mémoire lors du chargement des environnements ?).
    Commence par supprimer toutes ces variables statiques, relis ton code, tu vas y trouver plein d'incohérences, et surtout pose bien les choses à plat.
    Et enfin, un dernier truc : stop est dépréciée ! Lis la documentation et évite d'utiliser des méthodes dépréciées. Tu t'éviteras bien des surprises.

    public static ExecutorService newSingleThreadExecutor() te permet de n'avoir qu'un seul thread, auquel tu passe les tâches à exécuter.


    Si j'utilise stop() c'est parceque interrupt ne suffit pas à interropre le thread...
    Je n'ai plus de variable static...t'inquiete...

    Mon but n'est pas de diagnostiquer la mémoire mais de m'assurer que celle ci est liberee ce qui n'est pas le cas.
    Merci quand même

  16. #16
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 193
    Points : 47
    Points
    47
    Par défaut
    J'utilise ce code mais rien ne demarre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
     
    	static Thread tpplus = new Thread(new Runnable() {
    		public void run() {
    			try {
    				Thread.sleep(1);
    				lanchtest();
    				success = true;
    			} catch (InterruptedException Ie) {
    				rootError = Ie;
    			} catch (PSException pse) {
    				rootError = pse;
    			} catch (Exception e) {
    				rootError = e;
    			}
    		}
    	});
     
     
    	ExecutorService execService = Executors.newSingleThreadExecutor();
    		execService.execute(tpplus);

    C'est normal?

  17. #17
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    Si j'utilise stop() c'est parceque interrupt ne suffit pas à interropre le thread...
    Ce n'est pas la bonne méthode pour arrêter un thread. Jette un oeil ici.

    En ce qui concerne la mémoire, l'appel à gc() indique que le garbage collector doit effectuer le nécessaire pour réclamer les objets inutiles. Mais si certains objets sont encore référençables, ils ne seront pas réclamés (voir cet article).
    En premier lieu, utilisez un moteur de recherche.
    En second lieu, postez sur le forum adéquat !

  18. #18
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 193
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par Patriarch24
    Ce n'est pas la bonne méthode pour arrêter un thread. Jette un oeil ici.

    En ce qui concerne la mémoire, l'appel à gc() indique que le garbage collector doit effectuer le nécessaire pour réclamer les objets inutiles. Mais si certains objets sont encore référençables, ils ne seront pas réclamés (voir cet article).

    Je te remercie je sais comment fonctionne le GC , il verifie les references aux objets si il y'en a plus il trash.
    J'ai revu mon code et je ne vois aucune reference et c'est ca qui me depasse...

  19. #19
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 193
    Points : 47
    Points
    47
    Par défaut
    Ca ne resoud pas mon problème...

  20. #20
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    Poste moi tout ton code (MP) je vais voir ça de plus près.
    En premier lieu, utilisez un moteur de recherche.
    En second lieu, postez sur le forum adéquat !

Discussions similaires

  1. Une lecture de fichier midi qui consomme trop de mémoire
    Par padodanle51 dans le forum Général Java
    Réponses: 6
    Dernier message: 12/04/2008, 11h52
  2. Réponses: 3
    Dernier message: 21/01/2008, 14h38
  3. Application qui prend beaucoup de mémoire
    Par Khrysby dans le forum Général Dotnet
    Réponses: 6
    Dernier message: 09/10/2007, 22h44
  4. Serveur qui prend trop de mémoire
    Par malag dans le forum Langage
    Réponses: 4
    Dernier message: 02/04/2007, 22h05
  5. thread qui prend le controle ...
    Par gdpasmini dans le forum POSIX
    Réponses: 14
    Dernier message: 26/04/2006, 12h15

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