<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>MilamberSpace &#187; Java</title>
	<atom:link href="http://blog.milamberspace.net/index.php/category/developpement/java/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.milamberspace.net</link>
	<description>JMeter (surtout) mais aussi l&#039;Informatique, Internet, etc.</description>
	<lastBuildDate>Sun, 29 Aug 2010 21:29:30 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>JMeter : Pourquoi exécuter son test de charges en mode non-gui (sans interface graphique) ?</title>
		<link>http://blog.milamberspace.net/index.php/2009/02/01/jmeter-pourquoi-executer-son-test-de-charges-en-mode-non-gui-sans-interface-graphique-192.html</link>
		<comments>http://blog.milamberspace.net/index.php/2009/02/01/jmeter-pourquoi-executer-son-test-de-charges-en-mode-non-gui-sans-interface-graphique-192.html#comments</comments>
		<pubDate>Sun, 01 Feb 2009 09:55:32 +0000</pubDate>
		<dc:creator>Milamber</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[JMeter]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Tests de charges]]></category>
		<category><![CDATA[gui]]></category>
		<category><![CDATA[jvm]]></category>

		<guid isPermaLink="false">http://blog.milamberspace.net/?p=192</guid>
		<description><![CDATA[JMeter dispose de deux modes de fonctionnement, un mode GUI et un non-GUI, « GUI » signifiant Graphical User Interface, c&#8217;est-à-dire un mode de fonctionnement avec une interface graphique utilisateur qui permet de créer, éditer un script et lancer un test de charges et autres choses. Le mode non-GUI ne permet pas de manipuler un [...]]]></description>
			<content:encoded><![CDATA[<p style="">JMeter dispose de deux modes de fonctionnement, un mode GUI et un non-GUI, « GUI » signifiant<em> Graphical User Interface</em>, c&#8217;est-à-dire un mode de fonctionnement avec une interface graphique utilisateur qui permet de créer, éditer un script et lancer un test de charges et autres choses. Le mode non-GUI ne permet pas de manipuler un script, mais simplement de lancer le script de test de charges.</p>
<p style="">Pourquoi ce mode non-GUI ? Parce qu&#8217;en mode GUI, JMeter peut être gêné par la gestion du &#8216;<em>graphisme</em>&#8216; pendant qu&#8217;il est en train d&#8217;exécuter un test de charges. Et cela peut avoir un impact sur la qualité des résultats du tir.</p>
<p style="">En effet, sur le poste JMeter, la gestion du mode graphique impacte :<span id="more-192"></span></p>
<ul>
<li><strong>Le processeur.</strong> JMeter doit traiter deux choses : le test de charges (envoi des requêtes, réception des réponses, éventuellement écriture dans un fichier, etc.) et l&#8217;affichage des résultats dans les récepteurs (listeners) ainsi que d&#8217;éventuels calculs statistiques (total, moyenne, etc.). La puissance du processeur est donc découpée en deux tâches principales : la gestion du tir et la gestion de l&#8217;affichage.</li>
<li><strong>La mémoire.</strong> Certains récepteurs comme celui de l&#8217;arbre de résultats ou celui de tableau de résultats, sont extrêmement gourmands en mémoire, en effet, pour chaque test d&#8217;échantillon, il faut ajouter un petit &#8216;<em>chouia</em>&#8216; dans la mémoire. Or quand son test de charge génère de très nombreuses requêtes, le petit <em>chouia</em> devient énorme, ce qui peut même faire des OutOfMemoryError du côté JMeter si on ne prends pas soin d&#8217;augmenter la taille de mémoire maximale de la JVM de JMeter (au niveau du script de lancement).</li>
</ul>
<p style="">Et pour couronner le tout, la machine virtuelle Java (qui je le rappelle, exécute JMeter), aura parfois besoin de faire passer le garbage collector (GC) pour la gestion de la mémoire, ce qui a un impact sur le traitement des résultats, le GC gelant les threads (donc le tir et le traitement des résultat) lors de l&#8217;identification des objets à supprimer de la mémoire.</p>
<p style="">Ces points montrent que le mode GUI est plutôt à proscrire lors d&#8217;un test de charge aussi simple soit-il, car on risque d&#8217;avoir des résultats erronés en termes de calcul de temps de réponses, par JMeter lui-même, ce dernier est perturbé par la gestion de l&#8217;affichage des résultats de manière graphique, et par le fonctionnement de la JVM au niveau la gestion de la mémoire si le nombre de requêtes/réponses devient très important.</p>
<p style="">Donc pour résumé, le mode GUI est plutôt à utiliser pour créer et maintenir ses scripts JMeter et lancer des tir de charges « <em>blancs</em> » permettant de vérifier la bonne exécution d&#8217;un scénario. Le mode non-GUI est à utiliser pour l&#8217;exécution du test de charge « officiel ».</p>
<p style="">Un petit conseil pour finir : si vous avez une machine JMeter avec un processeur multi-core (dual core), il est préférable d&#8217;utiliser une machine virtuelle Java dernière version (6), car la gestion des processeurs (core) y est bien plus optimale que la version 5 (sans parler de la 1.4). Avec une JVM 6, JMeter et tous ses petits threads vont utiliser l&#8217;ensemble des CPU disponibles sur le poste de test JMeter.</p>
<p style="">
]]></content:encoded>
			<wfw:commentRss>http://blog.milamberspace.net/index.php/2009/02/01/jmeter-pourquoi-executer-son-test-de-charges-en-mode-non-gui-sans-interface-graphique-192.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Utilisation de NDC de Apache Log4J pour tracer et suivre l&#8217;exécution d&#8217;une application Java</title>
		<link>http://blog.milamberspace.net/index.php/2008/01/15/utilisation-de-ndc-de-apache-log4j-pour-tracer-et-suivre-lexecution-dune-application-java-58.html</link>
		<comments>http://blog.milamberspace.net/index.php/2008/01/15/utilisation-de-ndc-de-apache-log4j-pour-tracer-et-suivre-lexecution-dune-application-java-58.html#comments</comments>
		<pubDate>Tue, 15 Jan 2008 20:46:38 +0000</pubDate>
		<dc:creator>Milamber</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Log4J]]></category>
		<category><![CDATA[Supervision]]></category>
		<category><![CDATA[NDC]]></category>

		<guid isPermaLink="false">http://blog.milamberspace.net/index.php/2008/01/15/utilisation-de-ndc-de-apache-log4j-pour-tracer-et-suivre-lexecution-dune-application-java-58.html</guid>
		<description><![CDATA[Un fonctionnalité pratique du framework de logging Apache Log4J est le NDC (pour  Nested Diagnostic Contexts). Ce dernier permet de tracer et suivre plusieurs instances d&#8217;un même traitement dans un seul fichier de log. Une utilisation typique est le fichier de log d&#8217;une application web s&#8217;exécutant sur un serveur d&#8217;applications, car plusieurs instances d&#8217;une [...]]]></description>
			<content:encoded><![CDATA[<p>Un fonctionnalité pratique du framework de logging Apache Log4J est le NDC (<em>pour  Nested Diagnostic Contexts</em>). Ce dernier permet de tracer et suivre plusieurs instances d&#8217;un même traitement dans un seul fichier de log. Une utilisation typique est le fichier de log d&#8217;une application web s&#8217;exécutant sur un serveur d&#8217;applications, car plusieurs instances d&#8217;une même servlet (et de plusieurs servlets) s&#8217;exécutent en même temps pour servir les utilisateurs.</p>
<p>La fonctionnalité permet donc de mieux comprendre le déroulement d&#8217;un traitement, en particulier lors qu&#8217;un problème survient lors d&#8217;un tir de charges ou sur un environnement en production. Et imaginons que ce problème &#8216;ne se reproduit pas&#8217; en environnement de recette / développement, et donc l&#8217;origine pourrait être ces accès multiples en même temps&#8230;<span id="more-58"></span></p>
<p>Un développeur seul sur sa machine génère que un seul log séquentiel, mais avec de multiples utilisateurs, le log devient un enchevêtrement de plusieurs traitements séquentiels.</p>
<p><u>Voici un exemple de log applicatif pendant un tir de charges :</u></p>
<pre>[2008-01-15 20:31:50,750][DEBUG] (DaoBoxers.java:24) - bdSelectAll() - SQL =&gt; SELECT ID, PRENOM, NOM FROM BOXERS
[2008-01-15 20:31:50,755][DEBUG] (DaoBoxers.java:27) - bdSelectAll() - ResultSet ok =&gt; org.apache.tomcat.dbcp.dbcp.DelegatingResultSet@1ba287e
[2008-01-15 20:31:50,757][DEBUG] (DaoBoxers.java:36) - bdSelectAll() - Retour list
[2008-01-15 20:31:50,758][DEBUG] (JndiJdbcTableView.java:62) - doGet() - Mise en attribut resultat
[2008-01-15 20:31:50,758][DEBUG] (JndiJdbcTableView.java:64) - doGet() - Renvoi vers JSP
[2008-01-15 20:31:50,759][DEBUG] (JndiJdbcTableView.java:78) - doGet() - end
[2008-01-15 20:31:50,768][DEBUG] (JndiJdbcWithValidationTableView.java:48) - doGet() - start
[2008-01-15 20:31:50,769][INFO ] (JndiJdbcWithValidationTableView.java:56) - doGet() - Ok connexion
[2008-01-15 20:31:50,769][DEBUG] (JndiJdbcWithValidationTableView.java:60) - doGet() - Appel Boxers =&gt; bdSelectAll
[2008-01-15 20:31:50,770][DEBUG] (DaoBoxers.java:24) - bdSelectAll() - SQL =&gt; SELECT ID, PRENOM, NOM FROM BOXERS
[2008-01-15 20:31:50,775][DEBUG] (DaoBoxers.java:27) - bdSelectAll() - ResultSet ok =&gt; org.apache.tomcat.dbcp.dbcp.DelegatingResultSet@1d2f8be
[2008-01-15 20:31:50,776][INFO ] (DirectJdbcTableView.java:60) - doGet() - Ok connexion
[2008-01-15 20:31:50,777][DEBUG] (DirectJdbcTableView.java:64) - doGet() - Appel Boxers =&gt; bdSelectAll
[2008-01-15 20:31:50,777][DEBUG] (DaoBoxers.java:24) - bdSelectAll() - SQL =&gt; SELECT ID, PRENOM, NOM FROM BOXERS
[2008-01-15 20:31:50,775][INFO ] (DirectJdbcTableView.java:60) - doGet() - Ok connexion
[2008-01-15 20:31:50,778][DEBUG] (DirectJdbcTableView.java:64) - doGet() - Appel Boxers =&gt; bdSelectAll
[2008-01-15 20:31:50,778][DEBUG] (DaoBoxers.java:24) - bdSelectAll() - SQL =&gt; SELECT ID, PRENOM, NOM FROM BOXERS
[2008-01-15 20:31:50,780][DEBUG] (DaoBoxers.java:36) - bdSelectAll() - Retour list
[2008-01-15 20:31:50,780][DEBUG] (JndiJdbcWithValidationTableView.java:62) - doGet() - Mise en attribut resultat
[2008-01-15 20:31:50,780][DEBUG] (JndiJdbcWithValidationTableView.java:64) - doGet() - Renvoi vers JSP
[2008-01-15 20:31:50,783][DEBUG] (JndiJdbcWithValidationTableView.java:78) - doGet() - end
[2008-01-15 20:31:50,784][DEBUG] (DaoBoxers.java:27) - bdSelectAll() - ResultSet ok =&gt; com.mysql.jdbc.ResultSet@10de02d
[2008-01-15 20:31:50,786][DEBUG] (DaoBoxers.java:36) - bdSelectAll() - Retour list
[2008-01-15 20:31:50,786][DEBUG] (DirectJdbcTableView.java:66) - doGet() - Mise en attribut resultat
[2008-01-15 20:31:50,787][DEBUG] (DirectJdbcTableView.java:68) - doGet() - Renvoi vers JSP
[2008-01-15 20:31:50,788][DEBUG] (DirectJdbcTableView.java:85) - doGet() - end
[2008-01-15 20:31:50,789][DEBUG] (DaoBoxers.java:27) - bdSelectAll() - ResultSet ok =&gt; com.mysql.jdbc.ResultSet@172c403
[2008-01-15 20:31:50,786][INFO ] (DirectJdbcTableView.java:60) - doGet() - Ok connexion
[2008-01-15 20:31:50,791][DEBUG] (DirectJdbcTableView.java:64) - doGet() - Appel Boxers =&gt; bdSelectAll
[2008-01-15 20:31:50,791][DEBUG] (DaoBoxers.java:24) - bdSelectAll() - SQL =&gt; SELECT ID, PRENOM, NOM FROM BOXERS
[2008-01-15 20:31:50,792][DEBUG] (JndiJdbcWithValidationTableView.java:48) - doGet() - start
[2008-01-15 20:31:50,792][INFO ] (JndiJdbcWithValidationTableView.java:56) - doGet() - Ok connexion
[2008-01-15 20:31:50,793][DEBUG] (JndiJdbcWithValidationTableView.java:60) - doGet() - Appel Boxers =&gt; bdSelectAll
[2008-01-15 20:31:50,793][DEBUG] (DaoBoxers.java:24) - bdSelectAll() - SQL =&gt; SELECT ID, PRENOM, NOM FROM BOXERS
[2008-01-15 20:31:50,794][DEBUG] (DaoBoxers.java:36) - bdSelectAll() - Retour list
[2008-01-15 20:31:50,794][DEBUG] (DirectJdbcTableView.java:66) - doGet() - Mise en attribut resultat
[2008-01-15 20:31:50,795][DEBUG] (DirectJdbcTableView.java:68) - doGet() - Renvoi vers JSP
[2008-01-15 20:31:50,796][DEBUG] (DirectJdbcTableView.java:85) - doGet() - end
[2008-01-15 20:31:50,798][DEBUG] (DaoBoxers.java:27) - bdSelectAll() - ResultSet ok =&gt; org.apache.tomcat.dbcp.dbcp.DelegatingResultSet@695586
[2008-01-15 20:31:50,799][DEBUG] (DaoBoxers.java:36) - bdSelectAll() - Retour list</pre>
<p>La fonctionnalité NDC ajoute la possibilité d&#8217;avoir un « identifiant » de traitement, par exemple le nombre de secondes depuis le 1er janvier 1970. Ainsi le log devient un enchevêtrement de traitements séquentiels identifiés.<br />
<u> Et voici un exemple de log applicatif avec NDC :</u></p>
<pre>[2008-01-15 20:07:55,920][DEBUG] (DaoBoxers.java:27) - bdSelectAll(<font color="#339966">1200427675911</font>) - ResultSet ok =&gt; org.apache.tomcat.dbcp.dbcp.DelegatingResultSet@19e907
[2008-01-15 20:07:55,921][DEBUG] (DaoBoxers.java:36) - bdSelectAll(<font color="#339966">1200427675911</font>) - Retour list
[2008-01-15 20:07:55,922][DEBUG] (JndiJdbcWithValidationTableView.java:62) - doGet(<font color="#339966">1200427675911</font>) - Mise en attribut resultat
[2008-01-15 20:07:55,922][DEBUG] (JndiJdbcWithValidationTableView.java:64) - doGet(<font color="#339966">1200427675911</font>) - Renvoi vers JSP
[2008-01-15 20:07:55,924][DEBUG] (DaoBoxers.java:27) - bdSelectAll(<font color="#ff6600">1200427675917</font>) - ResultSet ok =&gt; org.apache.tomcat.dbcp.dbcp.DelegatingResultSet@93a96c
[2008-01-15 20:07:55,925][DEBUG] (DaoBoxers.java:36) - bdSelectAll(<font color="#ff6600">1200427675917</font>) - Retour list
[2008-01-15 20:07:55,926][DEBUG] (JndiJdbcWithValidationTableView.java:62) - doGet(<font color="#ff6600">1200427675917</font>) - Mise en attribut resultat
[2008-01-15 20:07:55,926][DEBUG] (JndiJdbcWithValidationTableView.java:64) - doGet(<font color="#ff6600">1200427675917</font>) - Renvoi vers JSP
[2008-01-15 20:07:55,927][DEBUG] (JndiJdbcWithValidationTableView.java:78) - doGet(<font color="#339966">1200427675911</font>) - end
[2008-01-15 20:07:55,929][DEBUG] (DirectJdbcTableView.java:49) - doGet(<font color="#0000ff">1200427675929</font>) - start
[2008-01-15 20:07:55,931][DEBUG] (JndiJdbcWithValidationTableView.java:78) - doGet(<font color="#ff6600">1200427675917</font>) - end
[2008-01-15 20:07:55,934][DEBUG] (DirectJdbcInInitTableView.java:49) - doGet(<font color="#ff00ff">1200427675934</font>) - start
[2008-01-15 20:07:55,938][DEBUG] (JndiJdbcWithValidationTableView.java:48) - doGet(<font color="#ff0000">1200427675938</font>) - start
[2008-01-15 20:07:55,938][INFO ] (JndiJdbcWithValidationTableView.java:56) - doGet(<font color="#ff0000">1200427675938</font>) - Ok connexion
[2008-01-15 20:07:55,939][DEBUG] (JndiJdbcWithValidationTableView.java:60) - doGet(<font color="#ff0000">1200427675938</font>) - Appel Boxers =&gt; bdSelectAll
[2008-01-15 20:07:55,941][DEBUG] (net.milamberspace.dao.DaoBoxers.java:24) - bdSelectAll(<font color="#ff0000">1200427675938</font>) - SQL =&gt; SELECT ID, PRENOM, NOM FROM BOXERS
[2008-01-15 20:07:55,941][INFO ] (DirectJdbcTableView.java:60) - doGet(<font color="#0000ff">1200427675929</font>) - Ok connexion
[2008-01-15 20:07:55,942][DEBUG] (DirectJdbcTableView.java:64) - doGet(<font color="#0000ff">1200427675929</font>) - Appel Boxers =&gt; bdSelectAll
[2008-01-15 20:07:55,942][DEBUG] (DaoBoxers.java:24) - bdSelectAll(<font color="#0000ff">1200427675929</font>) - SQL =&gt; SELECT ID, PRENOM, NOM FROM BOXERS
[2008-01-15 20:07:55,947][DEBUG] (DaoBoxers.java:27) - bdSelectAll(<font color="#ff0000">1200427675938</font>) - ResultSet ok =&gt; org.apache.tomcat.dbcp.dbcp.DelegatingResultSet@17dde01
[2008-01-15 20:07:55,948][DEBUG] (DaoBoxers.java:36) - bdSelectAll(<font color="#ff0000">1200427675938</font>) - Retour list
[2008-01-15 20:07:55,949][DEBUG] (JndiJdbcWithValidationTableView.java:62) - doGet(<font color="#ff0000">1200427675938</font>) - Mise en attribut resultat
[2008-01-15 20:07:55,949][DEBUG] (JndiJdbcWithValidationTableView.java:64) - doGet(<font color="#ff0000">1200427675938</font>) - Renvoi vers JSP
[2008-01-15 20:07:55,950][DEBUG] (DaoBoxers.java:27) - bdSelectAll(<font color="#0000ff">1200427675929</font>) - ResultSet ok =&gt; com.mysql.jdbc.ResultSet@7a3c6c
[2008-01-15 20:07:55,952][DEBUG] (DaoBoxers.java:36) - bdSelectAll(<font color="#0000ff">1200427675929</font>) - Retour list
[2008-01-15 20:07:55,952][DEBUG] (DirectJdbcTableView.java:66) - doGet(<font color="#0000ff">1200427675929</font>) - Mise en attribut resultat
[2008-01-15 20:07:55,952][DEBUG] (DirectJdbcTableView.java:68) - doGet(<font color="#0000ff">1200427675929</font>) - Renvoi vers JSP
[2008-01-15 20:07:55,954][DEBUG] (DirectJdbcTableView.java:85) - doGet(<font color="#0000ff">1200427675929</font>) - end
[2008-01-15 20:07:55,956][INFO ] (DirectJdbcInInitTableView.java:57) - doGet(<font color="#ff00ff">1200427675934</font>) - Ok connexion
[2008-01-15 20:07:55,956][DEBUG] (DirectJdbcInInitTableView.java:61) - doGet(<font color="#ff00ff">1200427675934</font>) - Appel Boxers =&gt; bdSelectAll
[2008-01-15 20:07:55,957][DEBUG] (DaoBoxers.java:24) - bdSelectAll(<font color="#ff00ff">1200427675934</font>) - SQL =&gt; SELECT ID, PRENOM, NOM FROM BOXERS
[2008-01-15 20:07:55,958][DEBUG] (JndiJdbcWithValidationTableView.java:78) - doGet(<font color="#ff0000">1200427675938</font>) - end
[2008-01-15 20:07:55,961][DEBUG] (DaoBoxers.java:27) - bdSelectAll(<font color="#ff00ff">1200427675934</font>) - ResultSet ok =&gt; com.mysql.jdbc.ResultSet@283198
[2008-01-15 20:07:55,963][DEBUG] (DaoBoxers.java:36) - bdSelectAll(<font color="#ff00ff">1200427675934</font>) - Retour list</pre>
<p>Cela permet une lecture plus facile des logs (la couleur n&#8217;est pas incluse <img src='http://blog.milamberspace.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> ), dès lors que l&#8217;on sait utiliser la commande grep sous Unix en faisant quelques petits grep sur l&#8217;identifiant. (par exemple : grep 1200426850018 mon_log.txt)</p>
<p>Comme faire pour utiliser NDC ? Et bien tout d&#8217;abord dans le fichier de configuration de Log4J, le fameux log4j.properties. Il faut ajouter la balise « %x » dans le ConversionPattern, celle-ci sera remplacée par l&#8217;identifiant unique défini lors de l&#8217;utilisation de NDC.</p>
<p><u>Exemple de fichier log4j.properties</u></p>
<pre><font color="#800000">log4j.rootLogger=DEBUG, LOG1
log4j.appender.LOG1=org.apache.log4j.ConsoleAppender
log4j.appender.LOG1.layout=org.apache.log4j.PatternLayout
log4j.appender.LOG1.layout.ConversionPattern=[%d][%-5p] (%C.java:%L) - %M(<strong>%x</strong>) - %m%n</font></pre>
<p>Au niveau du code source Java, on utilisera deux méthodes de la classe statique NDC.</p>
<ul>
<li><em>NDC.push(String ID)</em> qui permet de poser un identifiant</li>
<li><em>NDC.pop()</em> qui permet de dépiler le dernier identifiant posé</li>
</ul>
<p>Voici un exemple simple d&#8217;utilisation pour une servlet, avec ici, l&#8217;utilisation de « new Date().getTime() » comme identifiant :</p>
<pre>protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 NDC.push(String.valueOf(new Date().getTime()));
 logger.debug("start");
 Connection connection = null;
 try {
 	connection = getDataSource().getConnection();
 	logger.info("Ok connexion");
	DaoBoxers dao = new DaoBoxers();
 	dao.setConnection(connection);
 	ArrayList<boxer> list = dao.bdSelectAll();
 	request.setAttribute("beanListeBoxer", list);
 	this.getServletContext().getRequestDispatcher("/tableview.jsp").forward(request, response);
</boxer> } catch (Exception e) {
 	logger.error(e);
 	throw new ServletException(e.getMessage());
 } finally {
 	try {
 		connection.close();
 	} catch (SQLException sqle) {
 		logger.error(sqle);
 	}
 	logger.debug("end");
 	NDC.pop();
 }
}</pre>
<p>Bien entendu, les appels à logger.xxxx() dans les méthodes du DAO vont également bénéficier de l&#8217;identifiant NDC.</p>
<p>Espérons que ce billet vous sera utile.</p>
<p><em>La page de<a href="http://logging.apache.org/log4j/1.2/manual.html" target="_blank"> manuel de Log4J</a>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.milamberspace.net/index.php/2008/01/15/utilisation-de-ndc-de-apache-log4j-pour-tracer-et-suivre-lexecution-dune-application-java-58.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SAP Memory Analyzer : voilà un vrai outil pour analyser des Heap Dump Java !</title>
		<link>http://blog.milamberspace.net/index.php/2007/10/14/sap-memory-analyzer-voila-un-vrai-outil-pour-analyser-des-heap-dump-java-42.html</link>
		<comments>http://blog.milamberspace.net/index.php/2007/10/14/sap-memory-analyzer-voila-un-vrai-outil-pour-analyser-des-heap-dump-java-42.html#comments</comments>
		<pubDate>Sun, 14 Oct 2007 16:51:38 +0000</pubDate>
		<dc:creator>Milamber</dc:creator>
				<category><![CDATA[BEA]]></category>
		<category><![CDATA[Heap Dump]]></category>
		<category><![CDATA[IBM]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Sun]]></category>

		<guid isPermaLink="false">http://blog.milamberspace.net/index.php/2007/10/14/sap-memory-analyzer-voila-un-vrai-outil-pour-analyser-des-heap-dump-java-42.html</guid>
		<description><![CDATA[Vous avez développé une application JEE, et depuis son passage en production au moins une fois par jour il y a une erreur Java « OutOfMemoryError ». La première réaction a été de dire : mauvaise configuration de la taille maximale de la JVM&#8230; vous avez préconisé 1Go de Max Heap Size, cela n&#8217;a pas [...]]]></description>
			<content:encoded><![CDATA[<p>Vous avez développé une application JEE, et depuis son passage en production au moins une fois par jour il y a une erreur Java « OutOfMemoryError ». La première réaction a été de dire : mauvaise configuration de la taille maximale de la JVM&#8230; vous avez préconisé 1Go de Max Heap Size, cela n&#8217;a pas fonctionné, l&#8217;erreur OOME arrive encore&#8230; Alors on est passé à 2Go&#8230; Toujours l&#8217;erreur d&#8217;OOME&#8230; Aie, et que faire&#8230;</p>
<p>Quand vous êtes à ce point, vous pouvez être certain que vous avez une fuite de mémoire (memory leaks) quelque part. Oh, ce n&#8217;est pas que vous êtes un mauvais développeur <img src='http://blog.milamberspace.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  et que vous ne savez pas bien gerer la mémoire, en effet, parfois un problème de fuite de mémoire peut survenir à cause d&#8217;une fonctionnalité activée du serveur d&#8217;applications de production et qui rentre en « conflit » avec une brique de l&#8217;application. (Je citerai un exemple vécu : le cache (activé) JDBC de la source de données WebSphere 5.1 et un framework maison de mapping O/R)</p>
<p>Quand on a un problème d&#8217;OutOfMemory, on commence souvent par activer le mode verbeux du Garbage Collector (GC), c&#8217;est une très bonne idée, cela permet d&#8217;avoir une petite idée sur le déroulement du problème de mémoire  <em>(on peut utiliser l&#8217;outil Extensible Verbose Toolkit d&#8217;IBM pour ce travail, cf références)</em>. Cependant c&#8217;est insuffisant pour trouver la cause du problème<em>.</em> Quelques recherches sur Internet vous apprennent qu&#8217;il est possible d&#8217;avoir une image de la mémoire Java avec la génération d&#8217;un « heap dump », ensuite il suffit de l&#8217;analyser pour trouver la cause de la fuite de mémoire. Facile à écrire, mais dur à faire&#8230;</p>
<p><span id="more-42"></span></p>
<p><strong>Commençons par la génération du heap dump.</strong> La bonne nouvelle, c&#8217;est que depuis les versions Java 1.4.2 update 12, Java 5 update 07 et Java 6, la génération de heap dump est « devenu » facile. Pour avoir un heap dump automatique dès que vous avez une erreur OOME, il faut simplement ajouter ce paramètre <strong>-XX:+HeapDumpOnOutOfMemoryError</strong> dans les arguments de la JVM. La mauvaise nouvelle, c&#8217;est que pour les versions antérieures, c&#8217;est plus difficile d&#8217;obtenir un heap dump. Cela dépend de l&#8217;éditeur de la JVM que vous utilisez (IBM, BEA, Sun, HP, etc), il faut se reporter sur le site de l&#8217;éditeur pour trouvez la bonne recette&#8230;</p>
<p>Une fois que l&#8217;on a trouvé le bon paramètre pour générer son heap dump, il ne reste plus qu&#8217;à le mettre en production et attendre l&#8217;erreur fatal d&#8217;OOME. Quand celle-ci arrive, on attend la génération du fichier qui peut prendre plusieurs minutes car le fichier aura la taille de la JVM au moment de l&#8217;erreur. Donc si la taille maximum est à 1Go, le fichier va faire 1Go.</p>
<p><strong>Maintenant que l&#8217;on a son fichier heap dump, il faut l&#8217;analyser&#8230;</strong>et là aussi c&#8217;est pas simple. Il existe différents moyens, allant du mode texte (via Hprof) vers des outils tels que Heap Analyzer de IBM ou bien HAT (ou JHAT maintenant) de Sun. Le gros problème de ses outils, c&#8217;est que c&#8217;est quasiment impossible d&#8217;ouvrir un heap dump d&#8217;1Go avec. Vous avez un OutOfMemoryError de l&#8217;outil <img src='http://blog.milamberspace.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>La bonne nouvelle c&#8217;est que l&#8217;éditeur SAP a pensé à nous, à travers son outil d&#8217;analyse Memory Analyzer. Ce dernier est basé sur l&#8217;environnement RCP d&#8217;Eclipse. Il ouvre sans difficulté un heap dump de 1Go, car il analyse le fichier heap dump petit à petit et en créant ses propres fichiers d&#8217;index. <em>(Il faut compter environ 1h30 pour ouvrir un fichier 1,2Go sur un portable Vista avec 2Go de RAM, Core 2 Duo 2GHz)</em></p>
<p>Memory Analyzer dispose de nombreuses fonctionnalités, dont l&#8217;une qui va nous intéresser particulièrement : la détection de fuite de mémoire (find memory leaks). De plus il dispose de tutoriaux pour aider à l&#8217;analyse de fichier heap dump.</p>
<p>Voici quelques captures d&#8217;écran qui en diront plus que mes longs discours :</p>
<p><strong>Détails d&#8217;un heap dump.</strong></p>
<p><img src="/wp-content/images/memory-analyzer-01-img/sap-memory-analyzer-01.gif" alt="Détails d'un heap dump" align="left" border="1" height="439" width="569" /><br clear="left" /><br />
<strong>Histogramme, détails par classe : nombre d&#8217;objets, taille la plus petite de l&#8217;objet, taille des objets</strong></p>
<p><img src="/wp-content/images/memory-analyzer-01-img/sap-memory-analyzer-03.gif" alt="Histogram - Voir les classes, le nombre d'objets,  la plus petite taille de l'objet et la taille totale des objets" align="left" border="1" /><br clear="left" /><br />
<strong>Inspector pour avoir le détail et le contenu d&#8217;un objet</strong></p>
<p><img src="/wp-content/images/memory-analyzer-01-img/sap-memory-analyzer-04.gif" alt="Inspector" align="left" border="1" height="863" width="564" /><br clear="left" /></p>
<p><strong>La détection de fuite de mémoire</strong>, ici un objet détient à lui tout seul 657 Mo sur 1024 Mo ! Cela sent le memory leaks&#8230;</p>
<p><img src="/wp-content/images/memory-analyzer-01-img/sap-memory-analyzer-05.gif" alt="Détection de fuite de mémoire (memory leaks)" align="left" border="1" /><br clear="left" /></p>
<p><strong>Analyse de la fuite mémoire</strong>, la cause ici semble être une liste HashMap de + de 490000 objets.</p>
<p><img src="/wp-content/images/memory-analyzer-01-img/sap-memory-analyzer-02.gif" alt="Analyse d'une fuite de mémoire" align="left" border="1" /><br clear="left" /><br />
<u><strong><br />
[Quelques pointeurs]</strong></u></p>
<ul>
<li><a href="https://www.sdn.sap.com/irj/sdn/wiki?path=/display/Java/Java+Memory+Analysis">SAP Memory Analyzer</a></li>
<li><a href="http://blogs.sun.com/alanb/entry/heap_dumps_are_back_with">Heap dumps are back with a vengeance! </a></li>
<li><a href="https://hat.dev.java.net/doc/README.html">HAT &#8212; The Java Heap Analysis Tool</a></li>
<li><a href="http://www.alphaworks.ibm.com/tech/heaproots">IBM : HeapRoots : A tool for debugging memory leaks in Java applications through analysis of &laquo;&nbsp;heap dumps.&nbsp;&raquo;</a></li>
<li><a href="http://www.alphaworks.ibm.com/tech/heapanalyzer">IBM : HeapAnalyzer : A graphical tool for discovering possible Java heap leaks.</a></li>
<li><a href="http://www-1.ibm.com/support/docview.wss?rs=180&amp;context=SSEQTP&amp;q1=heapdump+solaris&amp;uid=swg21190608&amp;loc=en_US&amp;cs=utf-8&amp;lang=en">IBM : Using HeapAnalyzer to analyze Java heap usage and detect possible Java heap leak</a></li>
<li><a href="http://dev2dev.bea.com/pub/a/2005/06/memory_leaks.html">BEA : Memory Leaks, Be Gone!</a></li>
<li><a href="http://www.ibm.com/developerworks/java/library/j-ibmtools1/">Java diagnostics, IBM style, Part 1: Introducing the IBM Dump Analyzer for Java</a></li>
<li><a href="http://www.ibm.com/developerworks/web/library/j-ibmtools2/?S_TACT=105AGX54&amp;ca=dnw-839">Java diagnostics, IBM style, Part 2: Garbage collection with the Extensible Verbose Toolkit</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.milamberspace.net/index.php/2007/10/14/sap-memory-analyzer-voila-un-vrai-outil-pour-analyser-des-heap-dump-java-42.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sortie de Eclipse Europa</title>
		<link>http://blog.milamberspace.net/index.php/2007/07/09/sortie-de-eclipse-europa-23.html</link>
		<comments>http://blog.milamberspace.net/index.php/2007/07/09/sortie-de-eclipse-europa-23.html#comments</comments>
		<pubDate>Mon, 09 Jul 2007 09:12:12 +0000</pubDate>
		<dc:creator>Milamber</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blog.milamberspace.net/index.php/2007/07/09/sortie-de-eclipse-europa-23.html</guid>
		<description><![CDATA[La Fondation Eclipse vient de sortir Eclipse Europa. Il s’agit de la mise à jour synchronisée de 21 projets permettant ainsi d’assurer une compatibilité entre les sous-projets d’Eclipse et le socle. Europa désigne donc plus qu’Eclipse et plusieurs déclinaisons d’Europa sont proposées :
&#160;

Eclipse 	pour les développeurs Java
Eclipse 	pour les développeurs JEE
Eclipse 	pour les développeurs C/C++
Eclipse [...]]]></description>
			<content:encoded><![CDATA[<p style="" align="left">La Fondation Eclipse vient de sortir Eclipse Europa. Il s’agit de la mise à jour synchronisée de 21 projets permettant ainsi d’assurer une compatibilité entre les sous-projets d’Eclipse et le socle. Europa désigne donc plus qu’Eclipse et plusieurs déclinaisons d’Europa sont proposées :</p>
<p align="left">&nbsp;</p>
<ul>
<li><font color="#0000ff"><u><a href="http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/20070702/eclipse-java-europa-win32.zip&amp;r=1&amp;protocol=http">Eclipse 	pour les développeurs Java</a></u></font></li>
<li><font color="#0000ff"><u><a href="http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/20070702/eclipse-jee-europa-win32.zip&amp;r=1&amp;protocol=http">Eclipse 	pour les développeurs JEE</a></u></font></li>
<li><font color="#0000ff"><u><a href="http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/20070702/eclipse-cpp-europa-win32.zip&amp;r=1&amp;protocol=http">Eclipse 	pour les développeurs C/C++</a></u></font></li>
<li><font color="#0000ff"><u><a href="http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/20070702/eclipse-rcp-europa-win32.zip&amp;r=1&amp;protocol=http">Eclipse 	pour les développeurs RCP/Plug-in</a></u></font></li>
<li><font color="#0000ff"><u><a href="http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops/R-3.3-200706251500/eclipse-SDK-3.3-win32.zip&amp;r=1&amp;protocol=http">Eclipse 	Classic</a></u></font></li>
</ul>
<p>Chaque déclinaison est composée d’outils adaptés à l’environnement ciblé. Il reste bien sûr possible de faire sa propre déclinaison en téléchargeant individuellement les modules via le mécanisme de mise à jour livré dans Eclipse (socle).<span id="more-23"></span></p>
<p style="" align="left">Pour la version qui nous concerne « le plus », la version pour les développeurs JEE, on trouvera Eclipse 3.3 et le projet Web Tools (WTP) 2.0. Incluant notamment un éditeur graphique HTML / JSP / JSF, le support de Java EE version 5, le module Mylyn qui permet de faire du travail collaboratif au niveau de l’équipe de développement, etc.</p>
<p style="" align="left">Au niveau des Web Tools, quelques captures d’écran en disent plus qu’un long discours. Pour les nouveautés sur les <font color="#0000ff"><u><a href="http://www.eclipse.org/webtools/releases/2.0/newandnoteworthy/jee.php">JSP cliquer ici</a></u></font>, le <font color="#0000ff"><u><a href="http://www.eclipse.org/webtools/releases/2.0/newandnoteworthy/webresources.php">HTML ici</a></u></font> et plus généralement sur <font color="#0000ff"><u><a href="http://www.eclipse.org/webtools/releases/2.0/newandnoteworthy/xml.php">l’éditeur syntaxique ici</a></u></font>. Concernant le support des environnements d’exécution des applications JEE (autrement dit les « serveurs d’applications ») <font color="#0000ff"><u><a href="http://www.eclipse.org/webtools/releases/2.0/newandnoteworthy/server.php">voir ici</a></u></font>. Pour compléter les Web Tools, on trouvera le module des <font color="#0000ff"><u><a href="http://www.eclipse.org/webtools/releases/2.0/newandnoteworthy/webservices.php">WebServices ici</a></u></font>, et l’ajout d’un module <font color="#0000ff"><u><a href="http://www.eclipse.org/webtools/releases/2.0/newandnoteworthy/jpa.php">Dali JPA pour Java Persistence API</a></u></font> qui simplifie le mapping objet/relationnel pour les EJB 3.0.</p>
<p style="" align="left">Parmi les autres projets on remarquera : <font color="#0000ff"><u><a href="http://www.eclipse.org/birt/phoenix/">BIRT</a></u></font> qui permet de faire du décisionnel avec la création de rapport / tableau de bord / graphiques à la manière de Crystal Report. <font color="#0000ff"><u><a href="http://www.eclipse.org/tptp/">TPTP</a></u></font> pour le profiling de code Java, et les tests de performances d’une application Java.</p>
<p style="" align="left">Eclipse Europa ne révolutionne pas bien entendu, la plus part des modules évoqués ci-dessus se trouvaient déjà dans Callisto (le nom de la dernière livraison synchronisée). Mais Europa apporte son lot d’améliorations de l’environnement de développement (cf. les captures d’écrans) et important, le support de Vista.</p>
<p style="" align="left">Pas de risques donc à migrer vers cette nouvelle version de cet outil devenu le socle d’un très grand nombre d’environnements de développement.</p>
<p style="" align="left"><strong>[Quelques pointeurs]</strong></p>
<p align="left">&nbsp;</p>
<ul>
<li><font color="#0000ff"><u><a href="http://www.eclipse.org/downloads/moreinfo/jee.php">Eclipse IDE for Java EE Developers</a></u></font></li>
<li><font color="#0000ff"><u><a href="http://www.journaldunet.com/developpeur/java-j2ee/07/0704-eclipse-europa.shtml">Eclipse multiplie par deux son périmètre fonctionnel</a></u></font></li>
<li><font color="#0000ff"><u><a href="http://www.vnunet.fr/fr/vnunet/news/2007/07/02/eclipse-d-voile-projet-open">Eclipse dévoile son projet Europa</a></u></font></li>
<li><font color="#0000ff"><u><a href="http://www.01net.com/editorial/353229/la-plate-forme-eclipse-remet-tout-a-plat/">La plate-forme Eclipse remet tout à plat</a></u></font></li>
<li><font color="#0000ff"><u><a href="http://www.lemondeinformatique.fr/actualites/lire-eclipse-europa-lancement-simultane-de-21-projets-23298.html">Eclipse Europa : lancement simultané de 21 projets</a></u></font></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.milamberspace.net/index.php/2007/07/09/sortie-de-eclipse-europa-23.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dossier Eclipse</title>
		<link>http://blog.milamberspace.net/index.php/2007/04/16/dossier-eclipse-18.html</link>
		<comments>http://blog.milamberspace.net/index.php/2007/04/16/dossier-eclipse-18.html#comments</comments>
		<pubDate>Mon, 16 Apr 2007 19:14:44 +0000</pubDate>
		<dc:creator>Milamber</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blog.milamberspace.net/index.php/2007/04/16/dossier-eclipse-18.html</guid>
		<description><![CDATA[Eclipse devient incontournable, personne ne dira le contraire. Même Microsoft ! en effet, la revue &#8216;Redmond Developer news&#8217;, destinée aux utilisateurs des produits Microsoft, a publié cet éditorial qui met en avant le fait que l&#8217;utilisation d&#8217;Eclipse dépasse largement le monde Java et donc que des outils basés sur Eclipse pourraient être de plus en [...]]]></description>
			<content:encoded><![CDATA[<p style="" align="left">Eclipse devient incontournable, personne ne dira le contraire. Même Microsoft ! en effet, la revue &#8216;Redmond Developer news&#8217;, destinée aux utilisateurs des produits Microsoft, a publié cet éditorial qui met en avant le fait que l&#8217;utilisation d&#8217;Eclipse dépasse largement le monde Java et donc que des outils basés sur Eclipse pourraient être de plus en plus utilisés dans le cadre de développements en technologies Microsoft.<span id="more-18"></span></p>
<p style="" align="left"><font color="#0000ff"><u><a href="http://reddevnews.com/columns/article.aspx?editorialsid=1701">L&#8217;éditorial: &#8216;Pay Attention to Eclipse&#8217;</a></u></font><br />
<em>Et en réponse, 01net nous propose un dossier Eclipse :</em><br />
<font color="#0000ff"><u><a href="http://www.01net.com/editorial/345790/infrastructure/eclipse-la-plate-forme-a-tout-faire/">Eclipse, la plate-forme à tout faire</a></u></font></p>
<ul>
<li><font color="#0000ff"><u><a href="http://www.01net.com/article/345790_a.html">Introduction</a></u></font>
<ul>
<li>Développer en Java rime souvent avec plate-forme Eclipse. Mais la fondation open source initiée par IBM, sert à créer toutes sortes de logiciels.</li>
</ul>
</li>
<li><font color="#0000ff"><u><a href="http://www.01net.com/article/345791.html">Un 	moyen de fédérer la communauté Java</a></u></font>
<ul>
<li>La plate-forme open source Eclipse est devenue, dans la communauté Java, quasi incontournable. Notamment en matière de développement logiciel. Même si la couverture fonctionnelle de son concurrent, Netbeans, reste à la hauteur.</li>
</ul>
</li>
<li><font color="#0000ff"><u><a href="http://www.01net.com/article/345792.html">De 	l&#8217;environnement de développement à la plate-forme</a></u></font>
<ul>
<li>En quelques années, IBM a transformé Eclipse IDE en une plate-forme de développement et d&#8217;intégration de logiciels ouverte à plus de 150 partenaires. L&#8217;émergence d&#8217;une vraie alternative à Microsoft ?</li>
</ul>
</li>
<li><font color="#0000ff"><u><a href="http://www.01net.com/article/345794.html">Une 	usine à logiciels bâtie sur la méritocratie</a></u></font>
<ul>
<li>Fondé en fin 2001 pour créer une alternative à Visual Studio de Microsoft, le consortium Eclipse a su se muer en véritable plate-forme de mutualisation, sous l&#8217;aspect d&#8217;une fondation à but non lucratif.</li>
</ul>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.milamberspace.net/index.php/2007/04/16/dossier-eclipse-18.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sortie de Java 6</title>
		<link>http://blog.milamberspace.net/index.php/2006/12/25/sortie-de-java-6-8.html</link>
		<comments>http://blog.milamberspace.net/index.php/2006/12/25/sortie-de-java-6-8.html#comments</comments>
		<pubDate>Mon, 25 Dec 2006 09:18:19 +0000</pubDate>
		<dc:creator>Milamber</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blog.milamberspace.net/index.php/2006/12/25/sortie-de-java-6-8.html</guid>
		<description><![CDATA[Et hop, quelques jours après l’annonce du passage en licence open source de Java, une nouvelle version voit le jour. Contrairement à ce l’on pourrait penser, il ne s’agit de la version 5 de Java + la licence open source = version 6. Cette dernière est le fruit de deux années de travail des membres [...]]]></description>
			<content:encoded><![CDATA[<p style="" align="left">Et hop, quelques jours après l’annonce du passage en licence open source de Java, une nouvelle version voit le jour. Contrairement à ce l’on pourrait penser, il ne s’agit de la version 5 de Java + la licence open source = version 6. Cette dernière est le fruit de deux années de travail des membres du JCP.</p>
<p style="" align="left">Pour un petit rappel historique : la version 1.0 est sortie en 1996, la 1.1 en 1997, la 1.2 en 1998, la 1.3 en 2000, la 1.4 en 2002 et la version 1.5 (renommé 5.0) en 2004. Donc deux ans après on trouve la version 1.6 (6.0).<span id="more-8"></span></p>
<p style="" align="left">Qu’apporte cette nouvelle version ? De meilleures performances (de 5 à 24% selon le contexte, plus performante que la version 5 de Java), une meilleure supervision de la JVM grâce à l’utilisation de l’API JMX (Java Management Extension), le support de langages tiers comme le JavaScript, l’intégration de Java DB et le support des Web Services (déjà intégré dans le J2EE seulement).</p>
<p style="" align="left"><strong>[Quelques pointeurs]</strong></p>
<ul>
<li><font color="#0000ff"><u><a href="http://www.theserverside.com/news/thread.tss?thread_id=43434">Sun JSE 6 released</a></u></font> (anglais)</li>
<li><font color="#0000ff"><u><a href="https://scripting.dev.java.net/">Le scripting avec Java 6</a></u></font> (anglais)</li>
<li><font color="#0000ff"><u><a href="http://www.lemondeinformatique.fr/actualites/lire-sun-lance-java-se-60-21584.html">Sun lance Java SE 6.0</a></u></font></li>
<li><font color="#0000ff"><u><a href="http://java.sun.com/javase/downloads/index.jsp">Télécharger la nouvelle version 6</a></u></font></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.milamberspace.net/index.php/2006/12/25/sortie-de-java-6-8.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
