<?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/"
xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
xmlns:media="http://search.yahoo.com/mrss/"
> <channel><title>Blog Xebia France &#187; JVM</title> <atom:link href="http://blog.xebia.fr/tag/jvm/feed/" rel="self" type="application/rss+xml" /><link>http://blog.xebia.fr</link> <description>J2EE, Agilité et SOA</description> <lastBuildDate>Wed, 08 Feb 2012 09:23:16 +0000</lastBuildDate> <language>fr</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=</generator> <copyright>CC BY-NC-ND 2.0 http://creativecommons.org/licenses/by-nc-nd/2.0/fr/</copyright> <managingEditor>blog-france@xebia.com (Xebia France)</managingEditor> <webMaster>blog-france@xebia.com (Xebia France)</webMaster> <ttl>1440</ttl> <image> <url>http://blog.xebia.fr/videos/xebia-podcast.png</url><title>Blog Xebia France</title><link>http://blog.xebia.fr</link> <width>144</width> <height>144</height> </image> <itunes:new-feed-url>http://blog.xebia.fr/feed/podcast/</itunes:new-feed-url> <itunes:subtitle>Les podcasts de Xebia France vous permettent de suivre l&#039;actualité autour de Java, de l&#039;agilité, des technologies Web et bien d&#039;autres. Xebia France est une entreprise spécialisée dans les technologies Java et JEE en environnement agi[...]</itunes:subtitle> <itunes:summary>Les podcasts de Xebia France vous permettent de suivre l&#039;actualité autour de Java, de l&#039;agilité, des technologies Web et bien d&#039;autres. Xebia France est une entreprise spécialisée dans les technologies Java et JEE en environnement agile.</itunes:summary> <itunes:keywords>Xebia, Java, JEE, SOA, Agile, Méthodes, Agiles</itunes:keywords> <itunes:category text="Technology" /> <itunes:category text="Technology"> <itunes:category text="Software How-To" /> </itunes:category> <itunes:category text="Technology"> <itunes:category text="Tech News" /> </itunes:category> <itunes:author>Xebia France</itunes:author> <itunes:owner> <itunes:name>Xebia France</itunes:name> <itunes:email>blog-france@xebia.com</itunes:email> </itunes:owner> <itunes:block>no</itunes:block> <itunes:explicit>no</itunes:explicit> <itunes:image href="http://blog.xebia.fr/videos/xebia-podcast.png" /> <item><title>Legacy code &#8211; gestion des exceptions avec JPDA</title><link>http://blog.xebia.fr/2011/12/12/legacy-code-gestion-des-exceptions-avec-jpda/</link> <comments>http://blog.xebia.fr/2011/12/12/legacy-code-gestion-des-exceptions-avec-jpda/#comments</comments> <pubDate>Mon, 12 Dec 2011 13:22:00 +0000</pubDate> <dc:creator>Nabil Gasri</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[jpda]]></category> <category><![CDATA[JVM]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=9751</guid> <description><![CDATA[Il y a quelques jours un ami a sollicité mon aide pour résoudre un problème peu commun. Il avait comme tâche de lever des alertes sur les exceptions levées par une application dont il ne peut modifier le code. L&#8217;application utilise mal l&#8217;API de log et ne loggue pas (toutes) les exceptions. De plus, elle [...]]]></description> <content:encoded><![CDATA[<p>Il y a quelques jours un ami a sollicité mon aide pour résoudre un problème peu commun. Il avait comme tâche de lever des alertes sur les exceptions levées par une application dont il ne peut modifier le code. L&#8217;application utilise mal l&#8217;API de log et ne loggue pas (toutes) les exceptions. De plus, elle est peu documentée et le peu qui existe est obsolète.</p><p>A chaque exception qui survient pendant l&#8217;exécution de l&#8217;application, il doit envoyer un mail d&#8217;alerte.</p><p>L&#8217;application est un programme JAVA standalone lancé via un script shell. Ci après les solutions auxquelles j&#8217;ai pensé :</p><ol><li>Utiliser JPDA (Java Platform Debugger Architecture).</li><li>Utiliser l’api instrumentation de Java.</li><li>Utiliser de l’AOP.</li></ol><p>Je vous propose dans cette série de trois articles de développer chacune de ces solutions.</p><p>Dans cette première partie, je vais explorer JPDA. Je commencerais par une brève introduction, avant de présenter la résolution du problème.</p><h2><a
name="DRAFT-Legacycode-gestiondesexceptionsavecJPDA-JPDA"></a>JPDA</h2><p>Java Platform Debugger Architecture (JPDA) est un ensemble d&#8217;API créé dans le but de permettre de déboguer des programmes JAVA. Elle définit le cadre dans lequel un développeur débogue une JVM en utilisant un outil de débogage.  Le débogueur crée des points d&#8217;arrêt. La JVM débogguée arrête son exécution lors de la rencontre d&#8217;un point d&#8217;arrêt et notifie le déboggeur. JPDA peut être considérée comme une sorte de communication  inter-processus. En effet, elle permet à deux JMV (déboguée et débogueur)  d&#8217;échanger des informations. Plus, il permet à la JVM source (celle du  débogueur) de commander et contrôler l&#8217;exécution de la JVM cible  (déboguée).</p><p>Cette architecture repose sur deux API et un protocole :</p><ul><li>Java Virtual Machine Tools Interface (JVMTI) : une API native que la JVM doit implémenter pour fournir ledit &laquo;&nbsp;mode débug&nbsp;&raquo;. Elle est utilisée aussi par les éditeurs voulant créer des outils de débogage, profiling ou monitoring. Introduite depuis JavaSE 5.0, elle remplace Java Virtual Machine Debug Interface (JVMDI) et Java Virtual Machine Profiler Interface (JVMPI).</li><li>Le protocole Java Debug Wire Protocol (JDWP) : un protocole binaire qui formalise les échanges entre le programme débogueur et le programme débogué.</li><li>Java Debug Interface (JDI) : API de haut niveau écrite en Java, à utiliser par l&#8217;outil de débogage. Les IDE comme Eclipse et IntelliJ IDEA utilisent cette API.</li></ul><p>Pour notre problème, c&#8217;est l&#8217;API JDI qui nous intéresse. En effet, nous allons l&#8217;utiliser pour créer notre débogueur.</p><p>Voici le code que nous allons déboguer :</p><pre class="brush: java; gutter: true; title: ; notranslate">
package fr.xebia.jpda;
public class LegacyCode {
    public static void main(String[] args) {
        try {
   throw new RuntimeException(&quot;Test of a caughted exception&quot;);  
 } catch (Exception ex) {
  ex.printStackTrace();
  throw new IllegalStateException(&quot;Test of an uncaughted exception&quot;,ex);
 }
   } 
}
</pre><p>Le seul but de ce bout de code est de simuler un programme qui lance de temps en temps des exceptions qu&#8217;il catche et traite, et d&#8217;autres qu&#8217;il ne catche pas.</p><p>La solution consiste à attacher cette JVM à un débogueur que nous allons créer. Le débogueur crée un point d&#8217;arrêt sur toutes les exceptions lancées (comme vous le faites sur votre IDE préféré).</p><p>Le débogueur est alors notifié sur les exceptions. Pour chaque exception, le débogueur demandera à la JVM cible d&#8217;écrire la stacktrace dans un fichier qui pourra être envoyé par mail.  </p><h2><a
name="DRAFT-Legacycode-gestiondesexceptionsavecJPDA-Connexion%C3%A0laJVM"></a>Connexion à la JVM</h2><p>Les échanges d&#8217;information entre les JVM se basent sur le protocole JDWP. Ce protocole présente deux types de transport:</p><ol><li>le transport par socket: permet de déboguer une JVM à distance. La JVM cible peut être sur la même machine que le débogueur comme elle peut être sur une autre machine. Lors du lancement de la JVM cible il faut spécifier le port du débogage.</li><li>le transport par mémoire partagée: permet de déboguer une JVM locale en connaissant son ID.</li></ol><p>Pour pouvoir établir une connexion entre les deux JVM, ,il faut que la machine virtuelle à déboguer soit lancée en mode Debug.</p><p>Pour ça, il faut rajouter une des lignes suivantes au script de démarrage de la JVM cible:</p><ul><li>-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n : mise en place d&#8217;un connecteur de type socket qui écoute sur le port 8000</li><li>-agentlib:jdwp:transport=dt_socket,address=8000,server=y,suspend=n à partir de JavaSe 5 (la première manière est toujours utilisée)</li><li>-Xdebug -Xrunjdwp:transport=dt_shmem,server=y,suspend=y : mise en place d&#8217;un connecteur de type mémoire partagée (il faut alors connaitre le PID du processus cible).</li><li>-Xagentlib:transport=dt_shmem,server=y,suspend=y.</li></ul><p>La connexion à la JVM cible se fait comme suit:</p><pre class="brush: java; gutter: true; title: ; notranslate">
public static VirtualMachine connect(String port) throws IOException, IllegalConnectorArgumentsException {
        AttachingConnector connector = null;
        VirtualMachineManager vmManager = Bootstrap.virtualMachineManager();
        for (Connector aconnector : vmManager.allConnectors()) {
            if (&quot;com.sun.jdi.SocketAttach&quot;.equals(aconnector.name())) {
  connector = (AttachingConnector) aconnector;
  break;
     }
 }
 Map&lt;String, Connector.Argument&gt; args = connector.defaultArguments();
        Connector.Argument pidArgument = args.get(&quot;port&quot;);
        pidArgument.setValue(port);
        return connector.attach(args);
 }
</pre><p>Cette méthode prend en argument le numéro de port du débogue de la JVM cible (je suppose que les deux JVM tournent sur la même machine).</p><p>Elle retourne un Objet VirtualMachine qui référence la JVM cible, ou plutôt un miroir (Mirror) de la JVM cible.</p><h2><a
name="DRAFT-Legacycode-gestiondesexceptionsavecJPDA-Cr%C3%A9ationdupointd%27arr%C3%AAt"></a>Création du point d&#8217;arrêt</h2><p>Une fois nous avons attaché la JVM cible, nous allons créer un point d&#8217;arrêt. Celui ci est lié à la levée des exceptions &laquo;&nbsp;catchées&nbsp;&raquo; et &laquo;&nbsp;non catchées&nbsp;&raquo;. Nous supposons que nous voulons être alertés pour toutes les exceptions.</p><pre class="brush: java; gutter: true; title: ; notranslate">
public static void createExceptionBreakPoint(VirtualMachine vm) {
        EventRequestManager erm = vm.eventRequestManager();
        List&lt;ReferenceType&gt; referenceTypes = vm.classesByName(&quot;java.lang.Throwable&quot;);
        for (ReferenceType refType : referenceTypes){
  ExceptionRequest exceptionRequest = erm.createExceptionRequest(refType, true, true);
  exceptionRequest.setEnabled(true);
 }
}
</pre><h2><a
name="DRAFT-Legacycode-gestiondesexceptionsavecJPDA-TraitementdesExceptions"></a>Traitement des Exceptions</h2><p>Maintenant que le point d&#8217;arrêt est créé et activé, nous pouvons commencer le traitement des notifications de débogage. Ceci se fait dans une boucle. Nous nous intéressons uniquement aux événements de type ExceptionEvent.</p><p>Notre idée principale est de faire en sorte que l&#8217;exception catchée soit loguée dans un fichier particulier. On peut penser à utiliser printStackTrace(PrintStream ps) ou printStackTrace(PrintWriter pw). Mais dans le programme débogueur nous n&#8217;avons qu&#8217;une image &laquo;&nbsp;miroir&nbsp;&raquo; de la vraie exception lancée dans la JVM cible. Nous pouvons alors faire une invocation distante de la méthode. Ces méthodes prennent en argument chacune un objet. Ceci dit, il nous faut disposer de cet objet dans la JVM cible. Heureusement, il nous est possible de créer des objets dans la JVM cible avec JDI.</p><p>Donc si nous considérons l&#8217;utilisation de printStackTrace(PrintStream ps), nous commençons par créer une chaine de caractère représentant le nom de fichier où nous voulons loguer l&#8217;exception, avant de créer un objet PrintStream. Enfin nous allons invoquer la méthode printStackTrace(PrintStream ps) sur l&#8217;exception catchée.</p><p>Une fois l&#8217;exception loguée, nous pouvant envoyer ce fichier comme pièce jointe d&#8217;un mail (l&#8217;envoi ne fait pas partie de l&#8217;exemple ci-dessous). Dans cet exemple nous nous contentons d&#8217;afficher son contenu.</p><pre class="brush: java; gutter: true; title: ; notranslate">
public static void handleExceptionEvent(ExceptionEvent exceptionEvent) throws Exception {
        ObjectReference remoteException = exceptionEvent.exception();
        ThreadReference thread = exceptionEvent.thread();
        List&lt;Value&gt; paramList = new ArrayList&lt;Value&gt;(1);
        paramList.add(dumpFileName);
        //crer un printStream dans la JVM cible
        ObjectReference printStreamRef = printStreamClassType.newInstance(thread, printStreamConstructor, paramList,
                ObjectReference.INVOKE_SINGLE_THREADED);
        ReferenceType remoteType = remoteException.referenceType();
        Method printStackTrace = (Method) remoteType.methodsByName(&quot;printStackTrace&quot;).get(1);
        paramList.clear();
        paramList.add(printStreamRef);
        remoteException.invokeMethod(thread, printStackTrace, paramList, ObjectReference.INVOKE_SINGLE_THREADED);
        Scanner scanner = new Scanner(new File(dumpFileName.value()));
        while (scanner.hasNextLine()){
  System.out.println(scanner.nextLine());
 }
}
</pre><h2><a
name="DRAFT-Legacycode-gestiondesexceptionsavecJPDA-Conclusion"></a>Conclusion</h2><p>JPDA reste une API peu connue des développeurs Java et ceci malgré les possibilités qu&#8217;elle offre au programmeur. On peut lui reprocher l&#8217;overhead &#8211; dû surtout à la communication inter-processus &#8211; qu&#8217;elle induit dans l&#8217;application. Outre la complexité de son utilisation, beaucoup d&#8217;instructions doivent être écrites pour accomplir une &laquo;&nbsp;simple&nbsp;&raquo; tâche. Dans le prochain article nous verrons comment accomplir la même chose en utilisant l&#8217;API Instrumentation de Java. </p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/12/12/legacy-code-gestion-des-exceptions-avec-jpda/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2011/05/24/revue-de-presse-xebia-212/</link> <comments>http://blog.xebia.fr/2011/05/24/revue-de-presse-xebia-212/#comments</comments> <pubDate>Tue, 24 May 2011 05:59:00 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[JRockIt]]></category> <category><![CDATA[junit]]></category> <category><![CDATA[JUnitParams]]></category> <category><![CDATA[JVM]]></category> <category><![CDATA[rachat]]></category> <category><![CDATA[SAP]]></category> <category><![CDATA[Software AG]]></category> <category><![CDATA[Terracotta]]></category> <category><![CDATA[Tests]]></category> <category><![CDATA[VMWare]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7822</guid> <description><![CDATA[La revue de presse de l’actualité Java/JEE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII La VM d&#8217;Oracle JRockit devient gratuite Terracotta racheté par Software AG Le coin de la technique JUnitParams, un framework pour paramétrer vos méthodes de test Actualité éditeurs / SSII La VM d&#8217;Oracle JRockit devient gratuite Henrik Ståhl, chef de projet [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/JEE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité  éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2011/05/24/revue-de-presse-xebia-212/#LaVMdOracleJRockitdevientgratu">La VM d&#8217;Oracle JRockit devient gratuite</a></li><li><a
href="http://blog.xebia.fr/2011/05/24/revue-de-presse-xebia-212/#TerracottarachetparSoftwareAG">Terracotta racheté par Software AG</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2011/05/24/revue-de-presse-xebia-212/#JUnitParamsunframeworkpourpara">JUnitParams, un framework pour paramétrer vos méthodes de test</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité  éditeurs / SSII</h3><h4><a
name="LaVMdOracleJRockitdevientgratu"></a>La VM d&#8217;Oracle JRockit devient gratuite</h4><p>Henrik Ståhl, chef de projet du produit, <a
href="http://blogs.oracle.com/henrik/entry/jrockit_is_now_free_and" title="l'a annoncé" >l&#8217;a annoncé</a> sur son blog: JRockit devient gratuite. Cette JVM, alternative payante à celle de Sun, fut longtemps propriété de BEA avant son rachat par Oracle. Il y a peu de temps, Oracle proposait encore commercialement ce produit, présenté par exemple dans <a
href="http://indico.cern.ch/getFile.py/access?resId=0&#038;materialId=slides&#038;confId=96236" title="ce document commercial" >ce document commercial</a>.<br
/> JRockit est donc maintenant gratuit, mais on peut noter les point suivant:</p><ul><li>gratuit et non pas <a
href="http://en.wikipedia.org/wiki/Gratis_versus_libre" title="libre" >libre</a>.</li><li>les fonctions <strong>Temps Réel</strong> (permettant de limiter la durée des pauses dues au <em>GC</em> ), <strong>VirtualEdition</strong> (faisant tourner nativement JRockit dans une machine virtuelle, sans OS hôte) et l&#8217;outil <strong>JRockit Mission Control</strong> (console de management, monitoring et profiling) restent payants.</li><li>comme le rappelle Emmanuel Lecharny sur <a
href="http://groups.google.com/group/lescastcodeurs/browse_thread/thread/e0051cb76591dbb/c329d9bcec32ce00?lnk=gst&#038;q=jrockit#anchor_c329d9bcec32ce00" title="le Google Group des Cast Codeurs" >le Google Group des Cast Codeurs</a>, les conditions d&#8217;utilisation sont floues concernant l&#8217;utilisation sur des serveur ou la redistribution.</li></ul><p>En fait, ce passage au gratuit permettra sans doutes à Oracle d&#8217;augmenter le nombre d&#8217;utilisateurs de JRockit et de fluidifier les ajouts de fonctionnalités de ce dernier dans OpenJDK. Il se dit depuis longtemps qu&#8217;Oracle désire disposer à terme d&#8217;une unique base de JVM unifiant le meilleur des mondes des VM Sun et JRockit. Les coûts de maintenance seront diminués alors que le le marché des personnes susceptibles de payer pour les outils ou services additionnels s&#8217;élargira.</p><p>Concrètement, que cela change t&#8217;il ? Nous pouvons tester JRockit. Bien. Dans certains cas d&#8217;utilisation vous noterez une différence par rapport à votre JVM habituelle. Mais avant de vous précipiter, êtes vous sûr d&#8217;avoir commencé par analyser les problèmes venant <a
href="http://blog.xebia.fr/2010/01/27/performance-les-xebians-jouent-les-demineurs/" title="de votre" >de votre</a> <a
href="http://blog.xebia.fr/2010/02/16/performance-les-xebians-jouent-les-demineurs-2/" title="propre" >propre</a> <a
href="http://blog.xebia.fr/2010/04/16/performance-les-xebians-jouent-les-demineurs-3/" title="code" >code</a> ? Il y a fort à parier que vous résolverez plus en l&#8217;étudiant qu&#8217;en changeant de JVM <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /></p><h4><a
name="TerracottarachetparSoftwareAG"></a>Terracotta racheté par Software AG</h4><p>Ari Zilka, son fondateur et CTO, <a
href="http://blog.terracottatech.com/2011/05/terracotta_joins_software_ag.html" title="annonce" >annonce</a> que Terracotta vient d&#8217;être racheté par <a
href="http://en.wikipedia.org/wiki/Software_AG" title="Software AG" >Software AG</a>, un gros du logiciel allemand. Pour mémoire Terracotta avait à l&#8217;origine sa propre solution (décrite en détails chez <a
href="http://www.infoq.com/articles/open-terracotta-intro" title="InfoQ" >InfoQ</a>) de <em>clustering</em>, puis <a
href="http://blog.xebia.fr/2009/08/24/revue-de-presse-xebia-123/#AcquisitiondEhcacheparTerracot" title="avait racheté EhCache" >avait racheté EhCache</a> et enfin <a
href="http://blog.xebia.fr/2009/11/23/revue-de-presse-xebia-135/#TerracottaafaimdOpenSourceacqu" title="Quartz" >Quartz</a> avant de <a
href="http://blog.xebia.fr/2010/09/21/revue-de-presse-xebia-177/#AvecBigMemoryTerracottasedoted" title="sortir Big Memory" >sortir Big Memory</a>.</p><p>L&#8217;annonce est assez convenue: tout le monde doit y trouver son compte, que ce soit la communauté Open Source, les clients actuels et futurs ainsi que toute l&#8217;industrie Java. Bref, tout va bien dans le meilleur des mondes. Comme nous l&#8217;annoncions à l&#8217;époque du rachat d&#8217;EhCache, Terracotta souhaitait se faire racheter. Il aura fallu attendre près de 2 ans, mais Terracotta dispose maintenant d&#8217;un nouvel atout pour faire connaître ses solutions et vendre ses services tout en les intégrant avec les produits de Software AG. En effet, les solutions Paas et de Cloud de Softawre AG doivent s&#8217;appuyer sur les outils de Terracotta.</p><p>Il sera intéressant de voir maintenant le positionnement exact de ce nouveau couple concernant les offres Paas par rapport à VMWare d&#8217;une part et à <a
href="http://www.infoq.com/news/2011/05/sap-hana-appcloud" title="l'offre de SAP" >l&#8217;offre de SAP</a> concernant le <em>BI à la demande</em> d&#8217;autre part. James Governor nous résume assez bien la situation <a
href="http://www.redmonk.com/jgovernor/2011/05/23/software-ag-acquires-terracotta-makes-open-source-developer-play-gears-up-for-in-memory-and-paas/" title="dans cet article" >dans cet article</a>.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="JUnitParamsunframeworkpourpara"></a>JUnitParams, un framework pour paramétrer vos méthodes de test</h4><p>Je suis pratiquement sûr que tous, vous avez déjà écrit une classe de test comme celle-ci :</p><pre class="brush: java; title: ; notranslate">
public class MyFibonnacciTest {
  @Resource
  private Fibonnacci fibonnacci;
  @Test
  public void should_return_2_when_inputs_are_1_and_1() {
    // Given:
    int i = 1;
    int j = 1;
    // When:
    int k = fibonnacci.computeNext(i, j);
    // Then:
    assertThat(k, equalTo(2));
  }
  @Test
  public void should_return_3_when_inputs_are_1_and_2() {
    // Given:
    int i = 1;
    int j = 2;
    // When:
    int k = fibonnacci.computeNext(i, j);
    // Then:
    assertThat(k, equalTo(3));
  }
  // ...
}
</pre><p>C&#8217;est très pratique pour la lisibilité: à la lecture des noms de méthodes, vous savez ce qui est testé. Par contre, il est clair que chaque méthode varie très peu. C&#8217;est là que vous sortez le logiciel <strong>JUnitParams</strong> de votre boite à outils.</p><p>Il vous permet de n&#8217;écrire qu&#8217;une seule fois la méthode et d&#8217;y ajouter, en annotation, vos jeux de données de trois manières différentes:</p><ul><li>simplement en listant les jeux de données. C&#8217;est pratique lorsque les données sont simples et qu&#8217;il n&#8217;y a pas trop de cas:</li></ul><pre class="brush: java; title: ; notranslate">
public class MyFibonnacciTest {
  @Resource
  private Fibonnacci fibonnacci;
  @Test
  @Parameters({&quot;1, 1, 2&quot;,
               &quot;1, 2, 3&quot;,
               &quot;2, 3, 5&quot;})
  public void should_compute_next_fibonnacci_number(int i, int j, int k) {
    assertThat(fibonnacci.computeNext(i, j), equalTo(k));
  }
}
</pre><ul><li>sous forme de méthode si vos jeux de données sont amenés à être réutilisés:</li></ul><pre class="brush: java; title: ; notranslate">
public class MyFibonnacciTest {
  @Resource
  private Fibonnacci fibonnacci;
  @Test
  @Parameters(method = &quot;getParametersForFibonnacciComputer&quot;)
  public void should_compute_next_fibonnacci_number(int i, int j, int k) {
    assertThat(fibonnacci.computeNext(i, j), equalTo(k));
  }
  private Object[] getParametersForFibonnacciComputer() {
    return $( $(1, 1, 2),
              $(1, 2, 3),
              $(2, 3, 5)
            );
  }
}
</pre><ul><li>en créant un provider:</li></ul><pre class="brush: java; title: ; notranslate">
 public class FibonnacciProvider {
  public static Object[] provideFirstThreeFibonnacciNumbers() {
     return $( $(1, 1, 2),
               $(1, 2, 3),
               $(2, 3, 5)
             );
  }
  public static Object[] provideFirstFiveFibonnacciNumbers() {
     return $( $(1, 1, 2),
               $(1, 2, 3),
               $(2, 3, 5),
               $(3, 5, 8),
               $(5, 8, 13)
             );
  }
 }
public class MyFibonnacciTest {
  @Resource
  private Fibonnacci fibonnacci;
  @Test
  @Parameters(source = FibonnacciProvider.class)
  public void should_compute_next_fibonnacci_number(int i, int j, int k) {
    assertThat(fibonnacci.computeNext(i, j), equalTo(k));
  }
}
</pre><p>La version 0.2.0 est sortie le 16 mai dernier. Vous pouvez l&#8217;obtenir à l&#8217;adresse suivante : <a
href="http://code.google.com/p/junitparams/" title="httpcodegooglecompjunitparams" >http://code.google.com/p/junitparams/</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/05/24/revue-de-presse-xebia-212/feed/</wfw:commentRss> <slash:comments>6</slash:comments> </item> <item><title>Rétrospective de notre XKE de janvier</title><link>http://blog.xebia.fr/2011/01/07/retrospective-de-notre-xke-de-janvier/</link> <comments>http://blog.xebia.fr/2011/01/07/retrospective-de-notre-xke-de-janvier/#comments</comments> <pubDate>Fri, 07 Jan 2011 16:03:48 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Backelite]]></category> <category><![CDATA[BkRender]]></category> <category><![CDATA[Cloud / NoSQL]]></category> <category><![CDATA[JVM]]></category> <category><![CDATA[Mémoire]]></category> <category><![CDATA[MongoDB]]></category> <category><![CDATA[Performances]]></category> <category><![CDATA[Play!]]></category> <category><![CDATA[Tests unitaires]]></category> <category><![CDATA[XKE]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=6579</guid> <description><![CDATA[Nous étions tous réunis hier chez Xebia pour le premier XKE (Xebia Knowledge Exchange) de l’année 2011 ! Après nos échanges de vœux pour la nouvelle année et un bon café, la journée commença par deux sessions parallèles : Une présentation de la gestion avancée de la mémoire en Java animée par Pablo Lopez. Ce [...]]]></description> <content:encoded><![CDATA[<p>Nous étions tous réunis hier chez Xebia pour le premier <strong>XKE (Xebia Knowledge Exchange)</strong> de l’année 2011 !</p><p>Après nos échanges de vœux pour la nouvelle année et un bon café, la journée commença par deux sessions parallèles :</p><ul><li>Une présentation de la <strong>gestion avancée de la mémoire en Java</strong> animée par <a
href="http://blog.xebia.fr/author/plopez/" title="Pablo Lopez" >Pablo Lopez</a>. Ce slot se positionnait dans la continuité du <a
href="http://blog.xebia.fr/2010/01/27/performance-les-xebians-jouent-les-demineurs/" title="concours de tuning de performance organis lanne dernire" >concours de tuning de performance organisé l&#8217;année dernière</a>.</li><li>Un <strong>débat autour du concept de DTO</strong> animé par <a
href="http://blog.xebia.fr/author/cleclerc/" title="Cyrille Le Clerc" >Cyrille Le Clerc</a> et <a
href="http://blog.xebia.fr/author/jlmorlhon/" title="JeanLaurent De Morlhon" >Jean-Laurent De Morlhon</a>.</li></ul><p>Ce fut ensuite au tour de <a
href="http://blog.xebia.fr/author/mfiguiere/" title="Michael Figuière" >Michael Figuière</a> de prendre la parole et d’esquisser les <a
href="http://www.slideshare.net/mfiguiere/xebia-knowledge-exchange-jan-2011-trends-in-enterprise-applications-architecture-6473819" title="tendances des architectures de demain  Cloud Elasticit NoSQL Scalabilit etc" >tendances des architectures de demain : Cloud, Elasticité, NoSQL, Scalabilité, etc</a>.<br
/> Cette présentation a donné lieu à des débats animés.</p><p>Après un copieux déjeuner, nous avons accueilli <a
href="http://fr.linkedin.com/in/sarlandie" title="Thomas Sarlandie" >Thomas Sarlandie</a>, CTO de <a
href="http://www.backelite.com/" title="Backelite" >Backelite</a>, qui nous a présenté leur solution de développement de services mobiles BkRender. Ce framework sera d&#8217;ailleurs testé lors de nos prochains XKE face à des alternatives comme JQuery Mobile, Flex pour Mobile, etc.</p><p>L&#8217;après midi s&#8217;est poursuivie par une présentation du <a
href="http://moreunit.sourceforge.net/" title="plugin More Unit pour Eclipse" >plugin More Unit pour Eclipse</a> par <a
href="http://blog.xebia.fr/author/ndemengel/" title="Nicolas Demengel" >Nicolas Demengel</a>, contributeur sur le projet.</p><p><a
href="http://blog.xebia.fr/author/ealliaume/" title="Erwan Alliaume" >Erwan Alliaume</a> a ensuite animé un Hands On autour du framework Play!.</p><p>La journée s’est achevée par un retour d&#8217;expérience sur la mise en place de MongoDB / Amazon EC2 / S3 par <a
href="http://blog.xebia.fr/author/karesti/" title="Katia Aresti" >Katia Aresti</a> et <a
href="http://blog.xebia.fr/author/jlmorlhon/" title="Jean-Laurent De Morlhon" >Jean-Laurent De Morlhon</a> (Cf. <a
href="http://blog.xebia.fr/2010/12/15/mongodb-en-pratique/" title="MongoDB en pratique" >MongoDB en pratique</a>).</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/01/07/retrospective-de-notre-xke-de-janvier/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2010/07/13/revue-de-presse-xebia-167/</link> <comments>http://blog.xebia.fr/2010/07/13/revue-de-presse-xebia-167/#comments</comments> <pubDate>Tue, 13 Jul 2010 05:45:49 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Android]]></category> <category><![CDATA[Devoxx]]></category> <category><![CDATA[JDuchess]]></category> <category><![CDATA[JVM]]></category> <category><![CDATA[Kanban]]></category> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[SCRUM]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=5022</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Agilité L&#8217;agilité à la sauce Pixar Evitez le multi-tâches dans les équipes de développement Le coin de la technique Développez vos applications Android sans écrire une ligne de code Mettez à jour votre JVM Evènements de notre communauté en France et à l&#8217;étranger Le [...]]]></description> <content:encoded><![CDATA[<p><img
style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Agilité</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/07/13/revue-de-presse-xebia-167/#LagilitlasaucePixar">L&#8217;agilité à la sauce Pixar</a></li><li><a
href="http://blog.xebia.fr/2010/07/13/revue-de-presse-xebia-167/#Evitezlemultitchesdanslesquipe">Evitez le multi-tâches dans les équipes de développement</a></li></ul><p><strong>Le coin de la  technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/07/13/revue-de-presse-xebia-167/#DveloppezvosapplicationsAndroi">Développez vos applications Android sans écrire une ligne de code </a></li><li><a
href="http://blog.xebia.fr/2010/07/13/revue-de-presse-xebia-167/#MettezjourvotreJVM">Mettez à jour votre JVM</a></li></ul><p><strong>Evènements  de notre communauté en France et à l&#8217;étranger</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/07/13/revue-de-presse-xebia-167/#LeprogrammeduDevoxxsedvoile">Le programme du Devoxx 2010 se dévoile</a></li></ul><h3><a
name="Agilit"></a>Agilité</h3><h4><a
name="LagilitlasaucePixar"></a>L&#8217;agilité à la sauce Pixar</h4><p>C&#8217;est une question d&#8217;actualité avec la sortie de Toy Story 3 : mais comment Pixar fait-il pour cartonner à chaque nouveau film ? <a
title="InfoQ lve une partie du voile" href="http://www.infoq.com/news/2010/07/consistency-trust">InfoQ lève une partie du voile</a> : la cohérence construit la confiance. Derrière cette maxime &#8216;à l&#8217;américaine&#8217; se cache un processus créatif original : Pixar construit des équipes pluri-disciplinaires, qui travaillent ensemble (éventuellement durant plusieurs films) et qui créent des liens de confiance inaliénables. Chaque jour, l&#8217;équipe se réunit pour discuter du travail effectué la veille : critiques, remises en cause, les équipes travaillent dans un processus d&#8217;amélioration constante. Chaque membre de l&#8217;équipe est encouragé à donner son avis, même ses membres les plus juniors.<br
/> Ce mode de fonctionnement laisse la place à l&#8217;erreur. Comme chacun est impliqué, chacun peut se tromper. Les erreurs sont mêmes une des clés du processus créatif. L&#8217;essentiel est de se tromper rapidement, pour pouvoir corriger le tir.</p><p>Changez maintenant de point de vue, et regardez cet article sous l&#8217;angle du développement logiciel. N&#8217;y retrouve t&#8217;on pas un fort goût d&#8217;agilité ?</p><h4><a
name="Evitezlemultitchesdanslesquipe"></a>Evitez le multi-tâches dans les équipes de développement</h4><p>Toujours sur <a
title="Toujours sur InfoQ" href="http://www.infoq.com/articles/multitasking-problems">InfoQ</a>, Roger Brown nous met en garde contre les méfaits du traitement simultané de projets (tâches, user stories &#8230;) par une personne.<br
/> Le changement de contexte lorsque l&#8217;on passe d&#8217;une tâche à l&#8217;autre peut prendre plus ou moins de temps en fonction de la complexité de la tâche, du temps et de la nature de l&#8217;interruption. Le traitement d&#8217;un appel téléphonique, par exemple, pourra engendrer un délai d&#8217;un quart d&#8217;heure pour se remettre dans le contexte de la tâche précédente. D&#8217;autres types d&#8217;interruptions (travail sur une autre tâche de développement par exemple) peuvent nous faire perdre beaucoup plus de temps.<br
/> L&#8217;auteur nous explique que le travail en parallèle sur plusieurs projets implique généralement un surcoût induit par les changements de contexte pouvant représenter de 20% à plus de 50% du temps de travail lorsque nous travaillons simultanément sur plus de deux projets. Il est donc préférable de terminer une tâche (User Story par exemple) avant d&#8217;en commencer une autre, plutôt que de fragmenter son travail.<br
/> Les méthodes agiles comme Scrum ou le Kanban préconisent un nombre limité de User Stories ou de tâches en cours, et de ne pas en commencer une autre avant d&#8217;avoir atteint le statut &laquo;&nbsp;Done&nbsp;&raquo;.<br
/> Le cerveau humain ayant tendance à vouloir traiter plusieurs tâches en parallèle, Roger Brown préconise quelques techniques telles que le pair-programming afin d&#8217;aider les développeurs à rester concentrés sur leur tâche et à gagner ainsi en efficacité.<br
/> On peut aussi citer le <a
title="pomodoro" href="http://www.pomodorotechnique.com/">pomodoro</a> qui est une discipline consistant à se ménager un laps de temps de 25 minutes sans interruption, permettant de se focaliser sur une tâche et ainsi de gagner en efficacité.<br
/> L&#8217;auteur conclut en ajoutant que non seulement le traitement séquentiel des projets (tâches, user stories &#8230;) permet de gagner du temps, mais il permet aussi de créer des synergies entre les différents membres de l&#8217;équipe qui peuvent ainsi travailler de concert sur le projet.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la  technique</h3><h4><a
name="DveloppezvosapplicationsAndroi"></a>Développez vos applications Android sans écrire une ligne de code</h4><p>Google Labs vient d&#8217;annoncer l&#8217;arrivée d&#8217;App Inventor, un éditeur d&#8217;applications pour Android destiné aux non-développeurs. L&#8217;objectif est de permettre à tout androphile de <strong>dessiner</strong> sa propre application depuis le logiciel, puis de la transférer sur son smartphone.</p><blockquote><p><em>To use App Inventor, you do not need to be a developer. App Inventor requires NO programming knowledge. This is because instead of writing code, you visually design the way the app looks and use blocks to specify the app&#8217;s behavior.</em></p></blockquote><div><img
src="http://blog.xebia.fr/wp-content/uploads/2010/07/GAppInventor.png" border="0" alt="" /></div><p>Pour le moment, il n&#8217;est pas possible de s&#8217;inscrire. Vous pouvez seulement montrer votre intérêt en remplissant un formulaire dans lequel vous exprimerez votre enthousiasme pour l&#8217;utilisation d&#8217;AppInventor dans un cadre universitaire. Si vous n&#8217;avez rien à voir avec quelconque formation, vous pouvez toujours laisser les réponses vides.</p><p>En épluchant le site, on constate la forte volonté d&#8217;installer cet éditeur dans le monde universitaire, voire scolaire. En effet, il est fait mention à plusieurs reprises des possibilités de développements de jeux, d&#8217;applications communautaires ou d&#8217;outils d&#8217;interaction entre étudiants. Malgré tout, Google n&#8217;oublie les autres&#8230; le particuliers lambda, ou le collègue que nous sommes en précisant:</p><blockquote><p><em>The App Inventor team has created blocks for just about everything you can do with an Android phone, as well as blocks for doing &laquo;&nbsp;programming-like&nbsp;&raquo; stuff.</em></p></blockquote><p>Nous nous posons tout de même quelques questions à ce sujet:</p><ul><li>Google préfèrerait-il que nous apprenions à utiliser son logiciel plutôt qu&#8217;écrire du code <span
style="text-decoration: line-through;">propre</span> personnalisé?</li><li>Ne se cache-t-il pas un envie de maîtriser le code généré? (en y ajoutant des statistiques par exemple&#8230;)</li><li>N&#8217;y a-t-il pas un risque de voir proliférer sur le market des applications réalisées en 5 minutes, pleines de pubs et pauvres sur les plans fonctionnel et graphique? (comme HelloPurr, cf. <a
title="vido de dmo" href="http://www.youtube.com/watch?v=8ADwPLSFeY8&amp;feature=player_embedded">vidéo de démo</a>)</li></ul><p>Le futur nous le dira&#8230;</p><p>Du côté de la technique, les outils utilisés sont <a
title="OpenBlocks" href="http://dspace.mit.edu/handle/1721.1/41550">OpenBlocks</a> et <a
title="Kawa Language Framework" href="http://www.gnu.org/software/kawa/">Kawa Language Framework</a>. Le premier est le fruit de la thèse de Ricarose Roque (MIT) : une librairie Java permettant de programmer des systèmes à l&#8217;aide de blocs visuels. Le second est utilisé par le compilateur pour traduire en bytecode les blocs graphiques.</p><p>En attendant d&#8217;avantage d&#8217;informations et pourquoi pas un article plus complet sur l&#8217;outil, vous trouverez déjà quelques tutoriaux sur le site.</p><p>source : <a
title="site de lditeur" href="http://appinventor.googlelabs.com/about/">site de l&#8217;éditeur</a></p><h4><a
name="MettezjourvotreJVM"></a>Mettez à jour votre JVM</h4><p>Après une dernière release qui corrigeait un <a
title="problème de sécurité" href="http://blog.xebia.fr/2010/04/19/revue-de-presse-xebia-155/#FailledescuritdansOracleJava">problème de sécurité</a>, Oracle nous invite à <a
title="télécharger" href="http://java.sun.com/javase/downloads/index.jsp">télécharger</a> la release 21 qui, outre la correction de <a
title="bugs" href="http://java.sun.com/javase/6/webnotes/BugFixes6u21.html">bugs</a> (mais pas de correction liée à la sécurité), apporte des améliorations sur la JVM HotSpot et VisualVM.</p><p>Sur la Java HostSpot VM, les améliorations portent sur la compression des pointeurs d&#8217;objets, <em>escape analysis</em> (qui améliore la gestion des piles), la gestion du cache sur le byte code, sur le garbage collector CMS (Concurrent Mark-Sweep) et G1. Pour rappel, G1 est le nouveau garbage collector en préparation pour la JDK 7 mais déjà utilisable dans la version 6 depuis la release 17. Pour l&#8217;activer il faut passer les options <code>-XX:+UnlockExperimentalVMOptions -XX:+UseG1GC</code>.</p><p>La version 1.2.2 de VisualVM, sortie il y a quelques mois, est à présent incluse dans la distribution de Java SE. Elle apporte beaucoup d&#8217;améliorations sur l&#8217;analyse de la mémoire et sur le profilage.</p><p>Enfin pour les développeurs de RIA java, un <em>listener</em> a été ajouté pour suivre l&#8217;évolution du chargement de l&#8217;application. Plus de détails <a
title="ici" href="http://download.oracle.com/docs/cd/E17409_01/javase/tutorial/deployment/doingMoreWithRIA/customizeRIALoadingExperience.html">ici</a>.</p><h3><a
name="EvnementsdenotrecommunautenFra"></a>Evènements  de notre communauté en France et à l&#8217;étranger</h3><h4><a
name="LeprogrammeduDevoxxsedvoile"></a>Le programme du Devoxx 2010 se dévoile</h4><p>J&#8217;espère que vous avez créé une règle sur votre outil de mailing préféré qui décline toute demande de réunion sur la période du 15 au 19 novembre 2010 car c&#8217;est &#8230; Devoxx!<br
/> À moins d&#8217;être parti 8 ans en mission dans l&#8217;océan arctique sur un brise glace, vous ne pouvez pas ne pas connaître Devoxx. C&#8217;est LA conférence européenne spécialisée sur LA technologie (i.e. Java) qui se déroule tous les ans à Anvers en Belgique.</p><p>Tout le gratin des meilleurs speakers et spécialistes sera présent dont certains français: Antonio Goncalves, Guillaume Laforge, Emmanuel Bernard pour ne citer qu&#8217;eux, mais aussi des incontournables comme Heinz Kabutz, John Smart ou bien Michael Cote.<br
/> Mais ce n&#8217;est pas tout! En effet, un BoF (<a
title="Bird of Feather" href="http://en.wikipedia.org/wiki/Birds_of_a_Feather_(computing)">Bird of Feather</a>) organisé par les JDuchess se prépare.</p><p>Le programme commence à prendre forme. Vous pouvez commencer à saliver sur des conférences plus intéressantes les unes que les autres avec quelques titres accrocheurs:</p><ul><li>JAX-RS, Java EE 6, and the future,</li><li>Reflection Madness,</li><li>Improve the performance of your Spring app,</li><li>HTML 5 Fact and Fiction,</li><li>Comparing JVM Web Frameworks,</li><li>Groovy update, ecosystem, and skyrocketing to the cloud with App Engine and Gaelyk,</li><li>Restfulie: quit pretending, use the web for real,</li><li>Women in IT an unconference,</li><li>etc.</li></ul><p>Dans le programme de cette année, c&#8217;est surtout la présence de plus d&#8217;une dizaine de sessions dédiées aux technologies NoSQL et Cloud que l&#8217;on retiendra. On se souvient en effet que l&#8217;édition 2009 de cette conférence n&#8217;avait proposé qu&#8217;une trop courte session d&#8217;introduction à NoSQL suivie d&#8217;un BOF. Cette augmentation sensible de la part accordée à ces technologies témoigne de leur popularité croissante en 2010. Une fois de plus Devoxx s&#8217;affirme comme le baromètre de notre écosystème !</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/07/13/revue-de-presse-xebia-167/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2010/03/01/revue-de-presse-xebia-149/</link> <comments>http://blog.xebia.fr/2010/03/01/revue-de-presse-xebia-149/#comments</comments> <pubDate>Mon, 01 Mar 2010 18:25:17 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[closures]]></category> <category><![CDATA[Cloud / NoSQL]]></category> <category><![CDATA[Hotspot]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JDK]]></category> <category><![CDATA[JEE]]></category> <category><![CDATA[Jigsaw]]></category> <category><![CDATA[JRockIt]]></category> <category><![CDATA[JVM]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[OpenJDK]]></category> <category><![CDATA[Sonatype]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4116</guid> <description><![CDATA[La revue de presse de l&#8217;actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Sonatype ouvre son dépôt maven pour java.net La fusion JRockIt / Hotspot pas pour demain Agilité Utilisez-vous des métriques intelligentes sur vos projets ? Le coin de la technique Jigsaw, les modules du pauvre ? Comment les closures seront implémentées [...]]]></description> <content:encoded><![CDATA[<p><img
style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" /><br
/> <em>La revue de presse de l&#8217;actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/03/01/revue-de-presse-xebia-149/#Sonatypeouvresondptmavenpourja">Sonatype ouvre son dépôt maven pour java.net</a></li><li><a
href="http://blog.xebia.fr/2010/03/01/revue-de-presse-xebia-149/#LafusionJRockItHotspotpaspourd">La fusion JRockIt / Hotspot pas pour demain</a></li></ul><p><strong>Agilité</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/03/01/revue-de-presse-xebia-149/#Utilisezvousdesmtriquesintelli">Utilisez-vous des métriques intelligentes sur vos projets ?</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/03/01/revue-de-presse-xebia-149/#Jigsawlesmodulesdupauvre">Jigsaw, les modules du pauvre ?</a></li><li><a
href="http://blog.xebia.fr/2010/03/01/revue-de-presse-xebia-149/#Commentlesclosuresserontimplme">Comment les <em>closures</em> seront implémentées dans OpenJDK 7 ?</a></li><li><a
href="http://blog.xebia.fr/2010/03/01/revue-de-presse-xebia-149/#LactualitdesbasesdedonnesNoSQL">L&#8217;actualité des bases de données NoSQL toujours aussi riche</a></li><li><a
href="http://blog.xebia.fr/2010/03/01/revue-de-presse-xebia-149/#Astucedelasemainercuprezlalist">Astuce de la semaine, récupérez la liste complète des options de votre JVM</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="Sonatypeouvresondptmavenpourja"></a>Sonatype ouvre son dépôt maven pour java.net</h4><p>L&#8217;idée est venue d&#8217;une quantité toujours grandissante de plaintes sur les dépôts Maven fournis par java.net. A l&#8217;heure de la fusion annoncée entre Kenai et java.net, Kenai n&#8217;a aucune solution pour gérer les dépôts et java.net fait mauvaise presse sur ce point. Il n&#8217;aura pas fallu longtemps à Sonatype pour saisir l&#8217;opportunité de mettre en avant sa solution Nexus. L&#8217;éditeur propose donc à tous les projets java.net de migrer vers leur instance Nexus OSS, allant même jusqu&#8217;à organiser le 5 mars une grande journée migration, avec la mise à disposition pour tous des services de conseil et d&#8217;ingénierie interne. Outre la performance et la stabilité du dépôt Maven maintenu par Sonatype, Nexus génère des fichiers d&#8217;index utilisés par nos IDE pour rechercher les dépendances de nos POM.</p><ul><li><a
title="La nouvelle sur DZone" href="http://java.dzone.com/news/sonatype-free-maven-repo">La nouvelle sur DZone</a></li><li><a
title="Lannonce sur le blog Sonatype" href="http://www.sonatype.com/people/2010/02/java-net-maven-repository-rescue-mission-on-march-5th/">L&#8217;annonce sur le blog Sonatype</a></li></ul><h4><a
name="LafusionJRockItHotspotpaspourd"></a>La fusion JRockIt / Hotspot pas pour demain</h4><p><a
title="Nous en parlions il y a quelques semaines" href="http://blog.xebia.fr/2010/02/01/revue-de-presse-xebia-145/">Nous en parlions il y a quelques semaines</a>, Oracle envisage de ne proposer à l&#8217;avenir qu&#8217;une seule JVM, qui tirerait le meilleur des deux que la firme s&#8217;est offert (JRockit via BEA, et Hotpsot via Sun). Dans un récent <a
title="webcast" href="https://channelsun.sun.com/media/show/15028">webcast</a> (via InfoQ), Mark Reinhold s&#8217;est exprimé sur le sujet. Cette fusion n&#8217;est pas pour tout de suite : trop de clients utilisent les fonctionnalités spécifiques à l&#8217;une ou l&#8217;autre des JVMs en production, et il serait risqué de les forcer à migrer vers une version fusionnée bancale. Ce dernier se dit jaloux de certaines fonctionnalités de JRockIt et donc particulièrement excité d&#8217;avoir l&#8217;occasion de l&#8217;étudier en profondeur. Cependant, ce qui transparait dans son discours (et peut être via nos diverses expérience), c&#8217;est que la JVM de Sun est en avance sur celle de BEA. La prochaine version fusionnée devrait donc tendre plus vers Hotspot que vers JRockit. En résumé rapide, cette future VM Oracle devrait avoir les fonctionnalités <em>runtime</em> de Hotspot, et le <em>garbage collector</em> et la robustesse de JRockit. Finalement, à part l&#8217;ébauche d&#8217;une <em>timeline</em>, nous ne sommes pas beaucoup plus avancés.<br
/> Coté nouveautés du JDK 7, Mark Reinhold se dit aussi particulièrement excité par l&#8217;intégration du projet Coin (au contraire de la grande majorité des consultants Xebia, qui trouvent que la plupart de ces évolutions syntaxiques confinent au gadget).<br
/> Il reparle aussi des <em>closures</em>, principalement sous l&#8217;angle des raisons de la polémique, mais personne ne semble réellement savoir comment elles seront implémentées dans le JDK 7 (voir ci-dessous pour l&#8217;avancement du projet Lambda).<br
/> Dernière annonce, pour ceux qui comme lui sont impatients de voir une JVM enfin modulaire (aka Jigsaw, prévu dans le JDK 7, voir ci-dessous), ils devraient en avoir un aperçu mi-mars, avec la <em>release</em> 88 de l&#8217;OpenJDK.</p><p>Certains noteront avec un certain amusement (ou une certaine nostalgie) quelques ratés : <em>&laquo;&nbsp;We, at Sun&#8230;&nbsp;&raquo;</em></p><h3><a
name="Agilit"></a>Agilité</h3><h4><a
name="Utilisezvousdesmtriquesintelli"></a>Utilisez-vous des métriques intelligentes sur vos projets ?</h4><p><a
title="Mike Griffiths" href="http://leadinganswers.typepad.com/leading_answers/2010/02/smart-metrics-slides.html">Mike Griffiths</a>, agiliste expérimenté et bloggeur actif, nous présente sa réflexion sur l&#8217;utilisation des métriques dans un projet.<br
/> Au préalable,  Mike nous prévient que :</p><ul><li>Toutes les observations ne sont pas utiles et d&#8217;une grande aide pour analyser et comprendre un phénomène. Elles peuvent même amener à de mauvaises conclusions.</li><li>Certaines mesures très utiles ne sont pas facilement observables.</li></ul><p>Une autre caractéristique à ne pas négliger est <strong>l&#8217;effet Hawthorne</strong> :  L&#8217;observateur influence la mesure. On retrouve d&#8217;ailleurs ce phénomène en physique quantique. Mike nous explique alors que le fait d&#8217;observer et donc d&#8217;influencer la mesure,  à un effet <strong>positif</strong>.</p><p>Pour lui, une métrique « intelligente » doit avoir les caractéristiques suivantes :</p><ul><li>Simple et auto-générée.</li><li>Influence de manière significative ce que l&#8217;on cherche à observer.</li><li>Permet de prendre des décisions et décrire des tendances pour le futur.</li></ul><p>Mike nous conseille de donner plus d&#8217;attention aux métriques  permettant d&#8217;observer des tendances futures et d&#8217;anticiper.</p><p>On peut ainsi opposer aux vieilles métriques :  nombres de lignes codées,  points de fonctions réalisés ou nombres d&#8217;heures travaillées ;  des métriques plus « intelligentes » : confiance des sponsors, satisfaction client, nombre de fonctionnalités réalisées,  ou encore temps passé à la correction de bugs.</p><p>Dans la dernière partie de l&#8217;article sont présentés un certain nombre de métriques plus ou moins connues des agilistes, comme : le <em>taskboard</em> de <em>Scrum</em> ou <em>Kanban</em>. L&#8217;utilisation de métriques intelligentes est indispensable pour mener à bien un projet. Elles permettent d&#8217;observer des tendances, d&#8217;identifier et d&#8217;anticiper des problèmes; et ainsi, de prendre les bonnes décisions.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="Jigsawlesmodulesdupauvre"></a>Jigsaw, les modules du pauvre ?</h4><p><a
title="Adam Bien" href="http://www.adam-bien.com/inhalte/about/index.htm">Adam Bien</a> est l&#8217;un des <a
title="Java champions" href="https://java-champions.dev.java.net/">Java champions</a> les plus visibles et les plus lus d&#8217;internet. Il a publié cette semaine un petit article au titre accrocheur : « <a
title="Jigsaw  JDK 17 sera une solution qui permettra  de rpondre  80 des besoins de modularit" href="http://www.adam-bien.com/roller/abien/entry/jigsaw_jdk_1_7_will">Jigsaw / JDK 1.7 sera une solution qui permettra de répondre à 80% des besoins de modularité</a> ». Vous avez probablement suivi les différents épisodes et rebondissements de la modularité dans le JDK 7. C&#8217;est peut-être l&#8217;occasion de faire le point sur ce que propose Jigsaw.</p><p>Le projet <a
title="Jigsaw" href="http://openjdk.java.net/projects/jigsaw/">Jigsaw</a> proposera une implémentation permettant la mise en place d&#8217;un système de modules bas niveau pour vos projets. Il sera également utilisé en interne pour découper le JDK Oracle/Sun lui-même.</p><ul><li>Jigsaw vous permettra  de choisir <strong>tout ou partie</strong> du JDK tout en restant 100% rétro-compatible, d&#8217;améliorer les temps de démarrage de la JVM et son utilisation mémoire.</li><li>Jigsaw  pourra être utilisé <strong>directement</strong> sur vos projets si vous disposez d&#8217;une JVM reposant sur ce système. Jigsaw sera chargé avant <code>rt.jar</code> et sera donc disponible à quiconque désirant l&#8217;utiliser. Ce projet étant open source, il sera également possible de réutiliser celui-ci dans d&#8217;autres contextes.</li><li>Jigsaw vous permettra de rendre vos applications modulaires <strong>progressivement</strong>. Nul besoin de migrer vos applications dans leur ensemble pour tirer parti des bénéfices de la modularité. Un même <em>package</em> peut être éclaté dans plusieurs modules.</li><li>Contrairement à OSGi, Jigsaw ne vous permet pas le rechargement de modules à chaud. Vos modules sont chargés <strong>statiquement</strong> au démarrage de vos applications.</li><li>Tous vos modules sont chargés dans <strong>un même classloader</strong>, cela permet de simplifier grandement son utilisation. Du même coup, il vous sera probablement possible de &#8216;tricher&#8217; en chargeant, au runtime,  des classes d&#8217;un module sans que vous en ayez réellement le droit.</li></ul><p>Si vous confondiez modularité du JDK avec OSGi, cette liste vous a certainement ouvert les yeux :  Jigsaw vous propose une solution beaucoup moins fournie qu&#8217;OSGi.</p><p>Dans les faits, ce projet a été créé, avant tout, pour casser  notre bon vieux JDK monolithique. Bon nombre de polémiques ont été faites sur ce choix. Pourquoi  se contenter d&#8217;aborder 80% des problématiques de la modularisation avec une nouvelle solution alors qu&#8217;OSGi en aborderait 90% ? La simplicité et la souplesse d&#8217;utilisation ont été préférées à une solution décrite comme lourde (nécessitant beaucoup de glue), vieillissante (datant de 1998) et difficile à maîtriser. Ce choix a été sans conteste difficile à effectuer, il s&#8217;est ailleurs attiré les foudres des défenseurs d&#8217;OSGi, mais reste complètement défendable.</p><h4><a
name="Commentlesclosuresserontimplme"></a>Comment les <em>closures</em> seront implémentées dans OpenJDK 7 ?</h4><p>Fin 2009, le projet Lambda, dont le but est d&#8217;apporter les <em>closures</em> à la prochaine version de Java, <a
title="apparaissait au sein d'OpenJDK" href="http://blog.xebia.fr/2009/12/14/revue-de-presse-xebia-138/#LeprojetLambdaapparatauseindOp">apparaissait au sein d&#8217;OpenJDK</a>. Le lancement du projet faisait suite <a
title="aux rebondissements" href="http://blog.xebia.fr/2009/11/23/revue-de-presse-xebia-135/#JDKJEEetMavenlesannoncesdeDevo">aux rebondissements</a> dans l&#8217;actualité du JDK 7 lors de la conférence Devoxx un mois auparavant. Une <a
title="documentation" href="http://cr.openjdk.java.net/~mr/lambda/straw-man/">documentation</a> montrant la syntaxe des <em>closures</em> avait accompagné la création du projet, plus tard, un <em>draft</em> d&#8217;une <a
title="spcification plus formelle" href="http://mail.openjdk.java.net/pipermail/lambda-dev/attachments/20100212/af8d2cc5/attachment-0001.txt">spécification plus formelle</a> est apparue, mais <em>quid</em> de l&#8217;implémentation ?<br
/> Rémi Forax, contributeur au projet Lambda, <a
title="a mis à disposition" href="http://weblogs.java.net/blog/forax/archive/2010/02/22/fosdem-presentations">a mis à disposition</a> la présentation qu&#8217;il a faite au FOSDEM&#8217;10, dans laquelle il résume <a
title="les discussions" href="http://mail.openjdk.java.net/pipermail/lambda-dev/2009-December/thread.html">les discussions</a> ayant eu lieu sur la <em>mailing list</em> du projet concernant les possibilités d&#8217;implémentation :</p><ul><li>Convertir les <em>closures</em> en classes anonymes. Cette solution présente l&#8217;inconvénient de produire beaucoup de classes et pose problème pour certaines constructions liées au <em>closures</em>.</li><li>Convertir les <em>closures</em> en invocations dynamiques telles que le permettra la <a
title="JSR-292 (Supporting Dynamically Typed Languages on the Java Platform)" href="http://www.jcp.org/en/jsr/detail?id=292">JSR-292 (Supporting Dynamically Typed Languages on the Java Platform)</a>. Cette solution ne produit pas de classes supplémentaires et bénéficie de bonnes performances puisque l&#8217;invocation dynamique présentera un temps d&#8217;exécution similaire aux invocations de méthode classiques.</li></ul><p>Le reste de ses <em>slides</em> présente certaines des problématiques d&#8217;implémentations des <em>closures</em> liées à l&#8217;accès aux variables locales et aux champs de la classe hôte.</p><h4><a
name="LactualitdesbasesdedonnesNoSQL"></a>L&#8217;actualité des bases de données NoSQL toujours aussi riche</h4><p>Depuis plusieurs mois maintenant le mouvement NoSQL <a
title="s'est installé dans l'actualité" href="http://blog.xebia.fr/2009/11/09/revue-de-presse-xebia-133/#LemouvementNoSQLdiviseetintrig">s&#8217;est installé dans l&#8217;actualité</a>. A Paris, le <a
title="NoSQL User Group" href="https://sites.google.com/a/octo.com/nosql/home">NoSQL User Group</a> a attiré l&#8217;attention en réunissant une cinquantaine de personnes à chacune de ses 2 sessions jusqu&#8217;à présent.</p><p>D&#8217;un point de vue plus général, l&#8217;actualité des bases de données NoSQL est marquée par l&#8217;intérêt croissant qu&#8217;elles suscitent, et par leur évolution rapide grâce à l&#8217;effort soutenu de leurs développeurs. Ainsi on a pu noter récemment :</p><ul><li><a
title="Neo4j" href="http://neo4j.org/">Neo4j</a>, une base de données orienté graphe, est maintenant <a
title="disponible en version 10 finale" href="http://news.neo4j.org/2010/02/neo4j-10-released.html">disponible en version 1.0 finale</a>. L&#8217;intérêt de la représentation en graphe est la possibilité de modéliser les données relatives aux réseaux sociaux, mais également tout type d&#8217;objets qui seraient liés entre eux de manière arbitraire. De plus, il est possible d&#8217;appliquer à ces données divers algorithmes de graphe classiques tels que la détermination du plus court chemin entre deux objets ou de l&#8217;objet central/majeur dans un nuage d&#8217;élément.</li><li><a
title="Cassandra" href="http://incubator.apache.org/cassandra/">Cassandra</a> vient pour sa part d&#8217;être publié en version 0.5.1, et connait un succès tout particulier puisque Twitter vient d&#8217;annoncer qu&#8217;il l&#8217;utiliserait désormais comme solution de persistance en remplacement de MySQL. Par ailleurs le projet <a
href="http://github.com/tjake/Lucandra">Lucandra</a> a été créé récemment pour permettre d&#8217;utiliser Cassandra comme solution de persistance pour les indexes Lucene. Donné à la Fondation Apache par Facebook, Cassandra est pour rappel un hybride entre BigTable de Google et Dynamo d&#8217;Amazon.</li><li><a
title="HBase" href="http://hadoop.apache.org/hbase/">HBase</a> profite d&#8217;une communauté très active et d&#8217;un intérêt important, renforcé par sa position de sous-projet du <a
title="très populaire Hadoop" href="http://blog.xebia.fr/2009/06/15/revue-de-presse-xebia-113/#YahoodistribueHadoop">très populaire Hadoop</a>. Sematext vient de publier un <a
title="&lt;i&gt;digest&lt;/i&gt; de l'actualité récente" href="http://blog.sematext.com/2010/02/28/hbase-digest-february-2010/"><em>digest</em> de l&#8217;actualité récente</a> de ce projet. Celle-ci est principalement marquée par le développement d&#8217;une <a
title="réplication &lt;i&gt;multi datacenter&lt;/i&gt;" href="https://issues.apache.org/jira/browse/HBASE-1295">réplication <em>multi datacenter</em></a>, par l&#8217;arrivée d&#8217;un <a
title="plugin DataNucleus pour HBase" href="http://www.datanucleus.org/plugins/store.hbase.html">plugin DataNucleus pour HBase</a> et par la disponibilité prochaine d&#8217;une solution de <a
title="benchmark pour les cloud storages" href="http://www.brianfrankcooper.net/pubs/ycsb.pdf"><em>benchmark</em> pour les <em>cloud storages</em></a> développée par Yahoo!.</li></ul><p>Enfin, deux conférences entièrement dédiées au NoSQL sont à venir : <a
title="NoSQL Live" href="http://nosqlboston.eventbrite.com/">NoSQL Live</a> le 11 mars à Boston et, plus proche de nous, <a
title="NoSQL Europe" href="http://nosqleu.com/">NoSQL Europe</a> du 20 au 22 avril à Londres.</p><h4><a
name="Astucedelasemainercuprezlalist"></a>Astuce de la semaine, récupérez la liste complète des options de votre JVM</h4><p>Cette astuce est complètement inutile, et donc également complètement indispensable. <a
title="Cet article" href="http://representz.blogspot.com/2010/02/get-complete-list-of-all-possible-jvm.html">Cet article</a> nous propose une petite commande permettant de récupérer la liste complète des options de votre JVM Hotspot à partir de sa library native Linux, la voici :</p><pre class="brush: java; title: ; notranslate">
prompt$  strings $JAVA_HOME/jre/lib/amd64/server/libjvm.so | grep -B646 assert_null$ | grep -v '{' | grep -v '&amp;amp;' | grep -v '/' | grep -v '%' | grep -v assert_null
</pre>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/03/01/revue-de-presse-xebia-149/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Revue de presse</title><link>http://blog.xebia.fr/2009/09/21/revue-de-presse-xebia-127/</link> <comments>http://blog.xebia.fr/2009/09/21/revue-de-presse-xebia-127/#comments</comments> <pubDate>Mon, 21 Sep 2009 17:35:00 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Flex]]></category> <category><![CDATA[Google]]></category> <category><![CDATA[ibeans]]></category> <category><![CDATA[JEE]]></category> <category><![CDATA[JVM]]></category> <category><![CDATA[memcached]]></category> <category><![CDATA[Mule]]></category> <category><![CDATA[MySQL]]></category> <category><![CDATA[Noop]]></category> <category><![CDATA[OSGi]]></category> <category><![CDATA[REST]]></category> <category><![CDATA[Saros]]></category> <category><![CDATA[scala]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=2869</guid> <description><![CDATA[La revue de presse de l’actualitéava/J2EE hebdomadaire proposépar Xebia. Actualité éditeurs / SSII Google lance son langage pour la JVM iBeans : la solution d&#8217;intégration pour applications Web de MuleSoft Agilité Pair programming à distance sous Eclipse avec Saros SOA L&#8217;initiative REST-* fait débat Le coin de la technique OSGi 4.2 Scala OSGi-fié Astuces de [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualitéava/J2EE hebdomadaire proposépar Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/09/21/revue-de-presse-xebia-127/#GooglelancesonlangagepourlaJVM">Google lance son langage pour la JVM</a></li><li><a
href="http://blog.xebia.fr/2009/09/21/revue-de-presse-xebia-127/#iBeanslasolutiondintgrationpou">iBeans : la solution d&#8217;intégration pour applications Web de MuleSoft</a></li></ul><p><strong>Agilité</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/09/21/revue-de-presse-xebia-127/#PairprogrammingdistancesousEcl">Pair programming à distance sous Eclipse avec Saros</a></li></ul><p><strong>SOA</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/09/21/revue-de-presse-xebia-127/#LinitiativeRESTfaitdbat">L&#8217;initiative REST-* fait débat</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/09/21/revue-de-presse-xebia-127/#OSGi">OSGi 4.2</a></li><li><a
href="http://blog.xebia.fr/2009/09/21/revue-de-presse-xebia-127/#ScalaOSGifi">Scala OSGi-fié</a></li><li><a
href="http://blog.xebia.fr/2009/09/21/revue-de-presse-xebia-127/#AstucesdeperformancepourMySQL">Astuces de performance pour MySQL</a></li><li><a
href="http://blog.xebia.fr/2009/09/21/revue-de-presse-xebia-127/#Enqutesurlestempsderedmarraged">Enquête sur les temps de redémarrage des serveurs JEE</a></li><li><a
href="http://blog.xebia.fr/2009/09/21/revue-de-presse-xebia-127/#Premierspasavecmemcached">Premiers pas avec memcached</a></li></ul><p><strong>Evènements de notre communauté en France et à l&#8217;étranger</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/09/21/revue-de-presse-xebia-127/#SoireTontonsFlexeursleSeptembr">Soirée Tontons Flexeurs le 24 Septembre</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="GooglelancesonlangagepourlaJVM"></a>Google lance son langage pour la JVM</h4><p>Lors du <a
href="http://openjdk.java.net/projects/mlvm/jvmlangsummit/" title="JVM Language Summit" >JVM Language Summit</a> de la semaine dernière, Google a présenté son nouveau langage pour la JVM appelé <a
href="http://code.google.com/p/noop/" title="Noop" >Noop</a>. Le <a
href="http://code.google.com/p/noop/w/list" title="Wiki du projet" >Wiki du projet</a> et sa <a
href="http://wiki.jvmlangsummit.com/Noop_Language_-W-" title="prsentation" >présentation</a> permettent de faire le tour des spécificités de ce langage :</p><ul><li>Syntaxe prévue pour être facilement compréhensible par un développeur Java ou C++</li><li>Pas de types primitifs, pas de classes ou méthodes statiques, variables non mutables par défaut, pas de syntaxe optionnelle, exceptions uniquement de type <em>unchecked</em></li><li>Librairie standard s&#8217;appuyant sur <a
href="http://joda-time.sourceforge.net/" title="JodaTime" >JodaTime</a>, util.concurrent et <a
href="http://code.google.com/p/google-collections/" title="Google Collections" >Google Collections</a></li><li>Support natif du concept d&#8217;injection de dépendances offert par <a
href="http://code.google.com/p/google-guice/" title="Guice" >Guice</a> ou <a
href="http://www.picocontainer.org/" title="PicoContainer" >PicoContainer</a>, un type est alors soit <em>newable</em> soit <em>injectable</em></li><li>Support natif des tests unitaires qui ont leur structure dédiée sans classes ni méthodes</li></ul><p>Les réactions qui ont suivies cette annonce montrent en général un intérêt couplé à une réserve légitime due à l&#8217;état embryonnaire du projet. Ainsi <a
href="http://www.jroller.com/dmdevito/entry/reviewing_noop_language_from_google" title="l'analyse de Dominique de Vito" >l&#8217;analyse de Dominique de Vito</a> s&#8217;inscrit dans ce schéma, tandis qu&#8217;Alexis Moussine-Pouchkine, Sun, <a
href="http://pro.01net.com/editorial/506291/google-veut-moderniser-java-avec-noop/" title="explique  01net" >explique à 01net</a> qu&#8217;il trouve enrichissant la profusion de nouvelles idées mais que, selon lui, le langage Java restera malgré tout omniprésent pendant encore des années.</p><p>Reste que là où de nombreux nouveaux langages justifient leur existence par une syntaxe plus compacte, une nature dynamique ou encore des concepts élaborés, Noop semble adopter une approche plus pragmatique et plus proche des besoins quotidiens rencontrés en informatique de gestion. L&#8217;avenir nous dira si les apports de ce langage sont suffisants pour convaincre des équipes de le préférer à Java pour leurs développements.</p><h4><a
name="iBeanslasolutiondintgrationpou"></a>iBeans : la solution d&#8217;intégration pour applications Web de MuleSoft</h4><p>MuleSource, récemment renommé en MuleSoft lors du lancement de leur offre <a
href="http://www.mulesoft.com/tcat-server-enterprise-tomcat-application-server" title="Tcat Server" >Tcat Server</a> a récemment diffusé une première beta public d&#8217;un nouveau produit : <a
href="http://www.mulesoft.org/display/IBEANS" title="Mule iBeans" >Mule iBeans</a>. Il s&#8217;agit d&#8217;une nouvelle solution d&#8217;intégration s&#8217;attaquant à un marché différent des ESB traditionnels. MuleSoft part en effet du constat que de nombreuses applications Web doivent s&#8217;intégrer avec diverses ressources distantes, mais ne peuvent s&#8217;appuyer sur un ESB qui constituerait une solution trop lourde. iBeans se positionne ainsi en tant que solution d&#8217;intégration pour applications Web. La nuance est légère par rapport aux ESB mais on constate clairement cette orientation dans la pratique : annotations, composants iBeans, injection de services type IoC avec un contexte <em>request</em>, &#8230;</p><p>La particularité principale du projet est son modèle de composant iBeans. Il s&#8217;agit de composants similaires aux Beans Spring ou aux Session Beans EJB mais spécialisés dans l&#8217;accès à un service à distance. Ces composants utilisent certaines annotations de la récente <a
href="http://jcp.org/en/jsr/detail?id=330" title="JSR-330 (Dependency injection for Java)" >JSR-330 (Dependency injection for Java)</a> et peuvent s&#8217;intégrer facilement avec Spring, Struts et JSF.</p><p>MuleSoft propose parallèlement un projet nommé <a
href="http://www.mulesoft.org/display/IBEANSCONTRIB/Home" title="Community iBeans Proposals" >Community iBeans Proposals</a> visant à regrouper les iBeans de la communauté pour intégrer les ressources les plus fréquentes.</p><p>iBeans répond à un besoin courant des applications Web. La réponse proposée par MuleSoft est élégante mais on pourra regretter l&#8217;apparition d&#8217;un modèle de composant supplémentaire disposant de son propre cycle de vie. Actuellement l&#8217;éditeur n&#8217;a pas communiqué sur son projet naissant en dehors de la <a
href="http://www.mulesoft.org/display/IBEANS/Documentation" title="page Wiki dédiée" >page Wiki dédiée</a>. Une recherche Google montre rapidement que la communication autour de ce projet est quasi inexistante. Toutefois, une <a
href="http://www.devoxx.com/display/DV09/iBeans+-+dead+simple+integration+for+the+Web" title="session ddie au sujet" >session dédiée au sujet</a> prévue pour Devoxx 2009 tend à nous faire penser que la célèbre conférence européenne pourrait bien servir de rampe de lancement au nouveau projet de MuleSoft.</p><h3><a
name="Agilit"></a>Agilité</h3><h4><a
name="PairprogrammingdistancesousEcl"></a>Pair programming à distance sous Eclipse avec Saros</h4><p>L&#8217;<a
href="https://www.inf.fu-berlin.de/" title="université de Berlin" >université de Berlin</a> propose depuis quelques temps un plugin Eclipse nommé <a
href="https://www.inf.fu-berlin.de/w/SE/DPP" title="Saros" >Saros</a>, offrant des fonctionnalités permettant le <em>pair programming</em> à distance grâce au <a
href="http://fr.wikipedia.org/wiki/Extensible_Messaging_and_Presence_Protocol" title="protocole XMPP" >protocole XMPP</a>. Concrètement les possibilités sont :</p><ul><li>Reproduction ou synchronisation d&#8217;un projet Eclipse à distance via une connexion XMPP.</li><li>Visualisation dans l&#8217;environnement de l&#8217;<em>observer</em> des classes ouvertes et de la classe en cours d&#8217;édition par le <em>driver</em>.</li><li>Affichage en temps réel des modifications du code, et de la position du curseur et du texte sélectionné.</li><li>Gestion expérimentale d&#8217;un mode <em>multi-driver</em> permettant de modifier le code à deux simultanément.</li><li>Chat via une vue dédiée dans Eclipse</li></ul><p>Un <a
href="https://www.inf.fu-berlin.de/w/SE/DPPDemoVideo" title="screencast" >screencast</a> est proposé sur le site du projet, celui-ci permet de se rendre compte des capacités du plugin.</p><p>Idéalement complété d&#8217;une conversation Skype, ce plugin trouvera sa place dans de nombreux scenarii allant du <em>distributed pair programming</em> à l&#8217;assistance d&#8217;un collègue situé à un autre étage.</p><h3><a
name="SOA"></a>SOA</h3><h4><a
name="LinitiativeRESTfaitdbat"></a>L&#8217;initiative REST-* fait débat</h4><p>JBoss vient de lancer le site <a
href="http://www.jboss.org/reststar" title="RESTorg" >REST-*.org</a> hébergeant son initiative de standardisation de plusieurs services <em>middleware</em> traditionnels sur le modèle REST.</p><p>Actuellement deux <em>drafts</em> sont en cours de rédaction, l&#8217;un porte sur <a
href="http://www.jboss.org/reststar/specifications/messaging.html" title="RESTful Messaging" >RESTful Messaging</a>, l&#8217;autre sur <a
href="http://www.jboss.org/reststar/specifications/transactions.html" title="RESTful Transactions" >RESTful Transactions</a>. Ces deux spécifications visent à définir un ensemble d&#8217;URIs standards sur le modèle REST permettant d&#8217;exposer une ressource transactionnelle ou un <em>broker</em> de messages.</p><p>Très rapidement, de vives réactions sont apparues au sein de la communauté, principalement pour faire part de leur scepticisme quant à cette initiative, régulièrement comparée à la très lourde collections de spécifications WS-*, qui pourrait mettre à mal la simplicité unanimement reconnue du modèle REST. C&#8217;est ainsi le cas <a
href="http://apsblog.burtongroup.com/2009/09/rest-ive-got-a-bad-feeling-about-this.html" title="d'Anne Thomas Manes" >d&#8217;Anne Thomas Manes</a> qui revient également sur les critiques de Bill Burke à l&#8217;égart de l&#8217;initiative <a
href="http://www.restms.org/" title="RestMS" >RestMS</a> qui existait déjà et qui pariait plutôt sur Atom et AMQP.</p><p>Bill Burke de son coté publie sur <a
href="http://bill.burkecentral.com/" title="son blog" >son blog</a> un billet par jour depuis la publication sur le site REST-*.org, pour justifier ses choix et la légitimité du projet qu&#8217;il porte. Ses arguments portent principalement sur le fait qu&#8217;il existe une demande très forte de la communauté pour gérer les services de <em>messaging</em> et les transactions avec REST.</p><p>Le débat est compréhensible : la volonté d&#8217;exposer certaines ressources transactionnelles ou services de <em>messaging</em> s&#8217;inscrit dans les besoins courants des entreprises, tout comme les craintes de voir se reproduire les erreurs du passé sont légitimes. L&#8217;apport de cette initiative est donc probablement de porter sur le devant de la scène une réflexion sur un problème pourtant courant et déjà exposé par Leonard Richardson et Sam Ruby, il y a deux ans, dans leur livre majeur <a
href="http://oreilly.com/catalog/9780596529260/" title="RESTful Web Services" >RESTful Web Services</a>.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="OSGi"></a>OSGi 4.2</h4><p>OSGi est sur le devant de la scène, d&#8217;<a
href="http://www.infoq.com/news/2009/09/osgi-4-2-released" title="InfoQ" >InfoQ</a> à <a
href="http://osgithoughts.blogspot.com/2009/09/osgi-42-core-and-compendium-specs.html" title="OSGi Thoughts" >OSGi Thoughts</a> en passant par <a
href="http://blog.bjhargrave.com/2009/09/osgi-42-specs-are-now-available.html" title="The Programming Delusion" >The Programming Delusion</a> (BJ Hargrave, CTO de l&#8217;OSGi Alliance), depuis une petite semaine et pour cause : l&#8217;<a
href="http://www.osgi.org/News/20090916" title="OSGi Alliance" >OSGi Alliance</a> a sorti et mis à disposition le 16 septembre dernier les spécifications finales de la version 4.2 (téléchargeables <a
href="http://www.osgi.org/Specifications/HomePage" title="ici" >ici</a>).</p><p><a
href="http://alblue.blogspot.com/2009/09/osgi-42-released.html" title="Alex Blewitt" >Alex Blewitt</a> nous résume la situation sur <a
href="http://www.infoq.com/news/2009/09/osgi-4-2-released" title="InfoQ" >InfoQ</a>. On retiendra qu&#8217;<a
href="http://www.eclipse.org/equinox" title="Equinox" >Equinox</a> et <a
href="http://felix.apache.org/" title="Flix" >Félix</a> ont déjà commencé leur travail de compatibilité avec OSGi 4.2. Les spécifications étant désormais <em>released</em>, ce n&#8217;est qu&#8217;une question de temps avant que les projets affichent fièrement leur label <em>OSGi 4.2 compliant</em>.<br
/> On notera aussi une nouvelle méthode de lancement du runtime OSGi, le nouveau nom des Distributed OSGi qui deviennent les Remote Services (connexion de VMs OSGi), les Blueprint Services qui seront des services <em>wired</em> à la Spring, le concept de Bundle Tracker ou bien encore le mécanisme de permission sur une opération dans un bundle.</p><p>Pour la petite piqure de rappel, on pourra se tourner vers <a
href="http://java.dzone.com/" title="JavaLobby" >JavaLobby</a> qui nous propose depuis quelques jours 2 tutoriaux HelloWorld sur OSGi, le premier avec <a
href="http://java.dzone.com/articles/plugable-swing-%E2%80%93-hello-world" title="Swing" >Swing</a> et le second avec <a
href="http://java.dzone.com/articles/plugable-spring-rc-osgi-spring" title="Spring RC" >Spring RC</a>.<br
/> Et pour les plus nostalgiques, le Paris JUG sur OSGi, <a
href="http://www.parisjug.org/xwiki/bin/view/Meeting/20081014" title="c'était (déjà) il y a 1 an" >c&#8217;était (déjà) il y a 1 an</a>&#8230;</p><h4><a
name="ScalaOSGifi"></a>Scala OSGi-fié</h4><p>On reste dans les news OSGi avec un projet qui propose Scala 2.7.6 en version OSGi-fiée (vu <a
href="http://heikoseeberger.blogspot.com/2009/09/osgi-fied-scala-libraries-updated-to.html" title="ici" >ici</a>).</p><p>Comme expliqué sur le GitHub du projet, <a
href="http://www.scala-lang.org/" title="Scala" >Scala</a> n&#8217;est pas (encore) packagé en bundle OSGi. Certes, le plugin Eclipse <a
href="http://www.scala-lang.org/node/94" title="Scala IDE" >Scala IDE</a> utilise un bundle OSGi qui embarque Scala mais celui-ci ne peut pas être utilisé de manière générale (manifest spécifique et toutes les librairies dans un seul jar).</p><p><a
href="http://github.com/hseeberger/scala-lang-osgi" title="scala-lang-osgi" >scala-lang-osgi</a> répond à ce besoin et fournit un bundle OSGi pour chaque librairie Scala. Le tout est disponible sur le repository maven <a
href="http://scala-tools.org/repo-releases/org/scala-lang-osgi/" title="scalatoolsorg" >scala-tools.org</a>.</p><h4><a
name="AstucesdeperformancepourMySQL"></a>Astuces de performance pour MySQL</h4><p>Même si nos ORMs préférés génèrent des requêtes optimisées à notre place, il arrive parfois que, pour des raisons de performances ou autres, l&#8217;on doive écrire certaines requêtes directement en SQL.<br
/> Le site <a
href="http://www.debianadmin.com/" title="Debian Admin" >Debian Admin</a> (par <a
href="http://www.code-purity.com/top_87_mysql_performance_tips/|http://www.debianadmin.com/top-84-mysql-performance-tips." title="Code Purity" >Code Purity</a>) référence à cette fin <a
href="http://www.debianadmin.com/top-84-mysql-performance-tips.html" title="84 astuces doptimisations de performances pour MySQL" >84 astuces d&#8217;optimisations de performances pour MySQL</a>.<br
/> Certes, la plupart des astuces de configuration de MySQL sont peut-être/certainement déjà mises en place par nos chers DBA. Mais on trouvera aussi une pléiade d&#8217;astuces concernant la requête elle-même : cela passe de la non utilisation du gourmand <code>SELECT *</code>, d&#8217;éviter au possible l&#8217;utilisation de <code>DISTINCT</code> (très consommateur), d&#8217;utiliser pour l&#8217;insertion des <code>BATCH INSERT</code> et <code>REPLACE</code> ou bien encore l&#8217;utilisation <code>INET_ATON</code> et <code>INET_NTOA</code> au lieu de <code>CHAR</code> et <code>VARCHAR</code> pour les adresses IP.<br
/> Pour le détail complet, rendez-vous directement sur le <a
href="http://www.debianadmin.com/top-84-mysql-performance-tips.html" title="site de Debian Admin" >site de Debian Admin</a>.</p><h4><a
name="Enqutesurlestempsderedmarraged"></a>Enquête sur les temps de redémarrage des serveurs JEE</h4><p>ZeroTurnAround, l&#8217;éditeur de JRebel, a mené (et continue même à collecter des données) <a
href="http://www.zeroturnaround.com/blog/java-ee-container-heaven-hell-survey-results/" title="une tude sur les temps de redmarrage  redploiement des serveurs dapplications" >une étude sur les temps de redémarrage / redéploiement des serveurs d&#8217;applications</a> auprès des lecteurs de son blog (environ 700 personnes ont répondu).<br
/> Tout d&#8217;abord, passons sur la conclusion évidente de l&#8217;étude, <em>vous avez besoin de JRebel</em>, pour tenter de voir au delà de cette évidence marketing. On évitera aussi la polémique sur le rapprochement Conteneurs de Servlets / Serveurs d&#8217;applications.<br
/> On constate tout d&#8217;abord que la population fréquentant le blog de ZeroTurnAround (on a donc dès le début une information en partie biaisée) a une forte tendance à confier ses applications à une plate-forme basée sur Tomcat (JBoss + Tomcat), plutôt qu&#8217;aux historiques IBM et <strike>BEA</strike> Oracle. Là encore, étant donné la notoriété naissante de JRebel, au sein d&#8217;une communauté plutôt tournée vers l&#8217;open source, rien d&#8217;étonnant.</p><p>En revanche, il est intéressant de constater que les temps de redéploiement deviennent assez rapidement délirants, avec des serveurs qui en moyenne mettent entre 2 et 5 minutes à redémarrer, la palme de la lenteur revenant, on le savait déjà par expérience, aux <em>gros serveurs monolithiques commerciaux</em>. Alors, au-delà du constat qu&#8217;un développeur passe aujourd&#8217;hui une grande partie de son temps à attendre que son application se mette à jour sur son serveur d&#8217;applications, au-delà du fait que JRebel est une des manières d&#8217;adresser ce problème, nous nous posons la question suivante : est-il normal, pour un serveur d&#8217;applications, de mettre cinq minutes à redémarrer ?</p><p>L&#8217;actualité de cette revue de presse met en avant OSGI, qui sera certainement une des réponses apportées à cette explosion des temps de démarrage. Ce sont d&#8217;ailleurs les absents de cette étude qui porteront la première estocade : GlassFish 3.x et dmServer.</p><h4><a
name="Premierspasavecmemcached"></a>Premiers pas avec memcached</h4><p>Dans le but de proposer une implémentation d&#8217;un système de cache pour Grails, <a
href="http://www.ibm.com/developerworks/java/library/j-memcached1/?S_TACT=105AGX01&#038;S_CMP=HP&#038;ca=drs-" title="James Goodwill, sur DeveloperWorks" >James Goodwill, sur DeveloperWorks</a>, propose, dans un premier temps, une découverte du système de cache distribué <a
href="http://www.danga.com/memcached/" title="memcached" >memcached</a>.<br
/> Une mise en bouche qui permet de découvrir les bases de ce produit, avant de combiner ce cache avec Grails dans une seconde partie, qui, on l&#8217;espère, permettra d&#8217;optimiser les performances du plus célèbre des frameworks haute productivité.</p><h3><a
name="EvnementsdenotrecommunautenFra"></a>Evènements de notre communauté en France et à l&#8217;étranger</h3><h4><a
name="SoireTontonsFlexeursleSeptembr"></a>Soirée Tontons Flexeurs le 24 Septembre</h4><p>Suite des <a
href="http://groups.adobe.com/groups/193bcaff5f/summary" title="Tontons Flexeurs" >Tontons Flexeurs</a>, après la très bonne soirée <a
href="http://blog.xebia.fr/2009/07/20/revue-de-presse-xebia-118/#SoireTontonsFlexeurs" title="Flex et Java en entreprise" >Flex et Java en entreprise</a>, avec une <a
href="http://groups.adobe.com/posts/8cb9375182" title="nouvelle session" >nouvelle session</a> ce jeudi 24 septembre. 2 invités de marque : <a
href="http://www.mikechambers.com/blog/" title="Mike Chambers" >Mike Chambers</a> et <a
href="http://theflashblog.com/" title="Lee Brimelow" >Lee Brimelow</a> qui nous feront une présentation d&#8217;Adobe AIR (techniques avancées de synchronisation de données, de manipulation de fichiers, possibilités d&#8217;intégration à la plateforme hôte&#8230;) et des nouvelles fonctionnalités des prochaines versions de AIR.</p><p>A l&#8217;heure où nous écrivons ces lignes, il reste encore quelques places disponibles donc rendez-vous sur le <a
href="http://chambers-et-brimelow-ttfx-2009.eventbrite.com/" title="formulaire dinscription de lvnement" >formulaire d&#8217;inscription de l&#8217;évènement</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/09/21/revue-de-presse-xebia-127/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Ce que vous avez peut-être raté au quatrième trimestre 2008</title><link>http://blog.xebia.fr/2009/01/02/ce-que-vous-avez-peut-etre-rate-au-quatrieme-trimestre-2008/</link> <comments>http://blog.xebia.fr/2009/01/02/ce-que-vous-avez-peut-etre-rate-au-quatrieme-trimestre-2008/#comments</comments> <pubDate>Fri, 02 Jan 2009 10:56:49 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Echo 3]]></category> <category><![CDATA[Flex]]></category> <category><![CDATA[GWT]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JavaFX]]></category> <category><![CDATA[JVM]]></category> <category><![CDATA[RIA]]></category> <category><![CDATA[Silverlight]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=1243</guid> <description><![CDATA[Voici la liste des billets les plus lus sur ce blog en octobre, novembre et décembre : RIA Contest : Flex / Silverlight / GWT / Echo3 / JavaFX Après le Xebia Web Framework Contest de l&#8217;année dernière, le thème du XKE du mois d&#8217;Octobre était un nouveau contest dédié aux RIA. Le but de [...]]]></description> <content:encoded><![CDATA[<p>Voici la liste des billets les plus lus sur ce blog en octobre, novembre et décembre :</p><h4><a
href="http://blog.xebia.fr/2008/10/03/ria-contest-flex-silverlight-gwt-echo3-javafx/">RIA Contest : Flex / Silverlight / GWT / Echo3 / JavaFX</a></h4><p>Après le <a
href="http://blog.xebia.fr/2007/10/26/xebia-web-framework-contest/" title="Xebia Web Framework Contest" >Xebia Web Framework Contest</a> de l&#8217;année dernière, le thème du <a
href="http://blog.xebia.fr/tag/xke/" title="XKE" >XKE</a> du mois d&#8217;Octobre était un nouveau <em>contest</em> dédié aux <a
href="http://fr.wikipedia.org/wiki/Rich_Internet_Application" title="RIA" >RIA</a>.</p><p>Le but de cette journée était de développer une application de gestion de playlist de morceaux de musique. En promoteurs des méthodes Agiles, les spécifications furent données sous forme d&#8217;un Product Backlog. Trois sprints d&#8217;une durée de 90 minutes ont permis à tous de suivre l&#8217;évolution des différentes réalisations. Un web service SOAP fournissait les différentes données: Artiste, Album, Titres et Pochettes d&#8217;album.</p><p>Cinq équipes ont été constituées, cinq frameworks ont donc été choisis :</p><ul><li><a
href="http://blog.xebia.fr/2008/10/03/ria-contest-flex-silverlight-gwt-echo3-javafx/#Flex" title="Flex 3" >Flex 3</a></li><li><a
href="http://blog.xebia.fr/2008/10/03/ria-contest-flex-silverlight-gwt-echo3-javafx/#Silverlight" title="Silverlight 2.0 beta 2" >Silverlight 2.0 beta 2</a></li><li><a
href="http://blog.xebia.fr/2008/10/03/ria-contest-flex-silverlight-gwt-echo3-javafx/#GoogleGWT" title="Google GWT 1.5" >Google GWT 1.5</a></li><li><a
href="http://blog.xebia.fr/2008/10/03/ria-contest-flex-silverlight-gwt-echo3-javafx/#Echo" title="Echo3" >Echo3</a></li><li><a
href="http://blog.xebia.fr/2008/10/03/ria-contest-flex-silverlight-gwt-echo3-javafx/#JavaFX" title="JavaFX Preview SDK" >JavaFX Preview SDK</a></li></ul><p>Au terme de cette journée, chaque équipe a pu exprimer un retour d&#8217;expérience significatif.</p><p><a
href="http://blog.xebia.fr/2008/10/03/ria-contest-flex-silverlight-gwt-echo3-javafx/">Lire cet article »</a></p><h4><a
href="http://blog.xebia.fr/2008/10/22/diagnostic-dune-jvm-a-distance/">Diagnostic d’une JVM à distance</a></h4><p><em>Développer une application Java, c&#8217;est bien. La rendre performante, c&#8217;est mieux.</em></p><p>Cependant, qui dit &laquo;&nbsp;performance&nbsp;&raquo;, dit &laquo;&nbsp;mesure&nbsp;&raquo;. En effet, il est nécessaire de pouvoir :</p><ul><li>connaître  les paramètres de lancement de la JVM,</li><li>mesurer l&#8217;empreinte mémoire et le comportement du Garbage Collector,</li></ul><p>Cet article va décrire dans une première partie les différents outils permettant de collecter ces informations en local. La seconde partie se concentre sur les moyens pour obtenir ces <strong>mêmes</strong> informations à distance.</p><p><a
href="http://blog.xebia.fr/2008/10/22/diagnostic-dune-jvm-a-distance/">Lire cet article »</a></p><h4><a
href="http://blog.xebia.fr/2008/11/27/analyse-memoire-dune-jvm/">Analyse mémoire d’une JVM</a></h4><p><em>Mardi, 10 heures</em><br
/> - <em>La production &laquo;&nbsp;Allo, le projet, depuis 10 minutes on voit passer des messages &#8216;OutOfMemoryError&#8217;. Que fait-on ? &laquo;&nbsp;</em><br
/> - <em>Le projet &laquo;&nbsp;Augmentez la mémoire de la JVM, doublez-la valeur de l&#8217;option -Xmx &laquo;&nbsp;</em></p><p><em>Mardi, 13 heures</em><br
/> - <em>La production &laquo;&nbsp;Allo, le projet, depuis 5 minutes on voit</em> <strong>encore</strong> <em>passer  des messages &#8216;OutOfMemoryError&#8217;. Que fait-on ? &laquo;&nbsp;</em><br
/> - <em>Le projet &laquo;&nbsp;Augmentez la mémoire de la JVM, doublez</em> <strong>encore</strong> <em>la valeur de l&#8217;option -Xmx &laquo;&nbsp;</em></p><p><em>Mardi 18 heures</em><br
/> - <em>La production &laquo;&nbsp;Allo, le projet, depuis 2 minutes on voit passer</em> <strong>encore</strong> <em>des messages &#8216;OutOfMemoryError&#8217;. Que fait-on ? &laquo;&nbsp;</em><br
/> - <em>Le projet &laquo;&nbsp;Tut, tut, tut,&#8230;..&nbsp;&raquo;</em><br
/> - <em>La production &laquo;&nbsp;Plus d&#8217;équipe projet, la nuit va être longue&#8230;&nbsp;&raquo;</em></p><p>Cette petite scène est un classique, un air de <em>déjà-vu</em> mais que faire ?  Si votre application a déjà subi une batterie de tests techniques, augmenter la mémoire est rarement la bonne solution. La scène décrite ci-dessus laisse penser à ce que l&#8217;on appelle classiquement une <em>Fuite Mémoire</em> (Memory Leak). En réalité, avec les JVM récentes, la fuite mémoire n&#8217;existe pas, je préfère parler <em>d&#8217;accumulation d&#8217;objets non désirés</em>. Cet article va vous montrer comment débusquer cette accumulation avec les outils <a
href="http://java.sun.com/javase/6/docs/technotes/tools/share/jmap.html" title="jmap" >jmap</a>, <a
href="http://java.sun.com/javase/6/docs/technotes/tools/share/jhat.html" title="jhat" >jhat</a> et <a
href="http://www.eclipse.org/mat/" title="Eclipse Memory Analyser" >Eclipse Memory Analyser</a>.</p><p><a
href="http://blog.xebia.fr/2008/11/27/analyse-memoire-dune-jvm/">Lire cet article »</a></p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/01/02/ce-que-vous-avez-peut-etre-rate-au-quatrieme-trimestre-2008/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Analyse mémoire d&#8217;une JVM</title><link>http://blog.xebia.fr/2008/11/27/analyse-memoire-dune-jvm/</link> <comments>http://blog.xebia.fr/2008/11/27/analyse-memoire-dune-jvm/#comments</comments> <pubDate>Thu, 27 Nov 2008 13:04:40 +0000</pubDate> <dc:creator>Benoit Moussaud</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Eclipse Memory Analyzer]]></category> <category><![CDATA[jhat]]></category> <category><![CDATA[jmat]]></category> <category><![CDATA[JVM]]></category> <category><![CDATA[MAT]]></category> <category><![CDATA[OutOfMemorry]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=1063</guid> <description><![CDATA[Mardi, 10 heures - La production &#171;&#160;Allo, le projet, depuis 10 minutes on voit passer des messages &#8216;OutOfMemoryError&#8217;. Que fait-on ? &#171;&#160; - Le projet &#171;&#160;Augmentez la mémoire de la JVM, doublez-la valeur de l&#8217;option -Xmx &#171;&#160; Mardi, 13 heures - La production &#171;&#160;Allo, le projet, depuis 5 minutes on voit encore passer des messages [...]]]></description> <content:encoded><![CDATA[<p><em>Mardi, 10 heures</em><br
/> - <em>La production &laquo;&nbsp;Allo, le projet, depuis 10 minutes on voit passer des messages &#8216;OutOfMemoryError&#8217;. Que fait-on ? &laquo;&nbsp;</em><br
/> - <em>Le projet &laquo;&nbsp;Augmentez la mémoire de la JVM, doublez-la valeur de l&#8217;option -Xmx &laquo;&nbsp;</em></p><p><em>Mardi, 13 heures</em><br
/> - <em>La production &laquo;&nbsp;Allo, le projet, depuis 5 minutes on voit</em> <strong>encore</strong> <em>passer  des messages &#8216;OutOfMemoryError&#8217;. Que fait-on ? &laquo;&nbsp;</em><br
/> - <em>Le projet &laquo;&nbsp;Augmentez la mémoire de la JVM, doublez</em> <strong>encore</strong> <em>la valeur de l&#8217;option -Xmx &laquo;&nbsp;</em></p><p><em>Mardi 18 heures</em><br
/> - <em>La production &laquo;&nbsp;Allo, le projet, depuis 2 minutes on voit passer</em> <strong>encore</strong> <em>des messages &#8216;OutOfMemoryError&#8217;. Que fait-on ? &laquo;&nbsp;</em><br
/> - <em>Le projet &laquo;&nbsp;Tut, tut, tut,&#8230;..&nbsp;&raquo;</em><br
/> - <em>La production &laquo;&nbsp;Plus d&#8217;équipe projet, la nuit va être longue&#8230;&nbsp;&raquo;</em></p><p>Cette petite scène est un classique, un air de <em>déjà-vu</em> mais que faire ?  Si votre application a déjà subi une batterie de tests techniques, augmenter la mémoire est rarement la bonne solution. La scène décrite ci-dessus laisse penser à ce que l&#8217;on appelle classiquement une <em>Fuite Mémoire</em> (Memory Leak). En réalité, avec les JVM récentes, la fuite mémoire n&#8217;existe pas, je préfère parler <em>d&#8217;accumulation d&#8217;objets non désirés</em>. Cet article va vous montrer comment débusquer cette accumulation avec les outils <a
href="http://java.sun.com/javase/6/docs/technotes/tools/share/jmap.html" title="jmap" >jmap</a>, <a
href="http://java.sun.com/javase/6/docs/technotes/tools/share/jhat.html" title="jhat" >jhat</a> et <a
href="http://www.eclipse.org/mat/" title="Eclipse Memory Analyser" >Eclipse Memory Analyser</a></p><h3><a
name="jmap"></a>jmap</h3><p>jmap est <strong>l&#8217;outil</strong> qui permet d&#8217;effectuer des photographies de la mémoire d&#8217;une JVM. Deux options sont particulièrement intéressantes : l&#8217;histogramme et le dump.</p><p><br
/> <strong>L&#8217;histogramme</strong></p><p>L&#8217;option <code>-histo</code> permet d&#8217;obtenir un histogramme de la mémoire de la JVM. Les informations suivantes sont affichées pour chacune des classes Java :</p><ul><li>son nom complet</li><li>le nombre d&#8217;objets et</li><li>la taille de la mémoire occupée en octets</li></ul><p>L&#8217;ensemble est trié par taille mémoire <em>décroissante</em>. Attention, la demande d&#8217;un histogramme implique <em>automatiquement</em> un <strong>Full GC</strong> de la mémoire de la JVM.</p><p>Exemple :</p><pre class="brush: java; title: ; notranslate">
jmap -histo &lt;pid&gt;
 num     #instances         #bytes  class name
----------------------------------------------
   1:         41202       27502288  [C
   2:          2304        1332520  [I
   3:         37934         910416  java.lang.String
   4:          5130         503632  &lt;constMethodKlass&gt;
   5:          5130         412968  &lt;methodKlass&gt;
   6:         12348         395136  fr.xebia.memory.bean.Person
   7:         12846         308304  java.util.concurrent.ConcurrentHashMap$HashEntry
   8:          7650         285656  &lt;symbolKlass&gt;
   9:         12518         200288  java.lang.Long
  10:           349         189184  &lt;constantPoolKlass&gt;
  11:           349         138704  &lt;instanceKlassKlass&gt;
  12:           327         132144  &lt;constantPoolCacheKlass&gt;
  13:            38         115456  [Ljava.util.concurrent.ConcurrentHashMap$HashEntry;
  14:           414          76392  [B
  15:           422          40512  java.lang.Class
  16:           556          32656  [[I
  17:           518          32056  [S
  18:            44          14080  &lt;objArrayKlassKlass&gt;
  19:           315          13480  [Ljava.lang.Object;
  20:           576           9216  java.lang.StringBuffer
.....
 184:             1              8  java.lang.System$2
 185:             1              8  java.io.File$1
 186:             1              8  java.lang.Terminator$1
Total        142211       32693376
</pre><p>Que peut-on en déduire ?</p><ul><li>Les premières places sont souvent trustées par les objets de base ( java.lang.String, java.lang.Object, java.lang.class) et leur déclinaison en collections (java.util.* et les tableaux, symbolisé par des '['). Si vous retrouvez des classes de votre application dans le top 20, elles deviennent <em>suspectes</em>. Dans notre exemple, l'histogramme montre que la classe 'fr.xebia.memory.bean.Person' est instanciée 12348 fois pour une occupation mémoire de 308304 octets. Elle est suivie de près par des entrées d'une ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap$HashEntry)</li><li>L'obtention de cet histogramme est extrêmement rapide <strike> et perturbe peu la JVM (au Full GC près ;</strike>) ). Il est donc possible d'en faire régulièrement (exemple toutes les 'n' secondes) et d'en déduire ainsi des tendances : nombre d'instances d'une classe qui augmente, taille des instances d'une classe qui diminue, ...</li></ul><p>Note : avec les JVM en version 1.4.2, il est possible d'obtenir également un histogramme à chaque thread dump en ajoutant l'option <strong>-XX:+PrintClassHistogram</strong> au démarrage de la JVM. Comme pour jstat <code>-histo</code>, cette option implique <em>automatiquement</em> un Full GC de la mémoire de la JVM.</p><p>L'histogramme permet de connaître les classes qui occupent le plus de mémoire, il n'indique pas qui les a allouées.</p><p><strong>Le dump</strong></p><p>L'histogramme c'est bien, mais ce n'est pas suffisant : il est parfois nécessaire d'obtenir un dump complet de la mémoire afin de déterminer précisément la chaîne de référencement.</p><p>L'outil jmap permet également d'effectuer un dump complet et binaire de la mémoire d'une JVM. Deux remarques importantes :</p><ul><li>pendant la durée du dump, plus rien ne s'exécute dans la JVM, tous les threads sont stoppés, qu'ils soient applicatifs ou systèmes.</li><li>la durée du dump est proportionnelle à la taille de la mémoire occupée et fonction de la taille de la mémoire restante (il faut un peu de mémoire libre pour exécuter le traitement du dump !). Exemple: la durée d'un dump d'une JVM avec un heap de 1 Go à la limite de la saturation mémoire se compte en minute !</li></ul><p>Exemple : création d'un dump</p><pre class="brush: java; title: ; notranslate">
jmap -dump:format=b,file=c:tempheap.bin &lt;pid&gt;
Dumping heap to c:tempheap.bin ...
Heap dump file created
</pre><p>Note : L'option <code>-XX:+HeapDumpOnOutOfMemoryError</code> indique à la JVM d'effectuer un heap dump en cas d'OutOfMemoryError. Le fichier est généré dans le répertoire de lancement de la JVM.</p><p>Vous voilà l'heureux propriétaire d'un fichier binaire de plusieurs centaines de méga-octets. Comment en extraire des informations ? C'est là que le compagnon de jmap rentre en jeu : jhat.</p><h3><a
name="jhat"></a>jhat</h3><p><a
href="http://java.sun.com/javase/6/docs/technotes/tools/share/jhat.html" title="jhat" >jhat</a> est un analyseur de dump mémoire. C'est en réalité un serveur web, comme le montre l'exemple ci-dessous.</p><pre class="brush: java; title: ; notranslate">
D:ProjetsMesProjetsMemoryLeakjmap5968&gt;jhat heap5968.bin
Reading from heap5968.bin...
Dump file created Mon Nov 24 13:03:54 CET 2008
Snapshot read, resolving...
Resolving 118955 objects...
Chasing references, expect 23 dots.......................
Eliminating duplicate references.......................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.
</pre><p>L'application jhat lancée, il suffit de lancer un navigateur web pour commencer l'exploration du dump.</p><div
align="center"> <object
classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"             codebase="https://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" data="http://blog.xebia.fr/wp-content/uploads/2008/11/jhat.swf" height="407" width="700" type="application/x-shockwave-flash" ><param
name="data" value="http://blog.xebia.fr/wp-content/uploads/2008/11/jhat.swf" /><param
name="loop" value="false" /><param
name="menu" value="false" /><param
name="movie" value="http://blog.xebia.fr/wp-content/uploads/2008/11/jhat.swf" /><param
name="quality" value="high" /><param
name="scale" value="exactfit" /><param
name="src" value="http://blog.xebia.fr/wp-content/uploads/2008/11/jhat.swf" /><param
name="type" value="application/x-shockwave-flash" /><embed
height="407" width="700" quality="high"             pluginspage="https://www.macromedia.com/shockwave/download/index.cgi?p1_prod_version=shockwaveflash" src="http://blog.xebia.fr/wp-content/uploads/2008/11/jhat.swf" type="application/x-shockwave-flash" /><br
/> </object><br
/> [ <a
href="http://blog.xebia.fr/wp-content/uploads/2008/11/jhat.swf">MODE PLEIN ECRAN</a> ]</div><p>Grâce à jhat, on a pu voir que les instances de type fr.xebia.memory.bean.Person étaient majoritairement référencées par un champ statique de type fr.xebia.memory.dao.MySuperSmartCache qui fait office de cache. Sans rentrer dans le code, on peut commencer à avoir des doutes sur l'efficacité de ce cache !</p><p>jhat a l'avantage d'être disponible dans tous les JDK récents. Cependant, l'interface proposée permet certes de naviguer facilement de classe en classe, d'instance en instance, mais il manque de fonctions d'analyse. Un outil est venu combler ce manque...</p><h3><a
name="EclipseMemoryAnalyzer"></a>Eclipse Memory Analyzer</h3><p><a
href="http://www.eclipse.org/mat/" title="Eclipse Memory Analyzer" >Eclipse Memory Analyzer</a> (MAT) est un sous projet de la fondation Eclipse, initié par la société SAP. Son but est non seulement d'offrir une interface graphique permettant de naviguer dans un dump mémoire, mais également de proposer des rapports d'analyses précablés (Leak Suspects, Heap Dump Overview, Top Consumers,...).</p><p>Ouvrons le dump avec MAT. Après analyse, MAT ouvre une fenêtre avec une vue d'ensemble de la mémoire. Il est clair que l'ensemble de la mémoire est retenu par une seule instance de type fr.xebia.memory.dao.Loader.</p><div
align="center"><a
href="http://blog.xebia.fr/wp-content/uploads/2008/11/mat1.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2008/11/mat1-300x263.png" alt="" title="Eclipse Memory Analyser - Overview" width="300" height="263" class="aligncenter size-medium wp-image-1065" /></a></div><p>La vue histogramme ressemble à celle fournie par jmap ou jhat mais avec des libellés un peu plus clairs.</p><div
align="center"><a
href="http://blog.xebia.fr/wp-content/uploads/2008/11/mat2.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2008/11/mat2-300x263.png" alt="" title="Eclipse Memory Analyser - histogramme" width="300" height="263" class="aligncenter size-medium wp-image-1066" /></a></div><p>Une fonction très intéressante, le <em>'Dominator Tree'</em> donne la liste des plus gros objets, consolidée avec l'ensemble de leurs références.</p><div
align="center"><a
href="http://blog.xebia.fr/wp-content/uploads/2008/11/mat3.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2008/11/mat3-300x263.png" alt="" title="Eclipse Memory Analyser - Dominator Tree" width="300" height="263" class="aligncenter size-medium wp-image-1067" /></a></div><p>Pour terminer, jetons un coup d'œil sur le <em>rapport 'Leak Suspect'</em>, et là il n'y a plus de doute, nous avons trouvé le coupable.</p><div
align="center"><a
href="http://blog.xebia.fr/wp-content/uploads/2008/11/mat4.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2008/11/mat4-300x263.png" alt="" title="Eclipse Memory Analyser - Leak Suspect" width="300" height="263" class="aligncenter size-medium wp-image-1068" /></a></div><h3><a
name="Conclusion"></a>Conclusion</h3><p>Avec ces outils de capture et d'analyse de la mémoire, il est maintenant facile de débusquer les consommations mémoires excessives, même dans un environnement de production. N'hésitez pas à user et à abuser de ces outils afin de déterminer au plus tôt les tailles des JVM et les éventuelles accumulations d'objets non désirés !</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/11/27/analyse-memoire-dune-jvm/feed/</wfw:commentRss> <slash:comments>9</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2008/10/27/revue-de-presse-xebia-80/</link> <comments>http://blog.xebia.fr/2008/10/27/revue-de-presse-xebia-80/#comments</comments> <pubDate>Mon, 27 Oct 2008 17:49:53 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Amazon]]></category> <category><![CDATA[Android]]></category> <category><![CDATA[Google]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JBoss]]></category> <category><![CDATA[JMX]]></category> <category><![CDATA[Jopr]]></category> <category><![CDATA[JVM]]></category> <category><![CDATA[Seam]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=913</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Google Android disponible en Open Source Amazon EC2 passe en production Le coin de la technique Sortie de Seam 2.1.0.GA JBoss AOP 2.0.0 disponible, JBoss AS 5 se rapproche &#8230; Embedded Jopr pour JBoss AS : une console JMX de [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/10/27/revue-de-presse-xebia-80/#GoogleAndroiddisponibleenOpenS">Google Android disponible en Open Source</a></li><li><a
href="http://blog.xebia.fr/2008/10/27/revue-de-presse-xebia-80/#AmazonECpasseenproduction">Amazon EC2 passe en production</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/10/27/revue-de-presse-xebia-80/#SortiedeSeamGA">Sortie de Seam 2.1.0.GA</a></li><li><a
href="http://blog.xebia.fr/2008/10/27/revue-de-presse-xebia-80/#JBossAOPdisponibleJBossASserap">JBoss AOP 2.0.0 disponible, JBoss AS 5 se rapproche &#8230;</a></li><li><a
href="http://blog.xebia.fr/2008/10/27/revue-de-presse-xebia-80/#EmbeddedJoprpourJBossASunecons">Embedded Jopr pour JBoss AS : une console JMX de nouvelle génération</a></li><li><a
href="http://blog.xebia.fr/2008/10/27/revue-de-presse-xebia-80/#ExemplesdelaJSRlanouvellenouve">Exemples de la JSR 203 (la nouvelle nouvelle JSR I/O)</a></li><li><a
href="http://blog.xebia.fr/2008/10/27/revue-de-presse-xebia-80/#JVMbitOuimaisaveccompressionde">JVM 64 bits ? Oui mais avec compression des pointeurs</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="GoogleAndroiddisponibleenOpenS"></a>Google Android disponible en Open Source</h4><p>Google a officiellement mis à disposition le code source de la plateforme <a
href="http://code.google.com/android/" title="Android" >Android</a> et encourage les développeurs à la tester.</p><p>Cette annonce survient au moment du lancement du nouveau téléphone le HTC Dream G1 de HTC par T-Mobile aux États-Unis. Le code source est livré sous licence Apache, ce qui implique que son utilisation est gratuite et que les développeurs ne sont pas tenus de rendre public le code source de leurs nouveaux produits.</p><p>Le code source d&#8217;Android est à présent disponible au téléchargement à l&#8217;adresse suivante : <a
href="http://source.android.com/download" title="http://source.android.com/download" >http://source.android.com/download</a>.</p><p>Quant à ceux qui souhaiteraient développer des applications pour ces téléphones, Google recommande <a
href="http://www.ubuntu.com/" title="Ubuntu" >Ubuntu</a> comme environnement de programmation pour Android (il est également possible d&#8217;utiliser MacOS).</p><h4><a
name="AmazonECpasseenproduction"></a>Amazon EC2 passe en production</h4><p>Le service d&#8217;hébergement d&#8217;applications <a
href="http://aws.amazon.com/ec2/" title="Amazon EC2" >Amazon EC2</a> n&#8217;est plus une bêta depuis le 23 octobre. Aurait-on donc de nombreux changements à se mettre sous la dent ?<br
/> Pas vraiment. La seule <em>&laquo;&nbsp;révolution&nbsp;&raquo;</em> est l&#8217;introduction d&#8217;un <a
href="http://aws.amazon.com/ec2-sla/" title="SLA" >SLA</a> <em>(Service Level Agreement, autrement dit un engagement de résultat)</em> qui garantit une disponibilité à 99.95% du temps. Si le taux de service chute sous cette barre, le client peut remplir une demande et accéder à des remises commerciales <em>(autant dire qu&#8217;Amazon a dû considérablement stresser son système avant d&#8217;annoncer de tels chiffres)</em>.</p><p>Dans un futur proche, le service d&#8217;Amazon devrait se voir enrichi des fonctionnalités suivantes :</p><ul><li>Console d&#8217;administration.</li><li>Load Balancing.</li><li>Adaptation automatique à la charge <em>(AutoScaling)</em>.</li><li>Monitoring global de l&#8217;ensemble des instances.</li></ul><p>ainsi que de nouveaux logiciels : Windows Server 2003, SQL Server Standard 2005 ou Express <em>(déjà disponibles en bêta)</em>, Windows Server 2008 <em>(à venir)</em></p><p>Une nouvelle pierre dans le jardin des hébergeurs traditionnels&#8230;</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="SortiedeSeamGA"></a>Sortie de Seam 2.1.0.GA</h4><p>Dans une précédente revue de presse, nous vous avions présenté <a
href="http://blog.xebia.fr/2008/08/11/revue-de-presse-xebia-69/#LesnouveautsdeSeam" title="les nouveautés de Seam 2.1" >les nouveautés de Seam 2.1</a>. L&#8217;équipe Seam concrétise ces nouveautés avec <a
href="http://in.relation.to/Bloggers/Seam210GAReleased" title="la sortie officielle de Seam 2.1.0.GA" >la sortie officielle de Seam 2.1.0.GA</a>.</p><p>Seam 2.1.0.GA intègre les composants suivants :</p><ul><li><a
href="http://www.jboss.org/jbossrichfaces/" title="RichFaces 3.2" >RichFaces 3.2</a> <em>(implémentation JSF de JBoss)</em>.</li><li><a
href="http://code.google.com/webtoolkit/" title="GWT (Google)" >GWT (Google)</a>.</li><li><a
href="http://wicket.apache.org/" title="Wicket (Apache)" >Wicket (Apache)</a> <em>(exemple d&#8217;intégration de Wicket dans Seam : <a
href="http://in.relation.to/Bloggers/SeamlessWicketOrchestratingYourApplication" title="Seamless Wicket: Orchestrating your application">Seamless Wicket: Orchestrating your application</a>)</em>.</li><li><a
href="http://groovy.codehaus.org/" title="Groovy 1.5" >Groovy 1.5</a> <em>(pour rappel il est possible d&#8217;écrire des composants Seam avec le langage Groovy)</em>.</li><li><strong>JBoss Cache 2</strong> <em>(ou JBoss Cache ou EHCache)</em>.</li><li><strong>JAX-RS</strong> <em>(REST)</em> via l&#8217;implémentation du projet JBoss <a
href="http://www.jboss.org/resteasy/" title="RestEasy" >RestEasy</a>.<br
/> <em>A noter que RestEasy n&#8217;est actuellement qu&#8217;en version bêta.</em></li><li>Documentation pour intégrer Seam dans d&#8217;autres containers que JBoss AS : WebLogic, WebSphere, OC4J et Glassfish.</li></ul><p>Prochaine étape : Seam 2.1.1, l&#8217;équipe s&#8217;attachera à encore améliorer les performances, la scalabilité et le clustering de Seam.</p><p>En parallèle, la spécification Web Beans commence à pointer le bout de son nez : <a
href="http://in.relation.to/Bloggers/WebBeansTeaser" title="Web Beans Teaser" >Web Beans Teaser</a>.</p><p>Félicitation à l&#8217;équipe Seam pour le travail qui a été réalisé.</p><h4><a
name="JBossAOPdisponibleJBossASserap"></a>JBoss AOP 2.0.0 disponible, JBoss AS 5 se rapproche &#8230;</h4><p>La <a
href="http://www.jboss.org/feeds/post/jboss_aop_2_0_0_ga_released" title="sortie officielle de la version 2.0.0 de JBoss AOP" >sortie officielle de la version 2.0.0 de JBoss AOP</a> vient d&#8217;être annoncée. Après s&#8217;être posé <a
href="http://www.nabble.com/AOP-2.0.0.GA--td20087156.html" title="la question en début de semaine" >la question en début de semaine</a>, Kabir Khan a finalement décidé de publier celle-ci. Doit-on y voir les signes avant-coureurs d&#8217;une sortie imminente du nouveau serveur d&#8217;applications made in JBoss ? Il est encore un peu tôt pour le dire. Notez tout de même que JBoss AS 5 est en RC2 depuis déjà <a
href="http://sacha.labourey.com/2008/09/15/jboss-as-is-now-ee5-certified/" title="plus d'un mois" >plus d&#8217;un mois</a>, date à laquelle il avait franchi la plus grande marche lui restant à gravir <em>(La Certification JEE)</em>.</p><p>Pour en revenir au cœur du sujet, si JBoss AOP est directement intégré au sein du futur serveur d&#8217;applications, rien ne vous empêche d&#8217;utiliser celui-ci en <em>standalone</em>. La meilleure présentation de ce framework reste l&#8217;article de 5 pages publié sur DZone cet été : <a
href="http://java.dzone.com/news/an-introduction-aspect-oriente" title="An Introduction to Aspect-Oriented programming with JBoss AOP" >An Introduction to Aspect-Oriented programming with JBoss AOP</a> qui en présente les principales nouveautés :</p><ul><li>Un nouveau mode de weaving permettant l&#8217;ajout d&#8217;<code>advices</code> autour des exceptions <em>(before / after / throwing / finally)</em>.</li><li>L&#8217;interception des accès à chaque élément d&#8217;un tableau.</li><li>Un déploiement et une mise à jour à chaud des <code>advices</code> et des <code>interceptors</code>.</li><li>Une intégration avec le microcontainer JBoss AS 5.</li></ul><p>Autres liens :</p><ul><li>Le <a
href="http://www.jboss.org/jbossaop/" title="site officiel de JBoss AOP" >site officiel de JBoss AOP</a></li><li><a
href="http://www.jboss.org/jbossaop/docs/2.0.0.GA/RELEASE_NOTES.html" title="JBoss AOP 2.0.0 Release Note" >JBoss AOP 2.0.0 Release Note</a></li></ul><h4><a
name="EmbeddedJoprpourJBossASunecons"></a>Embedded Jopr pour JBoss AS : une console JMX de nouvelle génération</h4><p>JBoss vient de mettre à disposition de la communauté une console JMX nouvelle génération pour la supervision et l&#8217;administration d&#8217;une instance du serveur JBoss AS. La console est une application web basée sur le framework Seam. Le code source de l&#8217;application est livré sous licence LGPL.</p><p>Une particularité de la nouvelle console est la possibilité d&#8217;intégrer des plugins de <a
href="http://support.rhq-project.org/display/RHQ/RHQ+Plugin+Community" title="RHQ" >RHQ</a> et <a
href="http://www.jboss.org/community/docs/DOC-12824" title="Jopr" >Jopr</a>.</p><p>La version 1.0 offre la possibilité de gérer l&#8217;instance du serveur et les instances des applications d&#8217;entreprise, de mettre à jour les configurations, de contrôler les activités et d&#8217;exécuter les scripts qui résident dans le répertoire bin du serveur JBoss AS.</p><p>Une capture d&#8217;écran de la console :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2008/10/embeddedjopr-console.jpg" border="0" alt="" /></div><p>Une présentation vidéo flash de la console Embedded Jopr en action : <a
href="http://www.jboss.org/embjopr/demo.html#" title="http://www.jboss.org/embjopr/demo.html#" >http://www.jboss.org/embjopr/demo.html#</a>.</p><h4><a
name="ExemplesdelaJSRlanouvellenouve"></a>Exemples de la JSR 203 (la nouvelle nouvelle JSR I/O)</h4><p>Les exemples concernant cette JSR NIO2 <em>(dont nous vous parlions déjà dans une <a
href="http://blog.xebia.fr/2008/07/21/revue-de-presse-xebia-66/#JSRMoreNewIOAPIsfortheJavaPlat" title="revue de presse précédente" >revue de presse précédente</a>)</em> continuent d&#8217;affluer.</p><p>Récemment, c&#8217;est Alex Miller <em>(<a
href="http://tech.puredanger.com/2008/10/22/some-jsr-203-examples/" title="examples">examples</a> and <a
href="http://tech.puredanger.com/2008/10/25/more-jsr203-features" title="more features">more features</a>)</em> qui nous propose des exemples d&#8217;utilisation balayant quelques nouvelles fonctionnalités de cette API.</p><p>Parmi ces changements, et pour ne garder que ceux qui nous simplifieront la vie <em>(et surtout les lignes de code)</em>, nous retiendrons :</p><ul><li><strong>L&#8217;objet central n&#8217;est plus <code>File</code> mais <code>Path</code></strong> : il faudra donc, comme pour le <a
href="http://help.eclipse.org/help32/index.jsp?topic=/org.eclipse.platform.doc.isv/reference/api/org/eclipse/core/runtime/Path.html" title="Path d'Eclipse RCP" >Path d&#8217;Eclipse RCP</a>, raisonner en &laquo;&nbsp;segments&nbsp;&raquo; (une liste de noms) représentant une hiérarchie, le dernier niveau représentant le fichier ou le dossier pointé.</li><li><strong>Méthodes <code>copyTo</code> et <code>moveTo</code> directement intégrées à l&#8217;objet</strong> : et oui, terminé les Streams pour une copie ou un déplacement ! Il suffit d&#8217;avoir le <code>Path</code> d&#8217;origine, de définir le <code>Path</code> de destination et d&#8217;opérer directement l&#8217;opération souhaitée telle que <code>fromPath.copyTo(toPath)</code> ou <code>fromPath.moveTo(toPath)</code>.</li><li><strong>Itérateurs améliorés</strong> : recherche de fichiers à partir d&#8217;un filtre (<code>DirectoryStream</code>) ou d&#8217;un visiteur (<code>SimpleFileVisitor</code>). Là encore, on a la possibilité d&#8217;effectuer un traitement métier soit sur un type de fichier spécifique <em>(défini par exemple par l&#8217;extension du fichier)</em> soit sur tous les fichiers présents dans un dossier.</li></ul><pre class="brush: java; title: ; notranslate">
// Filter
DirectoryStream xmlFiles = myFolderWithXmlFiles.newDirectoryStream(&quot;*.xml&quot;);
for (Path xmlFile : xmlFiles ) {
   // Stuff...
}
// Visitor
Files.walkFileTree(myFolerToVisit, new SimpleFileVisitor&lt;Path&gt;() {
   public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
      // Stuff...
   }
});
</pre><ul><li>Lecture des attributs des fichiers dont les principaux sont :</li></ul><pre class="brush: java; title: ; notranslate">
// Standard file attributes
BasicFileAttributes attrs = Attributes.readBasicFileAttributes(Path.get(&quot;test.xml&quot;), true);
TimeUnit scale = attrs.resolution();
new Date(scale.toMillis(attrs.creationTime));
new Date(scale.toMillis(attrs.lastAccessTime));
new Date(scale.toMillis(attrs.lastModifiedTime));
attrs.isDirectory();attrs.isFile();attrs.isSymbolicLink();attrs.isOther();attrs.size();
...
// Dos file attributes
DosFileAttributes attrs = Attributes.readDosFileAttributes(Path.get(&quot;test.xml&quot;), true);
attrs.isArchive();attrs.isReadOnly();attrs.isHidden();attrs.isSystem();
...
// Posix file attributes
PosixFileAttributes attrs = Attributes.readPosixFileAttributes(Path.get(&quot;test.xml&quot;), true);
attrs.permissions();attrs.owner();attrs.group();
...
</pre><p>Cette très attendue API est prévue pour Java 7.</p><h4><a
name="JVMbitOuimaisaveccompressionde"></a>JVM 64 bits ? Oui mais avec compression des pointeurs</h4><p>La généralisation des processeurs x86 et des systèmes d&#8217;exploitation 64 bits amène les exploitants à étudier l&#8217;utilisation de JVM 64 bits pour les serveurs d&#8217;applications Java. Si les JVM 64 bits permettent d&#8217;allouer de larges heap (> 3 Go), l&#8217;augmentation de la taille des pointeurs (de 4 à 8 octets) nuit aux performances et à la consommation mémoire (cf <a
href="http://blog.xebia.fr/2008/05/26/revue-de-presse-xebia-58/#Javabitspassisouventunebonneid" title="Revue de Presse du 26/05/2008" >Revue de Presse du 26/05/2008</a>).</p><p>C&#8217;est ce que montre David Dagastine, Java Platform Performance Lead, dans son article <a
href="http://blogs.sun.com/dagastine/entry/no_tuning_required_java_se" title="<strong>No Tuning Required: Java SE Out-of-Box Vs. Tuned Performance</strong>&nbsp;&raquo; >*No Tuning Required: Java SE Out-of-Box Vs. Tuned Performance*</a>. Lorsque Sun configure ses JVM x86 pour <a
href="http://www.spec.org/jbb2005/" title="SpecJbb2005" >SpecJbb2005</a>, la mémoire allouée à la JVM 64 bits est le double de celle allouée à la version 32 bits alors que les performances de cette version 32 bits sont tout de même 13% meilleures que celles de la version 64 bits.</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2008/10/oobvtuned-1.jpg" border="0" alt="" /></div><p>Marcus Lagergren (BEA Systems) et Bob Kasten (Intel) exposent la parade mise en place par BEA :<br
/> <strong><a
href="http://www.bea.com/dev2dev/events/webinarMay31.ppt" title="Oracle/BEA : Aim High with JRockit on Intel Architecture">Oracle/BEA : Aim High with JRockit on Intel Architecture</a></strong></p><p>JRockit 64 bits offre depuis la version 5.0-R26.4 un mécanisme de compression des pointeurs (<a
href="http://edocs.bea.com/jrockit/jrdocs/refman/optionXX.html#wp1021022" title="-XXcompressedRefs" >-XXcompressedRefs</a>, activé par défaut si la taille de la heap est inférieure à 4 Gb) pour concilier les performances et la consommation mémoire des JVM 32 bits avec l&#8217;allocation de larges Heap spécifique aux 64 bits.</p><p><a
href="http://edocs.bea.com/jrockit/releases/5026x/relnotes/relnotes.html#wp1077669" title="JRockit 5.0 R26-4 release notes" >JRockit 5.0 R26-4 release notes</a> : <em>&laquo;&nbsp;Compressed references has greatly increased the performance on 64-bit platforms.&nbsp;&raquo;</em></p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2008/10/specjbb.gif" border="0" alt="" /></div><p><strong>Aujourd&#8217;hui, seuls les mécanismes de compression de pointeurs disponibles sur les JVM JRockit 5.0+ et IBM 6.0 permettent d&#8217;utiliser des JVM 64 bits sans dégradation des performances (10-20%) ni augmentation de la consommation heap (> 50%). Ces mécanismes ne sont pas encore disponibles sur la JVM de Sun.</strong></p><p>Pour conclure, on citera les communications &laquo;&nbsp;officielles&nbsp;&raquo; de Sun et d&#8217;IBM sur ce sujet :</p><p><strong><a
href="http://java.sun.com/docs/hotspot/HotSpotFAQ.html#64bit_performance" title="Sun : FAQ About the Java HotSpot VM / What are the performance characteristics of 64-bit versus 32-bit VMs?" >Sun : FAQ About the Java HotSpot VM / What are the performance characteristics of 64-bit versus 32-bit VMs?</a></strong></p><p><em>&laquo;&nbsp;Generally, the benefits of being able to address larger amounts of memory come with a small performance loss in 64-bit VMs versus running the same application on a 32-bit VM. This is due to the fact that every native pointer in the system takes up 8 bytes instead of 4.</em><br
/> <em>&#8230;</em><br
/> <em>The performance difference comparing an application running on a 64-bit platform versus a 32-bit platform on SPARC is on the order of 10-20% degradation when you move to a 64-bit VM.&nbsp;&raquo;</em></p><p><strong><a
href="http://www-01.ibm.com/support/docview.wss?uid=swg27013860" title="IBM Java Technology Center: What's the Difference Between 32 and 64 Bit Java?" >IBM Java Technology Center: What&#8217;s the Difference Between 32 and 64 Bit Java?</a> (<a
href="http://www-01.ibm.com/support/docview.wss?uid=swg27013860&#038;aid=1" title="pdf">pdf</a>)</strong></p><p><em>&laquo;&nbsp;At Java 5, 64 bit can be around 20% slower than corresponding 32 bit runtime</em><br
/> <em>&#8230;</em><br
/> <em>We assume a ~20-30% increase in object size heap consumption &#8211; but can be much larger&nbsp;&raquo;</em></p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/10/27/revue-de-presse-xebia-80/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Diagnostic d&#8217;une JVM à distance</title><link>http://blog.xebia.fr/2008/10/22/diagnostic-dune-jvm-a-distance/</link> <comments>http://blog.xebia.fr/2008/10/22/diagnostic-dune-jvm-a-distance/#comments</comments> <pubDate>Wed, 22 Oct 2008 08:28:07 +0000</pubDate> <dc:creator>Benoit Moussaud</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JVM]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=878</guid> <description><![CDATA[Développer une application Java, c&#8217;est bien. La rendre performante, c&#8217;est mieux. Cependant, qui dit &#171;&#160;performance&#160;&#187;, dit &#171;&#160;mesure&#160;&#187;. En effet, il est nécessaire de pouvoir : connaître les paramètres de lancement de la JVM, mesurer l&#8217;empreinte mémoire et le comportement du Garbage Collector, Cet article va décrire dans une première partie les différents outils permettant de [...]]]></description> <content:encoded><![CDATA[<p><em>Développer une application Java, c&#8217;est bien. La rendre performante, c&#8217;est mieux.</em></p><p>Cependant, qui dit &laquo;&nbsp;performance&nbsp;&raquo;, dit &laquo;&nbsp;mesure&nbsp;&raquo;. En effet, il est nécessaire de pouvoir :</p><ul><li>connaître  les paramètres de lancement de la JVM,</li><li>mesurer l&#8217;empreinte mémoire et le comportement du Garbage Collector,</li></ul><p>Cet article va décrire dans une première partie les différents outils permettant de collecter ces informations en local. La seconde partie se concentre sur les moyens pour obtenir ces <strong>mêmes</strong> informations à distance.</p><h3><a
name="Enlocal"></a>En local&#8230;</h3><p>Au fur et à mesure des différentes versions et afin d&#8217;obtenir les meilleures performances, la machine virtuelle Java (JVM) s&#8217;est dotée d&#8217;outils de diagnostic. Les principaux sont:</p><ul><li><a
href="http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jps.html" title="jps" >jps</a> liste l&#8217;ensemble des JVM qui s&#8217;exécutent sur un système.</li></ul><pre class="brush: bash; title: ; notranslate">
#jps -l
22791 weblogic.Server
18602 sun.tools.jps.Jps
5697 weblogic.Server
16937 activity.jar
6324 weblogic.Server
</pre><ul><li><a
href="http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstat.html" title="jstat" >jstat</a> affiche les statistiques d&#8217;une JVM sur sa gestion mémoire et le compilateur JIT.</li></ul><pre class="brush: bash; title: ; notranslate">
#jstat -gcutil 16937 1s
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
  0.00  99.96   0.00  89.53  33.10   1274   71.231   194   69.937  141.167
 83.53   0.00  65.48  77.26  33.10   1275   71.285   194   70.610  141.895
 83.53   0.00  75.30  77.26  33.10   1275   71.285   194   70.610  141.895
 83.53   0.00  84.44  77.26  33.10   1275   71.285   194   70.610  141.895
 83.53   0.00  96.26  77.26  33.10   1275   71.285   194   70.610  141.895
  0.00  99.77   0.00  90.35  33.10   1276   71.391   195   70.610  142.001
  0.00   0.00   4.87   0.73  33.11   1276   71.391   195   70.749  142.140
  0.00   0.00  10.18   0.73  33.11   1276   71.391   195   70.749  142.140
  0.00   0.00  29.65   0.73  33.11   1276   71.391   195   70.749  142.140
</pre><ul><li><a
href="http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html" title="jconsole" >jconsole</a> est une application graphique Swing qui affiche des informations sur la mémoire, les threads, les classes et les MBeans.</li></ul><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2008/10/jconsole.jpg"><img
src="http://blog.xebia.fr/wp-content/uploads/2008/10/jconsole-300x251.jpg" alt="" title="jconsole" width="300" height="251" class="aligncenter size-medium wp-image-881" /></a></div><ul><li><a
href="https://visualvm.dev.java.net/" title="visualvm" >visualvm</a> est également une application graphique qui reprend les informations affichées par JConsole mais en allant plus loin (ex: Détection de Contentions Thread). Livré avec le JDK de sun depuis la version JDK 6 update 7, VisualVM pourrait avec le temps  remplacer complètement JConsole</li></ul><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2008/10/visualvm.jpg"><img
src="http://blog.xebia.fr/wp-content/uploads/2008/10/visualvm-300x213.jpg" alt="" title="visualvm" width="300" height="213" class="aligncenter size-medium wp-image-883" /></a></div><ul><li><strong><a
href=" http://java.sun.com/performance/jvmstat/visualgc.html" title="visualgc" ><strong>visualgc</strong> </a></strong> affiche sous forme graphique les informations que l&#8217;on peut obtenir sur le garbage collector avec jstat. cette application n&#8217;est pas packagée avec la jvm, elle est disponible séparément avec les outils <a
href="http://java.sun.com/performance/jvmstat/" title="jvmstat" >jvmstat</a>. de plus, elle fonctionne avec les jvm 1.4.<div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2008/10/visualgc.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2008/10/visualgc-300x266.png" alt="" title="visualgc" width="300" height="266" class="aligncenter size-medium wp-image-882" /></a></div></li></ul><h3><a
name="Etdistance"></a>Et à distance &#8230; ?</h3><p>Par défaut, tous ces outils doivent être lancés sur la système d&#8217;exploitation où s&#8217;exécute la JVM à diagnostiquer. Cependant les contraintes de sécurité des entreprises interdisent parfois d&#8217;accéder physiquement à la machine. Dans le meilleur des cas, il est possible d&#8217;obtenir une connexion distante (Windows RDP, Telnet ou SSH), mais souvent avec des niveaux d&#8217;accréditations trop faibles pour pouvoir exécuter les commandes listées ci-dessus. Alors comment faire ?</p><p>Sun a pensé à tout. Si on regarde de prés une distribution d&#8217;une JVM, on remarque un binaire de type démon &#8216;jstatd&#8217;.</p><ul><li><a
href="http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstatd.html" title="jstatd" >jstatd</a> est un démon qui surveille la création et la destruction des JVM et fourni une interface qui permet à des outils distants de se connecter aux JVM qui s&#8217;exécutent sur la machine. Exactement ce qu&#8217;il nous faut, non ?</li></ul><p>Le moyen le plus simple est d&#8217;exécuter jstatd de la façon suivante:</p><pre class="brush: bash; title: ; notranslate">
#nohup jstatd -J-Djava.security.policy=all.policy &amp;
#cat all.policy
grant codebase &quot;file:${java.home}/../lib/tools.jar&quot; {
   permission java.security.AllPermission;
};
#
</pre><p>A partir de ce moment, il est possible d&#8217;utiliser les logiciels présentés ci-dessus.</p><ul><li><strong>jps</strong>, en précisant le nom de la machine distante. Noter l&#8217;apparition d&#8217;un nouveau processus java:  sun.tools.jstatd.Jstatd</li></ul><pre class="brush: bash; title: ; notranslate">
D:xebia-blog&gt;jps -l myremoteserver
5697 weblogic.Server
28636 sun.tools.jstatd.Jstatd
22791 weblogic.Server
29726 activity.jar
6324 weblogic.Server
</pre><ul><li><strong>jstatd</strong> et <strong>visualgc</strong> en précisant le <em>virtual machine identifier</em> avec le format lvmid@servername</li></ul><pre class="brush: bash; title: ; notranslate">
D:xebia-blog&gt;jstat -gcutil 29726@myremoteserver 1s
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
  0,00  99,78   0,00  83,38  33,14   8476  474,694  1227  445,801  920,495
  0,00  99,78   0,00  83,38  33,14   8476  474,694  1227  445,801  920,495
  0,00  78,41  77,46  42,98  33,14   8478  474,784  1227  446,133  920,917
 79,47   0,00  43,86  78,69  33,14   8481  474,971  1227  446,133  921,104
  0,00  82,64  76,48  63,39  33,13   8484  475,206  1228  446,649  921,855
  0,00  82,64  76,48  63,39  33,13   8484  475,206  1228  446,649  921,855
 85,47   0,00  77,78  74,92  33,13   8485  475,350  1228  446,649  921,999
</pre><ul><li>Au lancement de <strong>visualvm</strong>, il suffit d&#8217;ajouter le nom du serveur &#8216;myremoteserver&#8217; au noeud <em>remote</em> pour voir apparaître l&#8217;ensemble des JVM s&#8217;exécutant sur ce serveur. Il est possible alors de se connecter à l&#8217;une des machines virtuelles pour pouvoir avoir accès à:</li><li>Onglet <strong>Overview</strong> donne des informations générales (PID, Host, JVM Version, JVM Flags)</li></ul><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2008/10/visualvm-jstatd-overview.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2008/10/visualvm-jstatd-overview-300x290.png" alt="" title="visualvm-jstatd-overview" width="300" height="290" class="aligncenter size-medium wp-image-886" /></a></div><ul><li>Onglet <strong>Monitor</strong> affiche des graphiques sur la consommation de ressources (Mémoire, Threads, &#8230;)</li></ul><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2008/10/visualvm-jstatd-monitor.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2008/10/visualvm-jstatd-monitor-300x290.png" alt="" title="visualvm-jstatd-monitor" width="300" height="290" class="aligncenter size-medium wp-image-885" /></a></div><p>La copie d&#8217;écran suivante montre <strong>visualgc</strong> intégré sous forme de plugin dans <strong>visualvm</strong></p><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2008/10/visualvm-jstatd-visualgc-2.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2008/10/visualvm-jstatd-visualgc-2-300x292.png" alt="" title="visualvm-jstatd-visualgc-2" width="300" height="292" class="aligncenter size-medium wp-image-880" /></a></div><p>Cependant l&#8217;utilisation seule de <strong>jstatd</strong> n&#8217;est pas suffisante si l&#8217;on veut avoir accès aux MBeans JMX par <strong>jconsole</strong> et à l&#8217;activité des Threads avec <strong>visualvm</strong>. Il est nécessaire d&#8217;ajouter les paramètres suivants au <em>démarrage</em> de la JVM</p><pre class="brush: bash; title: ; notranslate">
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
</pre><p>il est alors possible de connecter <strong>jconsole</strong> en utilisant la commande suivante:</p><pre class="brush: bash; title: ; notranslate">
D:xebia-blog&gt;jconsole myremoteserver:9999
</pre><p>Avec l&#8217;outil <strong>visualvm</strong>, deux nouveaux onglets sont maintenant disponibles:</p><ul><li>Onglet <strong>Threads</strong> affiche l&#8217;activité de l&#8217;ensemble des threads et permet d&#8217;obtenir facilement un thread dump</li></ul><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2008/10/visualvm-jstatd-thread.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2008/10/visualvm-jstatd-thread-300x292.png" alt="" title="visualvm-jstatd-thread" width="300" height="292" class="aligncenter size-medium wp-image-887" /></a></div><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2008/10/visualvm-jstatd-threadump.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2008/10/visualvm-jstatd-threadump-300x292.png" alt="" title="visualvm-jstatd-threadump" width="300" height="292" class="aligncenter size-medium wp-image-888" /></a></div><ul><li>Onglet <strong>MBeans</strong> affiche l&#8217;ensemble des MBeans JMX</li></ul><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2008/10/visualvm-jstatd-mbeans.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2008/10/visualvm-jstatd-mbeans-300x292.png" alt="" title="visualvm-jstatd-mbeans" width="300" height="292" class="aligncenter size-medium wp-image-884" /></a></div><h3><a
name="Enlocal"></a>Conclusion</h3><p>Vous êtes maintenant armés pour scruter votre application qui s&#8217;exécute dans votre JVM. Vouloir rendre votre application performante est une bonne idée. Cependant, l&#8217;expérience montre qu&#8217;il faut commencer absolument par analyser le code Java.<br
/> Exemple: Traitements inutiles ou redondants, accès à la base de données peu efficaces (trop ou pas assez de données manipulées),&#8230;<br
/> Il n&#8217;existe pas de paramètre magique dans la JVM (ou dans le Serveur d&#8217;application) qui permet à une application mal écrite de devenir performante.</p><p>Ce n&#8217;est que par la suite que l&#8217;on peut <em>tuner</em> la JVM. Si vous vous lancez dans cette aventure (passionnante) commencez par lire cet article de Kirk Pepperdine ,<br
/> <a
href="http://kirk.blog-city.com/advice_on_jvm_heap_tuning_dont_touch_that_dial.htm" title="My advice on JVM heap tuning, keep your fingers off the knobs!" >My advice on JVM heap tuning, keep your fingers off the knobs!</a></p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/10/22/diagnostic-dune-jvm-a-distance/feed/</wfw:commentRss> <slash:comments>10</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2008/09/22/revue-de-presse-xebia-75/</link> <comments>http://blog.xebia.fr/2008/09/22/revue-de-presse-xebia-75/#comments</comments> <pubDate>Mon, 22 Sep 2008 16:50:51 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JVM]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[Mockito]]></category> <category><![CDATA[Tomcat]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=720</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Agilité Discipline et agilité Le coin de la technique Fragmentation mémoire et JVM, compactez votre &#8216;Gros Tas&#8217; Indiscrétions sur Maven 2.1.0 Améliorer les performances de Tomcat en production Mockito s&#8217;offre un lifting. Java EE 6 et ses RI Des nouvelles de Java SE 7 [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Agilité</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/09/22/revue-de-presse-xebia/#Disciplineetagilit">Discipline et agilité</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/09/22/revue-de-presse-xebia/#FragmentationmmoireetJVMcompac">Fragmentation mémoire et JVM, compactez votre &#8216;Gros Tas&#8217;</a></li><li><a
href="http://blog.xebia.fr/2008/09/22/revue-de-presse-xebia/#IndiscrtionssurMaven">Indiscrétions sur Maven 2.1.0</a></li><li><a
href="http://blog.xebia.fr/2008/09/22/revue-de-presse-xebia/#AmliorerlesperformancesdeTomca">Améliorer les performances de Tomcat en production</a></li><li><a
href="http://blog.xebia.fr/2008/09/22/revue-de-presse-xebia/#Mockitosoffreunlifting">Mockito s&#8217;offre un lifting.</a></li><li><a
href="http://blog.xebia.fr/2008/09/22/revue-de-presse-xebia/#JavaEEetsesRI">Java EE 6 et ses RI</a></li><li><a
href="http://blog.xebia.fr/2008/09/22/revue-de-presse-xebia/#DesnouvellesdeJavaSE">Des nouvelles de Java SE 7 &#8230;</a></li></ul><h3><a
name="Agilit"></a>Agilité</h3><h4><a
name="Disciplineetagilit"></a>Discipline et agilité</h4><p>Dans cet <a
href="http://www.aubryconseil.com/dotclear/index.php/2008/09/17/471-l-agilite-oui-la-chienlit-non" title="article" >article</a>, Claude Aubry nous rappelle que l&#8217;agilité possède des règles à respecter. En effet nombreux sont ceux qui pensent que l&#8217;agilité permet de faire face aux imprévus plus rapidement. Ce n&#8217;est pas tout le temps le cas, car l&#8217;agilité possède des règles qu&#8217;il faut respecter (gestion du backlog, des priorités&#8230;) afin que les sprints se déroulent dans de bonnes conditions.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="FragmentationmmoireetJVMcompac"></a>Fragmentation mémoire et JVM, compactez votre &#8216;Gros Tas&#8217;</h4><p>Si la description des différents algorithmes de Garbage Collection se trouve relativement facilement <a
href=" http://blog.xebia.fr/2008/03/12/gc-generationnels-traditionnels-jdk6-vs-gc-garbage-first-jdk7/" title="sur le Web" >sur le Web</a>, peu décrivent comment ceux-ci gèrent la fragmentation de la <em>heap</em>.  Même si la durée de vie des objets est en moyenne très courte (dans une application de gestion), la JVM ne peut échapper à la gestion d&#8217;objets plus gros dont la durée de vie est plus importante. La fragmentation de la mémoire est inévitable. On estime que celle-ci peu atteindre facilement 10% de la mémoire pour des applications 24/7 et par conséquent peut être la cause d&#8217;<code>OutOfMemory</code>.<br
/> Dans son article <a
href=" http://deepheap.blogspot.com/2008/09/ghost-in-java-virtual-machine.html" title="Ghost in the Java Virtual Machine" >Ghost in the Java Virtual Machine</a>, <a
href="http://www.jguru.com/guru/viewbio.jsp?EID=780589" title="Nick Maiorano" >Nick Maiorano</a> nous décrit les différents mécanismes de compaction dont sont tirés ces grands principes.<br
/> Deux principes de compaction :</p><ul><li>Garder une trace des fragments et les réallouer dès que c&#8217;est possible. Ceci implique le déplacement d&#8217;objets et la mise à jour des objets les référençant. Cette opération n&#8217;est rendue possible que lors d&#8217;un <em>Full GC</em>. Second problème, avec ce mécanisme, il se peut que deux objets créés simultanément se référençant l&#8217;un l&#8217;autre soient dispatchés sur deux pages physiques de la mémoire.</li><li>Copier les objets vivants dans une autre part de la mémoire en les agençant les uns après les autres. Avec cette méthode la mémoire est constamment réorganisée et les objets se retrouvent concentrés dans une même zone de la mémoire, ce qui peut améliorer les performances.</li></ul><p>Nous vous laissons consulter le reste de l&#8217;article comparant le fonctionnement des algorithmes de compaction des JVM JRockit de BEA et Hotspot de Sun.</p><h4><a
name="IndiscrtionssurMaven"></a>Indiscrétions sur Maven 2.1.0</h4><p>Deux articles intéressants sur <a
href="http://blogs.exist.com/bporter/" title="le blog de Brett Porter" >le blog de Brett Porter</a>, commiteur Maven.<br
/> Un article sur <a
href="http://blogs.exist.com/bporter/2008/09/19/apache-maven-210-m1-released/" title="la mise en ligne de Maven 2.1.0 milestone 1" >la mise en ligne de Maven 2.1.0 milestone 1</a>, avec une liste de quelques fonctionnalités qui seront ajoutées à cette version (en plus de meilleures performances).<br
/> Et un article sur <a
href="http://blogs.exist.com/bporter/2008/09/19/reactor-my-new-favourite-maven-plugin/" title="le plugin reactor" >le plugin reactor</a>, qui apporte quelques fonctionnalités que l&#8217;on devrait retrouver intégrées de base à Maven 2.1. Le scénario suivant est donné en exemple: un build de 10 minutes plante au bout de 9 minutes à cause d&#8217;une erreur sur une dépendance. L&#8217;erreur est corrigée, et le plugin reactor permet de reprendre le build là où il a planté. Sympathique!</p><h4><a
name="AmliorerlesperformancesdeTomca"></a>Améliorer les performances de Tomcat en production</h4><p>La configuration par défaut de Tomcat répond à la plupart des besoins en production. Il est en outre facile de tuner légèrement le serveur d&#8217;application afin d&#8217;optimiser les performances de celui-ci.<br
/> Filip Hanik et Mark Thomas nous donnent quelques pistes dans leur <a
href="http://www.springsource.com/files/u1/PerformanceTuningApacheTomcat-Part2.pdf" title="Webinar hébergé par SpringSource" >Webinar hébergé par SpringSource</a>.<br
/> Nous listerons ici les principaux faits marquants de cette optimisation, vus à travers 3 grands sujets (nous ne traiterons volontairement pas ici les optimisations de JVM, plus &laquo;&nbsp;convenues&nbsp;&raquo;).</p><p><strong>Tuning des logs</strong></p><ul><li>Le fichier catalina.out de sortie de la console (<code>java.util.logging.ConsoleHandler</code>) a pour limitation de ne pas offrir de rotation. Il y a donc un risque d&#8217;overflow. On peut remplacer ce <em>handler</em> par un <code>org.apache.juli.FileHandler</code> (rotations quotidiennes) ou un <code>java.util.logging.FileHandler</code> (rotations par date ou au volume de fichier pour prévenir la saturation des disques).</li><li>Le <em>logger</em> par défaut est synchrone, ce qui peut devenir un goulet d&#8217;étranglement. L&#8217;utilisation d&#8217;un <em>logger</em> asynchrone peut donc améliorer les performances mais aucune implémentation n&#8217;est incluse dans Tomcat.</li></ul><p><strong>Tuning HTTP et TCP/IP</strong><br
/> Avant de s&#8217;attaquer à ces améliorations, il est important de comprendre les protocoles TCP / IP, le fonctionnement du CPU et les concepts de load balancing.</p><ul><li>Sessions TCP : Http Keep alive permet d&#8217;améliorer les temps de réponse en évitant quelques handshakes TCP ; cependant, l&#8217;accroissement de la consommation de ressources serveurs peut nuire aux sites à forte concurrence d&#8217;accès.</li><li>TCP Flow Control : bien que l&#8217;API Servlet repose sur des IO bloquantes, Tomcat optimise le service du contenu statique avec les connecteurs NIO et APR, grâce à la méthode non bloquante SEND_FILE.</li><li>Principaux paramètres à configurer :<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;<code>maxThreads</code> : typiquement entre 200 et 800, 400 étant une bonne valeur initiale.<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;<code>maxKeepAliveRequests</code> : typiquement entre 100 et 200 (SSL, APR / NIO connector) ou 1 pour désactiver &laquo;&nbsp;Keep Alive&nbsp;&raquo; (pas de SSL, BIO connector, très forte concurrence, etc).<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;<code>acceptCount</code> (backlog TCP) : typiquement entre 50 et 300.<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;<code>connectionTimeout</code> (SO_TIMEOUT), le temps maximum entre deux paquets TCP : entre 2000 à 3000 ms est souvent optimal, même en activant Keep Alive.</li></ul><p><strong>Quel connecteur choisir?</strong><br
/> Cela dépend des besoins de l&#8217;application :</p><ul><li><strong>Blocking IO Connector</strong> :<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;La majorité du contenu est dynamique<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Keep-Alive n&#8217;est pas important<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;La fiabilité est une priorité</li><li><strong>Apache Portable Runtime/APR Connector</strong> :<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Tomcat gère l&#8217;encryption SSL : l&#8217;implémentation SSL d&#8217;APR (Open SSL) est beaucoup plus rapide que celle des JVM et les handshakes SSL non bloquants améliorent les performances<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Keep-Alive est important<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Une grande partie du contenu est statique<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;La fonctionnalité Comet de Tomcat nécessite un connecteur non bloquant (APR ou NIO)</li><li><strong>NIO Connector</strong> :<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Connecteur non bloquant comme l&#8217;APR connector<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;A la différence de l&#8217;APR connector qui nécessite la librairie native APR, le NIO connecteur est portable sur toutes les plateformes<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Le NIO connector ne bénéficie par de l&#8217;optimisation SSL apportée par Open SSL</li><li><strong>AJP Connector</strong> :<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Déconseillé, il n&#8217;est pas plus performant que les connecteurs HTTP et est en revanche difficile à troubleshooter.</li></ul><p>Dans le doute, utiliser le connecteur BIO (le plus mûr, qui ne crashera pas et qui auto gère le <em>keep alive</em>)</p><p><strong>Contenu statique</strong></p><ul><li>Les connecteurs APR et NIO offrent l&#8217;optimisation SEND_FILE</li><li>Tomcat offre un cache (e.g. <code>&lt;Context cacheMaxSize="40960" cacheTTL="60000" cachingAllowed="true"&gt;</code> ) du contenu statique. Cependant, cette fonctionnalité ne rivalise pas avec un proxy cache comme Squid ou mod_cache )</li></ul><h4><a
name="Mockitosoffreunlifting"></a>Mockito s&#8217;offre un lifting.</h4><p>Si vous appliquez <a
href="http://blog.xebia.fr/2008/04/11/les-10-commandements-des-tests-unitaires/" title="les 10 commandements des tests unitaires" >les 10 commandements des tests unitaires</a> (cf point 7), la sortie de la <a
href="http://code.google.com/p/mockito/" title="version 1.5 de Mockito" >version 1.5 de Mockito</a> devrait vous apparaître comme une bonne nouvelle.</p><p>Principale différence entre ce framework et ses concurrents (<a
href="http://www.easymock.org/" title="EasyMock" >EasyMock</a> et <a
href="http://www.jmock.org/" title="JMock" >JMock</a>), Mockito peut se passer d&#8217;<em>expectations</em> et vérifier le comportement d&#8217;un objet à posteriori. Cette fonctionnalité permet de considérablement réduire la taille du setup des tests, et de les rendre plus lisibles.</p><p>De plus, comme Mockito possède une syntaxe très similaire à celle d&#8217;EasyMock, il est facile de refactorer quelques tests pour l&#8217;essayer, et pourquoi pas l&#8217;adopter.</p><h4><a
name="JavaEEetsesRI"></a>Java EE 6 et ses RI</h4><p>Cette semaine, <a
href="http://www.antoniogoncalves.org/xwiki/bin/view/Main/AboutMe" title="Antonio Goncalves" >Antonio Goncalves</a>, membre de l&#8217;<em>expert group</em> des JSR Java EE et co-fondateur du <a
href="http://www.parisjug.org" title="Paris Jug" >Paris Jug</a> , nous rappelle l&#8217;arrivée prochaine de <a
href="http://blog.xebia.fr/2008/03/03/revue-de-presse-xebia-46/#JavaEE6profiles" title="Java EE 6" >Java EE 6</a> début 2009 et récapitule la liste des principales <a
href=" http://www.jroller.com/agoncal/entry/java_ee_6_reference_implementations" title="implémentations de références" >implémentations de références</a> des différentes briques et <a
href="http://jcp.org/en/jsr/detail?id=316" title="ses spécifications" >ses spécifications</a> :</p><table
cellspacing="0" cellpadding="5" style="border: 1px solid black"><tr><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong> Spécifications </strong></td><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong> RI </strong></td></tr><tr><td
style="border: 1px solid black"> <a
href="http://jcp.org/en/jsr/detail?id=3168">EJB 3.1</a> <a
href="http://jcp.org/en/jsr/detail?id=315">Servlets 3.0</a></td><td
style="border: 1px solid black"> <a
href="http://wiki.glassfish.java.net/Wiki.jsp?page=PlanForGlassFishV3">GlassFish V3</a></td></tr><tr><td
style="border: 1px solid black"> <a
href="http://jcp.org/en/jsr/detail?id=317">JPA 2.0</a></td><td
style="border: 1px solid black"> <a
href="http://www.eclipse.org/eclipselink/">EclipseLink</a></td></tr><tr><td
style="border: 1px solid black"> <a
href="http://jcp.org/en/jsr/detail?id=299">Web Beans 1.0</a></td><td
style="border: 1px solid black"> <a
href="http://jboss.com/products/seam">JBoss Seam</a></td></tr><tr><td
style="border: 1px solid black"> <a
href="http://jcp.org/en/jsr/detail?id=314">JSF 2.0</a></td><td
style="border: 1px solid black"> <a
href="https://javaserverfaces.dev.java.net/">Mojarra</a></td></tr><tr><td
style="border: 1px solid black"> <a
href="http://jcp.org/en/jsr/detail?id=311">JAX-RS 1.0</a></td><td
style="border: 1px solid black"> <a
href="https://jersey.dev.java.net/">Jersey</a></td></tr><tr><td
style="border: 1px solid black"> <a
href="http://jcp.org/en/jsr/detail?id=224">JAX-WS 2.2</a></td><td
style="border: 1px solid black"> <a
href="https://metro.dev.java.net/">Metro</a></td></tr></table><p>Une preview de Java EE 6 a d&#8217;ailleurs été effectuée ce mois-ci au Priceton JUG dont voici <a
href="http://openwebdeveloper.sys-con.com/node/668618" title="le résumé" >le résumé</a>. Une session également en préparation au Paris JUG, elle est pour le moment prévue pour <a
href="http://www.parisjug.org/xwiki/bin/view/Meeting/20090113" title="janvier prochain" >janvier prochain</a>.</p><h4><a
name="DesnouvellesdeJavaSE"></a>Des nouvelles de Java SE 7 &#8230;</h4><p>Ah non, fausse alerte ! Point d&#8217;Umbrella JSR à l&#8217;horizon &#8230;</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/09/22/revue-de-presse-xebia-75/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2008/09/15/revue-de-presse-xebia-74/</link> <comments>http://blog.xebia.fr/2008/09/15/revue-de-presse-xebia-74/#comments</comments> <pubDate>Mon, 15 Sep 2008 15:48:03 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JavaPolis]]></category> <category><![CDATA[JavaScript]]></category> <category><![CDATA[JVM]]></category> <category><![CDATA[Performance]]></category> <category><![CDATA[Web]]></category> <category><![CDATA[Websphere]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=654</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Le coin de la technique invokedynamic vu de l&#8217;intérieur Concurrency : past and present Tuning des JVM Websphere 6.1 Performance d&#8217;affichage d&#8217;une page Web Evènements de notre communauté en France et à l&#8217;étranger Refactoring itératif de conférences : JavaPolis, Javoxx et DeVox Le coin [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/09/15/revue-de-presse-xebia/#invokedynamicvudelintrieur"><code>invokedynamic</code> vu de l&#8217;intérieur</a></li><li><a
href="http://blog.xebia.fr/2008/09/15/revue-de-presse-xebia/#Concurrencypastandpresent">Concurrency : past and present</a></li><li><a
href="http://blog.xebia.fr/2008/09/15/revue-de-presse-xebia/#TuningdesJVMWebsphere">Tuning des JVM Websphere 6.1</a></li><li><a
href="http://blog.xebia.fr/2008/09/15/revue-de-presse-xebia/#PerformancedaffichagedunepageW">Performance d&#8217;affichage d&#8217;une page Web</a></li></ul><p><strong>Evènements de notre communauté en France et à l&#8217;étranger</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/09/15/revue-de-presse-xebia/#Refactoringitratifdeconfrences">Refactoring itératif de conférences : JavaPolis, Javoxx et DeVox</a></li></ul><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="invokedynamicvudelintrieur"></a><code>invokedynamic</code> vu de l&#8217;intérieur</h4><p>Dans <a
href="http://blog.headius.com/2008/09/first-taste-of-invokedynamic.html" title="cet article" >cet article</a>, Charles Nutter, <em>JRuby Core Developper</em> nous présente pourquoi il est nécessaire de mettre à jour le bytecode <code>invokedynamic</code>.<br
/> Java nous oblige à typer chaque variable et chaque méthode doit définir une signature statique dont les types sont connus avant le Runtime : Java est un langage  &#8216;statiquement&#8217; typé. Si ce typage fort est une des forces du langage, comment la JVM peut-elle supporter des langages dynamiques ? La rigidité de Java provient, plus de son langage que de son bytecode. C&#8217;est ainsi que des langages comme Groovy permettent d&#8217;enfreindre certaines règles, par exemple : ne pas définir de types aux variables.  Ce n&#8217;est pas pour autant que le bytecode va tout nous permettre, certaines règles sont incassables dont celles qui s&#8217;appliquent aux invocations de méthodes :</p><ul><li>Les invocations sont statiquement typées.</li><li>Les invocations doivent s&#8217;effectuer sur des méthodes Java. Il est impossible de remplacer un appel à une méthode par un morceau de code interprété.</li></ul><p>À l&#8217;origine, la <a
href="http://jcp.org/en/jsr/detail?id=292" title="JSR-292" >JSR-292</a> a proposé la mise en place d&#8217;un nouveau code <code>invokedynamic</code> permettant l&#8217;invocation de méthodes sans signatures typées statiquement, mais rien n&#8217;avait été prévu pour modifier dynamiquement la logique d&#8217;invocation de la JVM.</p><h4><a
name="Concurrencypastandpresent"></a>Concurrency : past and present</h4><p>Brian Goetz, auteur du livre &#8216;Java Concurrency In Practice&#8217;, a publié sur InfoQ une vidéo enregistrée lors du QCon 2007 : <a
href=" http://www.infoq.com/presentations/goetz-concurrency-past-present" title="Concurrency : Past and Present" >Concurrency : Past and Present</a>.<br
/> Pourquoi est-il plus difficile de développer des applications multithreadées que de parler en lisant son journal ?<br
/> Dans cette présentation, Brian tente de répondre à cette question en revenant sur les principales difficultés de la programmation concurrente. Sujet que nous avions également abordé lors d&#8217;un article publié cet été sur le sujet : <em>&laquo;&nbsp;<a
href=" http://blog.xebia.fr/2008/08/13/programmation-concurrentielle-notions-fondamentales/" title="programmation concurrente : notions fondamentales" >programmation concurrente : notions fondamentales</a>&laquo;&nbsp;</em>. Pour illustrer ces problèmes, Brian revient sur l&#8217;histoire de la programmation concurrente et ses différentes approches, avant de donner ses recommandations. À la fin de la vidéo, il présente également les fonctionnalités offertes par d&#8217;autres langages comme ErLang et Scala.</p><h4><a
name="TuningdesJVMWebsphere"></a>Tuning des JVM Websphere 6.1</h4><p>Giribabu Paramkusham et Ajay Bhalodia, WebSphere Application Server Technical Support, présentent dans <a
href="http://www-01.ibm.com/support/docview.wss?uid=swg27013400" title="JVM Performance Tuning with respect to Garbage Collection(GC) policies for WebSphere Application Server V6.1 part 1" >JVM Performance Tuning with respect to Garbage Collection(GC) policies for WebSphere Application Server V6.1 part 1</a> (<a
href="http://www-01.ibm.com/support/docview.wss?uid=swg27013400&#038;aid=1" title="pdf" >pdf</a>) les points clef du tuning des JVM pour Websphere. Nous retiendrons :</p><ul><li>Les JVM IBM proposent quatre stratégies de garbage collections :<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;<code>-Xgcpolicy:optthruput</code> pour minimiser le temps global d&#8217;exécution (batch, &#8230;).<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;<code>-Xgcpolicy:optavgpause</code> pour minimiser la durée de chaque pause.<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;<code>-Xgcpolicy:gencon</code> destiné aux applications web. L&#8217;algorithme Générationnel Concurrent communément utilisé dans les JVM Sun est optimisé pour les objets à courte durée de vie.<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;<code>-Xgcpolicy:subpools</code> pour les serveurs à grand nombre de processeurs (>16).</li><li>A la différence de l&#8217;implémentation GenCon de Sun qui comprend trois zones (Young, Tenurd et Permanent), celle d&#8217;IBM n&#8217;en comporte que deux (Young et Old)</li><li>L&#8217;option <code>-verbose:gc</code> est activable en production avec un impact négligeable sur les performances et l&#8217;option moins connue <a
href="http://publib.boulder.ibm.com/infocenter/javasdk/v5r0/index.jsp?topic=/com.ibm.java.doc.diagnostics.50/diag/appendixes/cmdline/cmdline_gc.html" title="-Xverbosegclog" ><code>-Xverbosegclog</code></a> permet de préciser un fichier de sortie en mode <em>rolling file</em> . Nous noterons que les informations de GC sont désormais formattées en XML ce qui facilitera la manipulation avec des outils.</li><li>Indépendamment des limites techniques liées au système d&#8217;exploitation, les JVM IBM sont optimisées pour utiliser des heap le plus souvent inférieures à 2 GB :</li></ul><table
cellspacing="0" cellpadding="5" style="border: 1px solid black"><tr><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong> Platform </strong></td><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong> Additional Options </strong></td><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong> Maximum Possible </strong></td><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong> Advised Maximum </strong></td></tr><tr><td
style="border: 1px solid black"> AIX</td><td
style="border: 1px solid black"> automatic</td><td
style="border: 1px solid black"> 3.25 GB</td><td
style="border: 1px solid black"> 2.5 GB</td></tr><tr><td
style="border: 1px solid black"> Linux</td><td
style="border: 1px solid black"></td><td
style="border: 1px solid black"> 2 GB</td><td
style="border: 1px solid black"> 1.5 GB</td></tr><tr><td
style="border: 1px solid black"></td><td
style="border: 1px solid black"> Hugemem Kernel</td><td
style="border: 1px solid black"> 3 GB</td><td
style="border: 1px solid black"> 2.5 GB</td></tr><tr><td
style="border: 1px solid black"> Windows</td><td
style="border: 1px solid black"></td><td
style="border: 1px solid black"> 1.8 GB</td><td
style="border: 1px solid black"> 1.5 GB</td></tr><tr><td
style="border: 1px solid black"></td><td
style="border: 1px solid black"> /3GB</td><td
style="border: 1px solid black"> 1.8 GB</td><td
style="border: 1px solid black"> 1.8 GB</td></tr><tr><td
style="border: 1px solid black"> z/OS</td><td
style="border: 1px solid black"></td><td
style="border: 1px solid black"> 1.7 GB</td><td
style="border: 1px solid black"> 1.3 GB</td></tr></table><p><em>source IBM</em></p><ul><li>L&#8217;utilisation de JVM 64 bits supprime les limites de taille de heap mais pénalisent les performances (plus de données manipulées) et la consommation mémoire (des pointeurs sur 64bits plutôt que 32bits accroissent de 30% à 50% la mémoire consommée)</li><li>La JVM 6 d&#8217;IBM réduit les dégradations de performances et de consommation mémoire en 64bits grâce à l&#8217;introduction de &laquo;&nbsp;pointeurs compressés&nbsp;&raquo;</li></ul><h4><a
name="PerformancedaffichagedunepageW"></a>Performance d&#8217;affichage d&#8217;une page Web</h4><p><a
href="http://xnme.exofire.net/" title="Hayes Potter" >Hayes Potter</a>, nous présente dans <a
href="http://www.catswhocode.com/blog/web-development/speed-up-your-website-quick-602" title="Speed up your website, quick!" >Speed up your website, quick!</a> des règles structurantes afin d&#8217;améliorer les performances d&#8217;affichage d&#8217;une page Web :</p><ul><li>Compression des ressources statiques (images, fichiers flashs, scripts, &#8230;).</li><li>Mettre en place une politique d&#8217;expiration des ressources statiques .</li><li>Mettre les styles CSS en haut de la page HTML tandis qu&#8217;il faut mettre les fichiers Javascript en bas de la page.</li><li>Limiter les requêtes <code>http://request</code> vers d&#8217;autres domaines. En effet à chaque requête vers un autre domaine, pendant le chargement de la page, une résolution DNS est effectué (<strong>accès réseaux supplémentaires</strong>).</li></ul><p>Dans le même esprit, Yahoo a mis à dispositon de la communauté des développeurs Web un ensemble de règles : <a
href="http://developer.yahoo.com/performance/rules.html" title="Exceptional Performances" >Exceptional Performances</a>.<br
/> Il y a 34 <em>Best Pratices</em> répartis dans 7 domaines différents :</p><ul><li>Contenu</li><li>Serveur</li><li>Cookie</li><li>CSS</li><li>Javascript</li><li>Image</li><li>Mobile</li></ul><p>Voici les règles les plus marquantes :</p><ul><li>Externaliser les fichiers CSS et Javascripts de la page HTML.</li><li>Réduire la taille des fichiers Javascripts en éliminant les caractères superflus (espace, variable à rallonge, &#8230;). Cela peut être assisté par des outils tel que <a
href="http://www.crockford.com/javascript/jsmin.html" title="JSMin" >JSMin</a> et <a
href="http://developer.yahoo.com/yui/compressor/" title="YUI Compressor" >YUI Compressor</a>. L&#8217;idéal c&#8217;est que les développeurs des pages gardent des fichiers Javascripts lisibles et maintenables puis au déploiement de ces pages, passer une moulinette sur les fichiers Javascripts afin d&#8217;épurer les caractères superflus.</li><li>Eviter la duplication des importations du même script, par exemple IE retéléchargera plusieurs le fichier bien que c&#8217;est la même ressource.</li><li>Utiliser une requête HTTP GET pour les requêtes AJAX.</li><li>Rassembler l&#8217;ensemble de vos images (pour les gestions des boutons par exemple) en une seule image et en faire un sprite avec CSS. Cette tache peut être assister par les outils <a
href="http://www.csssprites.com/" title="CSS Sprites" >CSS Sprites</a> et <a
href="http://spritegen.website-performance.org/" title="Website Performance CSS Sprite Generator" >Website Performance CSS Sprite Generator</a>.</li><li>Limiter l&#8217;utilisation des <code>iframe</code>.</li></ul><p>Références :</p><ul><li><a
href="http://www.dmxzone.com/ShowDetail.asp?NewsId=14958" title="Yahoo! New Performance Best Practices Now Available (Mars 2008)" >Yahoo! New Performance Best Practices Now Available (Mars 2008)</a>, excellente présentation de Stoyan Stefanox, développeur Yahoo, qui reprend point par point toutes ces <em>Best Pratices</em></li></ul><p>Voici une liste d&#8217;outils facilitant la mise en oeuvre et la vérification de ces points :</p><ul><li><a
href="http://developer.yahoo.com/yslow/" title="YSlow" >YSlow</a>, outil Yahoo aidant à la vérification de ces <em>best pratices</em></li><li><a
href="http://www.fiddlertool.com/fiddler/" title="Fiddler" >Fiddler</a>, debugger HTTP</li><li><a
href="http://www.alphaworks.ibm.com/tech/pagedetailer" title="IBM Page Detailler" >IBM Page Detailler</a>, décrire le déroulement des fichiers téléchargés pour l&#8217;affichage d&#8217;une page</li><li><a
href="https://addons.mozilla.org/fr/firefox/addon/1843" title="Firebug" >Firebug</a> (que pour firefox)</li><li><a
href="http://www.crockford.com/javascript/jsmin.html" title="JSMin" >JSMin</a>, minimiseur JavaScript</li><li><a
href="http://developer.yahoo.com/yui/compressor/" title="YUI Compressor" >YUI Compressor</a>, minimiseur Javascript</li><li><a
href="http://www.csssprites.com/" title="CSS Sprites" >CSS Sprites</a>, générateur de sprite CSS</li><li><a
href="http://spritegen.website-performance.org/" title="Website Performance CSS Sprite Generator" >Website Performance CSS Sprite Generator</a>, générateur de sprite CSS</li></ul><h3><a
name="EvnementsdenotrecommunautenFra"></a>Evènements de notre communauté en France et à l&#8217;étranger</h3><h4><a
name="Refactoringitratifdeconfrences"></a>Refactoring itératif de conférences : JavaPolis, Javoxx et DeVox</h4><p>Terminons cette revue de presse par la petite histoire belge de la semaine. L&#8217;un des plus gros événements Java au monde JavaPolis vient de <a
href="http://weblogs.java.net/blog/fabriziogiudici/archive/2008/09/javapolis_javox.html" title="changer de nom" >changer de nom</a> pour la seconde fois cette année. Renommé Javoox en début d&#8217;année, il semblerait que cet ancien nouveau nom soit encore trop proche de « Java » pour Sun. Avec ce nouveau nom : <strong>DeVoxx</strong>, le BeJug (porteur de l&#8217;événement) continue le bras de fer avec Sun en osant mettre un &#8216;V&#8217; en 3e caractère de leur nouveau nom &#8230; tout comme dans &#8216;jaVa&#8217; &#8230; La <a
href=" http://www.devoxx.com/newsletters/2008/2/index.html" title="newsletter de DeVoxx" >newsletter de DeVoxx</a> nous explique que ce nouveau changement de nom est dû à une volonté de rester un événement Java indépendant.</p><ul><li>Site officiel du <a
href="http://www.bejug.org" title="BeJug" >BeJug</a></li><li>Site officiel du <a
href="http://www.devoxx.com" title="DeVoxx" >DeVoxx</a></li><li>Consultez la liste des <a
href="http://www.devoxx.com/display/JV08/Speakers" title="intervenants" >intervenants</a> à DeVoxx 2008</li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/09/15/revue-de-presse-xebia-74/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2008/07/21/revue-de-presse-xebia-66/</link> <comments>http://blog.xebia.fr/2008/07/21/revue-de-presse-xebia-66/#comments</comments> <pubDate>Mon, 21 Jul 2008 16:45:01 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Flex]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JBoss]]></category> <category><![CDATA[JPA]]></category> <category><![CDATA[JVM]]></category> <category><![CDATA[RIA]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Virtualisation]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=410</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Dur dur d&#8217;être un (Java)Rebel RIA Vidcast de Christophe Coenraets autour de Flex Le coin de la technique Failles de sécurité dans Spring MVC Premier résultat SpecJVM2008, et alors ? Envers : JBoss ajoute à JPA le versioning des données [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/07/21/revue-de-presse-xebia/#DurdurdtreunJavaRebel">Dur dur d&#8217;être un (Java)Rebel</a></li></ul><p><strong>RIA</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/07/21/revue-de-presse-xebia/#VidcastdeChristopheCoenraetsau">Vidcast de Christophe Coenraets autour de Flex</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/07/21/revue-de-presse-xebia/#FaillesdescuritdansSpringMVC">Failles de sécurité dans Spring MVC</a></li><li><a
href="http://blog.xebia.fr/2008/07/21/revue-de-presse-xebia/#PremierrsultatSpecJVMetalors">Premier résultat SpecJVM2008, et alors ?</a></li><li><a
href="http://blog.xebia.fr/2008/07/21/revue-de-presse-xebia/#EnversJBossajouteJPAleversioni">Envers : JBoss ajoute à JPA le versioning des données</a></li><li><a
href="http://blog.xebia.fr/2008/07/21/revue-de-presse-xebia/#JSRMoreNewIOAPIsfortheJavaPlat">JSR 203: More New I/O APIs for the Java Platform (&laquo;&nbsp;NIO.2&#8243;)</a></li><li><a
href="http://blog.xebia.fr/2008/07/21/revue-de-presse-xebia/#Lavenirdelavirtualisationetduc">L&#8217;avenir de la virtualisation et du cloud computing java selon Billy Newport</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="DurdurdtreunJavaRebel"></a>Dur dur d&#8217;être un (Java)Rebel</h4><p>S&#8217;il n&#8217;est pas simple de faire connaître un outil, il est encore plus compliqué de le monétiser. ZeroTurnaround nous en fait la démonstration avec JavaRebel. C&#8217;est la fête à la licence : après les dons aux <a
href=" http://www.zeroturnaround.com/blog/javarebel-offers-free-licenses-to-javablackbelt-brown-belts/" title="ceintures marrons de Java Black Belt" >ceintures marrons de Java Black Belt</a>, et aux membres de <a
href="http://www.zeroturnaround.com/blog/javarebel-for-open-source-development/" title="projets open-source" >projets open-source</a>, ZeroTurnaround offre cette fois ses licenses aux lecteurs de <a
href="http://www.zeroturnaround.com/news/get-a-free-javarebel-license/" title="DZone" >DZone</a> (digg-like pour développeurs). Quelle sera la prochaine étape ? La gratuité pour les usages non commerciaux ?</p><p>JavaRebel est <a
href="http://blog.xebia.fr/2008/05/02/java-agent-instrumentez-vos-classes/" title="agent java" >agent java</a> permettant de recharger à la volée des modifications effectuées sur classes. A l&#8217;utilisation, le principe reste le même que celui du hotswap proposé out-of-the-box par la JVM Sun, offrant un rechargement <a
href="http://www.zeroturnaround.com/javarebel/features/" title="plus complet" >plus complet</a>.</p><h3><a
name="RIA"></a>RIA</h3><h4><a
name="VidcastdeChristopheCoenraetsau"></a>Vidcast de Christophe Coenraets autour de Flex</h4><p>A ceux qui ont raté <a
href="http://blog.xebia.fr/2008/07/09/soiree-mda-et-flex-au-paris-jug/" title="James Ward au Paris JUG" >James Ward au Paris JUG</a>, InfoQ offre une seconde chance avec <a
href="http://www.infoq.com/interviews/coenraets-flex-3-air-blazeds" title="l'interview de Christophe Coenraets" >l&#8217;interview de Christophe Coenraets</a>, lui aussi évangéliste Adobe, captée dans le cadre du QCon 2008 de Londres.<br
/> Dans cette vidéo, Christophe Coenraets aborde les points suivants :</p><ul><li>Les technologies RIA Abode : Flex 3, Air et BlazeDs</li><li>L&#8217;environnement de développement d&#8217;abode, FlexBuilder 3</li><li>La stratégie open-source d&#8217;Adobe</li><li>L&#8217;introduction d&#8217;un front-end Flex dans un SI existant</li><li>L&#8217;avenir des RIA à travers leur intégration aux moteurs de recherche et aux navigateurs internet</li></ul><p>Une bonne façon de se remettre rapidement à jour si vous avez raté les derniers développements de la percée d&#8217;Adobe sur le marché des clients riches.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="FaillesdescuritdansSpringMVC"></a>Failles de sécurité dans Spring MVC</h4><p>La nouvelle est assez rare pour que tout le monde s&#8217;en empare (<a
href="http://www.theserverside.com/news/thread.tss?thread_id=50076" title="TSS" >TSS</a>, <a
href=" http://searchsoftwarequality.techtarget.com/news/article/0,289142,sid92_gci1321417,00.html" title="techtarget" >techtarget</a>, <a
href=" http://www.net-security.org/secworld.php?id=6329" title="net-security.org" >net-security.org</a>, <a
href="http://www.xtremeopensource.org/index.php?option=com_content&#038;view=article&#038;id=6005:critical-security-issues-in-the-open-source-spring-framework&#038;catid=13:open-source-news&#038;Itemid=83" title="xtremeopensource.org" >xtremeopensource.org</a>, <a
href="http://www.linux-mag.com/id/6463/" title="linux mag" >linux mag</a>, &#8230;), <a
href=" http://www.ouncelabs.com/company/20080716-2008-ounce-labs-spring-framework-security-advisory.asp" title="Ounce Labs" >Ounce Labs</a> annonce la découverte de problèmes dans Spring MVC pouvant causer des failles de sécurité dans les applications utilisant ce framework, en voici les descriptions :</p><ol><li>Soumission de champs de formulaire non éditables. Si votre modèle contient plus de champs que votre formulaire HTML, il est possible d&#8217;envoyer une fausse requête contenant des données non éditables.</li><li>Injection Modèle/Vue. Ce problème arrive lorsque le rendering utilise un nom de vue provenant directement d&#8217;une requête. Si ces noms mappent certaines ressources protégées par le serveur d&#8217;applications, il est alors possible, dans certains cas, d&#8217;y accéder.</li></ol><p>Ces deux vulnérabilités sont connues depuis longtemps par Spring Source, qui vient de publier une <a
href="http://www.springsource.com/securityadvisory" title="Spring MVC vulnerability FAQ" >Spring MVC vulnerability FAQ</a> à ce sujet. Il ne s&#8217;agit pas de véritables bugs, mais plus d&#8217;un mauvais usage du framework. Cela ressemble plus à une opération publicitaire de Ounce Labs qu&#8217;à une véritable alerte ; ce <em>coup d&#8217;éclat</em> a tout de même le mérite de nous rappeler la difficulté des développements web et le dilemme permanent des frameworks web qui sont écartelés entre l&#8217;ajout de fonctionnalités et la sécurité. Les approches actuelles zéro-confs sont à ce titre bien dangereuses.</p><h4><a
name="PremierrsultatSpecJVMetalors"></a>Premier résultat SpecJVM2008, et alors ?</h4><p>David Dagastine annonce dans <a
href="http://blogs.sun.com/dagastine/entry/first_specjvm2008_result_published" title="First SPECjvm2008 Result Published!" >First SPECjvm2008 Result Published!</a> que Sun a publié le premier résultat de ce benchmark de JVM. Cependant, nous pouvons nous interroger sur le rôle qu&#8217;a aujourd&#8217;hui un tel benchmark dans le choix d&#8217;une JVM alors que les machines virtuelles d&#8217;IBM (J9), d&#8217;Oracle-BEA (Jrockit) et de Sun (Hotspot) qui ont aussi bonne presse sur ce sujet. Le critère de l&#8217;exploitabilité de la JVM, aujourd&#8217;hui très en vogue avec la médiatisation de <a
href="https://visualvm.dev.java.net/" title="VisualVM" >VisualVM</a> (Sun), ne semble pas plus pris en compte aujourd&#8217;hui alors que des écarts importants subsistent entre les éditeurs et qu&#8217;Oracle-BEA a de sérieux atouts différenciant avec son très mature <a
href="http://dev2dev.bea.com/jrockit/tools.html" title="JRockit Mission Control" >JRockit Mission Control</a>.</p><p>En fait, les JVM sont devenues des commodités et le critère de choix relève aujourd&#8217;hui plus de l&#8217;écosystème et particulièrement du serveur d&#8217;applications Java. Un utilisateur de Websphere devra utiliser J9 [1], un utilisateur de Weblogic aura le choix entre JRockit et Hotspot et les autres utilisateurs (Tomcat, JBoss, etc) se tournent le plus souvent vers le standard de facto : l&#8217;implémentation de Sun.</p><p>Nous noterons un point intéressant sur SpecJVM2008 : le benchmark se fait sans aucun tuning de la JVM. Cette règle illustre la tendance actuelle des éditeurs de JVM qui fournissent des machines virtuelles optimales en configuration par défaut grâce à des mécanismes de détection de la configuration de l&#8217;OS et d&#8217;optimisation automatique à l&#8217;exécution.</p><p>[1] sauf sur les plateformes sur lesquelles IBM n&#8217;a pas porté J9 et où il propose alors Hotspot (Solaris, HP UX)</p><h4><a
name="EnversJBossajouteJPAleversioni"></a>Envers : JBoss ajoute à JPA le versioning des données</h4><p>Trois mois après <a
href="http://blog.xebia.fr/2008/04/28/revue-de-presse-xebia-54/#InnovationautourdeJPAJBossHibe" title="l'annonce d'une preview" >l&#8217;annonce d&#8217;une preview</a>, Adam Warski propose aujourd&#8217;hui la <a
href="http://www.theserverside.com/news/thread.tss?thread_id=50094" title="version 1.0 de JBoss Envers" >version 1.0 de JBoss Envers</a>, une extension à JPA pour versioner les données, un sujet fréquent dans l&#8217;informatique de gestion des contrats. L&#8217;occasion pour JBoss de réaffirmer sa place de leader de l&#8217;innovation autour de JPA.</p><p>Les points clefs de JBoss Envers :</p><ul><li>Versioning de propriétés simples (strings, integers, longs&#8230;) comme des composants <em>embedded</em> (eux même composés de propriétés simples)</li><li>Versioning de classes aux ids simples, composites ou _embedded_</li><li>Versioning des relations one-to-one et one-to-many</li><li>Listener de révision <code>@RevisionEntity</code> pour notamment ajouter des modifications spécifiques aux entités versionées</li><li>Historisation par numéro de version (<code>@RevisionNumber</code>) ou à date (<code>@RevisionTimestamp</code>)</li><li>Requête sur les données historiées avec un <code>VersionsReader</code></li><li>Envers repose sur l&#8217;<code>EntityManager</code> JPA plutôt que la <code>Session</code> Hibernate, on peut y voir un signe supplémentaire pour migrer des API propriétaires d&#8217;Hibernate vers celles standard de JPA.</li></ul><p>Exemple de classe versionnée avec Envers :</p><pre class="brush: java; title: ; notranslate">
@Entity
@RevisionEntity(MyRevisionListener.class)
public class Person {
    @Id
    @GeneratedValue
    Integer id;
    @Versioned
    String name;
    @Versioned
    String surname;
    @Versioned
    @ManyToOne
    Address address;
    @RevisionTimestamp
    long revisionTimestamp;
   ...
}
</pre><p>Pour plus d&#8217;informations sur ce sujet, nous aimons <a
href="http://www.martinfowler.com/ap2/timeNarrative.html" title="Patterns for things that change with time" >Patterns for things that change with time</a> de Martin Fowler.</p><h4><a
name="JSRMoreNewIOAPIsfortheJavaPlat"></a>JSR 203: More New I/O APIs for the Java Platform (&laquo;&nbsp;NIO.2&#8243;)</h4><p>Si NIO 1 mettait l&#8217;accent sur la <em>scalabilité</em>, <a
href="http://jcp.org/en/jsr/detail?id=203" title="JSR 203 - NIO 2" >JSR 203 &#8211; NIO 2</a> se focalisera sur l&#8217;utilisabilité des différents systèmes de fichiers comme Alan Bateman (Sun) et Carl Quinn (Google) l&#8217;ont expliqué à JavaOne dans <a
href="http://openjdk.java.net/projects/nio/presentations/TS-5686.pdf" title=""New I/O in JDK 7"" >&laquo;&nbsp;New I/O in JDK 7&#8243;</a>. Les points clefs de NIO 2 :</p><ul><li>Nouvelle API d&#8217;abstraction de système de fichier (<code>FileSystem</code>, <code>Path</code> / <code>FileRef</code> et <code>FileStore</code>) et notamment l&#8217;amélioration de la navigation dans les arborescences.</li><li>Unification des API <code>Channel</code> et <code>Socket</code> avec une abstraction système de fichier sous-jacent.</li><li>Amélioration des I/O asynchrones.</li><li>Correction de bugs qui <em>trainaient</em> de longue date des les API I/O</li></ul><p>Dans la continuité, Elliotte Rusty Harold détaille dans <a
href="http://today.java.net/pub/a/today/2008/07/03/jsr-203-new-file-apis.html" title="The Open Road: java.nio.file" >The Open Road: java.nio.file</a> le fonctionnement de la nouvelle abstraction du système de fichier.</p><p>Pour plus d&#8217;informations sur les nouveautés de Java 7 :</p><ul><li><a
href="http://blog.xebia.fr/2008/02/20/nagez-avec-les-dauphins-jdk-7-proposals-overview/" title="Nagez avec les dauphins ! JDK 7 proposals overview" >Nagez avec les dauphins ! JDK 7 proposals overview</a></li><li><a
href="http://blog.xebia.fr/2008/02/27/jsr-294-les-superpackages/" title="JSR 294 - Les Superpackages" >JSR 294 &#8211; Les Superpackages</a></li><li><a
href="http://blog.xebia.fr/2008/03/12/gc-generationnels-traditionnels-jdk6-vs-gc-garbage-first-jdk7/" title="GC générationnels traditionnels (jdk6) vs. GC Garbage First (jdk7)" >GC générationnels traditionnels (jdk6) vs. GC Garbage First (jdk7)</a></li></ul><h4><a
name="Lavenirdelavirtualisationetduc"></a>L&#8217;avenir de la virtualisation et du cloud computing java selon Billy Newport</h4><p>Billy Newport, Websphere eXtreme Scale, explique dans une interview à <a
href="http://www.infoq.com/interviews/billynewport-virtualization" title="Floyd Marinescu, InfoQ" >Floyd Marinescu, InfoQ</a> sa vision de la virtualisation et du cloud computing en Java.</p><p>Nous retiendrons :</p><ul><li>Pour les applications Java, la virtualisation de la couche physique (processeur, mémoire, etc) tend vers la gestion de grappes de petits serveurs virtuels à ressources fixes (e.g. 4 ways, 2 Go de RAM, 160 Go de disque) plutôt que vers des serveurs de grande capacité à ressources variables : il est très difficile d&#8217;optimiser les performances de <em>gros serveurs</em> (e.g. 32+ cores/ways, 10+ Go de RAM, etc) et les programmes ont le plus grand mal à se réadapter (e.g. pool de threads, taille de cache) quand les ressources allouées changent</li><li>Des serveurs à plusieurs dizaines de cores arriveront plus vite que nous le pensons et les éditeurs de <a
href="http://www.infoq.com/news/2007/07/concurrency-java-se-7" title="JVM s'y préparent" >JVM s&#8217;y préparent</a>, mais les JVM et les APIs de concurrence ne sont aujourd&#8217;hui pas prêtes. Par exemple, les pattern multi-reader/mono-writer ne seront plus adaptés.</li><li>Les grilles de données n&#8217;ont pas besoin d&#8217;API spécifiques pour le moment : JPA et JMS suffisent aux besoins actuels. Par ailleurs, l&#8217;API <a
href="http://jcp.org/en/jsr/detail?id=107" title="JSR-107: JCache" >JSR-107: JCache</a> suscite des réticences de la part des grands éditeurs de grilles java et ne verra probablement jamais le jour.</li><li>La virtualisation des données se divise en deux grande familles :<ul><li>Network Attached Cache : le paradigme de programmation est le même qu&#8217;en l&#8217;absence de cache. Typiquement positionné en cache L2 d&#8217;un framework JPA, les données du cache sont rapatriées sur le serveur d&#8217;applications pour réaliser les traitements métiers, mais ce modèle atteint ses limites avec le coût de rapatriement des données.</li><li>eXtreme Transaction Processing Grid : le paradigme de de programmation change complètement ; le traitement métier, au lieu d&#8217;être réalisé sur le serveur d&#8217;applications, est envoyé sur tous les noeuds de la grille, seule la consolidation est effectuée sur le serveur d&#8217;applications. Cette architecture <em>scale</em> jusqu&#8217;à plusieurs milliers de noeuds sur la grille.</li></ul></li><li>Les SGBD, avec la co-localisation des données, ont atteint leur limite de <em>scalabilité</em>. IBM comme Oracle ou Microsoft investissent aujourd&#8217;hui dans les data grids pour lever cette limite (respectivement eXtreme Scale, Coherence et <a
href="http://www.infoq.com/news/2008/06/Velocity" title="Velocity" >Velocity</a>).</li></ul></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/07/21/revue-de-presse-xebia-66/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>GC générationnels traditionnels (jdk6) VS GC Garbage First (jdk7)</title><link>http://blog.xebia.fr/2008/03/12/gc-generationnels-traditionnels-jdk6-vs-gc-garbage-first-jdk7/</link> <comments>http://blog.xebia.fr/2008/03/12/gc-generationnels-traditionnels-jdk6-vs-gc-garbage-first-jdk7/#comments</comments> <pubDate>Wed, 12 Mar 2008 07:28:56 +0000</pubDate> <dc:creator>Erwan Alliaume</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[GC]]></category> <category><![CDATA[jdk-6]]></category> <category><![CDATA[jdk-7]]></category> <category><![CDATA[JVM]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2008/03/12/gc-generationnels-traditionnels-jdk6-vs-gc-garbage-first-jdk7/</guid> <description><![CDATA[L&#8217;analyse empirique montre que dans une application la très grande majorité des objets créés sont détruits presque immédiatement. C&#8217;est d&#8217;autant plus vrai pour les applications web et/ou stateless où la plupart des objets sont créés pour traiter une requête et peuvent être donc détruits juste après ce traitement. De ce constat résulte l&#8217;idée de ne [...]]]></description> <content:encoded><![CDATA[<p>L&#8217;analyse empirique montre que dans une application la très grande majorité des objets créés sont détruits presque immédiatement. C&#8217;est d&#8217;autant plus vrai pour les applications web et/ou stateless où la plupart des objets sont créés pour traiter une requête et peuvent être donc détruits juste après ce traitement. De ce constat résulte l&#8217;idée de ne pas traiter de la même façon les objets fraîchement créés et ceux qui existent depuis plus longtemps. Les Garbage Collector qui utilisent des implémentations basées sur ce principe sont appelés <strong>GC générationnels</strong>. On peut fixer deux catégories d&#8217;objectifs lorsque l&#8217;on optimise le GC : réduire les pauses ou augmenter le débit. Ces objectifs sont en général orthogonaux (la réduction de la durée des pauses se fait au détriment du débit, et vice-versa), ils dépendent souvent du type d&#8217;applications : dans une application interactive, nous privilégierons les pauses, et au contraire, dans un batch, seul le débit compte.</p><p>La suite du billet est décomposée en deux parties :</p><ul><li>La première décrit le fonctionnement des algorithmes générationnels <em>traditionnels </em>(Implémentation actuelle des JVM Sun)</li><li>La seconde détaille le nouvel algorithme que Sun essaye de pousser pour sa future JVM</li></ul><h3><a
name="jdk6">GC Générationels</a></h3><p>Avant de présenter la nouvelle implémentation que Sun essaye de mettre en avant pour le <a
href="http://blog.xebia.fr/2008/02/20/nagez-avec-les-dauphins-jdk-7-proposals-overview" title="java SE 7" target="_blank">jdk 7</a>, décrivons le cycle de vie des objets dans le tas (heap) tel qu&#8217;il est actuellement implémenté dans les JVM Sun. Le &laquo;&nbsp;heap&nbsp;&raquo; se compose de trois sections principales &laquo;&nbsp;Young&nbsp;&raquo;, &laquo;&nbsp;Tenured&nbsp;&raquo; et &laquo;&nbsp;Perm&nbsp;&raquo;. Au cours de sa vie, un objet est amené à évoluer au sein de ces zones en fonction de son ancienneté, à chaque section correspond une génération d&#8217;objet.</p><div
align="center"> <img
src='http://blog.xebia.fr/wp-content/uploads/2008/03/simple.jpg' alt='generations.jpg' /></div><p>Les nouveaux objets sont stockés dans une première zone de la &laquo;&nbsp;young generation&nbsp;&raquo; appelée &laquo;&nbsp;l&#8217;eden&nbsp;&raquo; (1). Lorsque cette zone est remplie, le garbage collector analyse les objets présents dans cette zone et nettoie les objets devenus inutiles (ne possédant plus de références).</p><p>Les objets ayant résisté à ce passage sont placés dans une seconde partie appelée &laquo;&nbsp;survivor&nbsp;&raquo; (2). Il s&#8217;agit d&#8217;une zone intermédiaire contenant les objets les plus vieux de la &laquo;&nbsp;young generation&nbsp;&raquo;. L&#8217;eden ayant été vidée lors du passage du GC, de nouveaux objets peuvent faire leur apparition dans cette même zone. À ce moment deux zones contiennent alors des objets : l&#8217;eden et le survivor. Dès lors, lors des futurs passages du GC, ces deux zones seront analysées et les objets toujours en activité seront placés dans une 2e zone &laquo;&nbsp;survivor&nbsp;&raquo;. Les deux zones &laquo;&nbsp;survivors&nbsp;&raquo; sont utilisées alternativement par le GC pour stocker les objets utilisés.</p><p>Avant que ces zones ne deviennent également trop petites et lorsqu&#8217;un objet est considéré comme assez âgé, il est déplacé dans la deuxième génération : &laquo;&nbsp;tenured&nbsp;&raquo; (3). Il s&#8217;agit d&#8217;un emplacement permettant de stocker les objets les plus anciens. Lorsque cette zone est remplie, le garbage collector effectue un nettoyage en profondeur des différentes zones et générations : le full GC. Si après un full GC l&#8217;espace disponible n&#8217;est pas suffisant pour gérer la vie de l&#8217;application, une exception est levée : java.lang.OutOfMemoryException.</p><p>Quant à la troisième section : &laquo;&nbsp;la perm&nbsp;&raquo;, celle-ci stocke les objets n&#8217;ayant pas besoin d&#8217;être nettoyés par le GC, comme les classes chargées par le class loader lors de l&#8217;exécution d&#8217;un programme. Ces objets resteront disponibles pendant toute la durée de vie de la JVM. De la même manière, cette zone n&#8217;étant jamais nettoyée, si celle-ci vient à saturer, un OutOfMemory est également lancé : &laquo;&nbsp;java.lang.OutOfMemoryError: PermGen space&nbsp;&raquo; . Son fonctionnement est donc un peu différent : il n&#8217;y a pas de promotion dans cette zone.</p><p>Les zones &laquo;&nbsp;virtual&nbsp;&raquo; ne sont pas utilisées par la machine virtuelle pour stocker des données. Elles correspondent à l&#8217;écart entre la taille réelle et la taille max. Leur réservation n&#8217;a pas encore été faite auprès système. Elles n&#8217;existent que si on a choisi une taille adaptative (Taille Heap Min (-Xms) < Taille Heap Max (-Xmx)).</p><div
align="center"> <img
src='http://blog.xebia.fr/wp-content/uploads/2008/03/gc.jpg' alt='gc.jpg' /></div><p>Pour résumer, les objets sont créés dans &laquo;&nbsp;l&#8217;eden&nbsp;&raquo; (1), puis déplacé dans le &laquo;&nbsp;survivor&nbsp;&raquo; (2) puis dans le &laquo;&nbsp;Tenured&nbsp;&raquo; (3).</p><p>Le GC effectue deux types de traitements :</p><ul><li>Un nettoyage rapide lorsque &laquo;&nbsp;l&#8217;eden&nbsp;&raquo; est rempli, comme il s&#8217;agit d&#8217;un algorithme de copie, la destruction d&#8217;un objet ne coûte rien : zéro inscrution \! Traitement parallélisable.</li><li>Un nettoyage approfondi, plus gourmand en ressources, lorsque le &laquo;&nbsp;tenured est saturé&nbsp;&raquo;. Il faut libérer la mémoire explicitement, et éventuellement la compacter (donc déplacer les objets et mettre à jour les références en conséquence) Plusieurs algo disponibles : <a
href="http://www.brpreiss.com/books/opus5/html/page424.html" title="Mark&#038;Sweep" target="_blank">Mark&#038;Sweep</a>, Concurrent Mark&#038;Sweep, Incremental/train</li></ul><p>L&#8217;un des objectifs de l&#8217;optimisation du GC est donc de limiter la fréquence des FullGC en s&#8217;assurant que le maximum d&#8217;objets sera ramassé avant sa promotion dans la old génération. Pour une application web, cela signifie généralement que l&#8217;intervalle entre 2 fullGC est supérieur au temps de traitement max d&#8217;une requête. Rappelons en passant que la méthode System.gc() déclenche un FullGC et devrait la plupart du temps être proscrite (-XX:+DisableExplicitGC)</p><h3><a
name="jdk7">GC Garbage First</a></h3><p>L&#8217;idée de l&#8217;algorithme G1 (Garbage-First) est d&#8217;utiliser les spécificités des environnements multiprocesseurs afin d&#8217;approcher des performances &#8216;temps réel&#8217; tout en maintenant un débit élevé. Pour parvenir à ce but, le tas n&#8217;est plus divisé en générations, mais en un nombre beaucoup plus grand de petites régions. Désormais, la collecte d&#8217;une génération dans son ensemble n&#8217;est maintenant plus obligatoire, elle peut se limiter à un ensemble précis de régions.</p><div
align="center"> <img
src='http://blog.xebia.fr/wp-content/uploads/2008/03/g1.jpg' alt='g1.jpg' /></div><p>La sélection de ces régions est possible grâce à un marquage spécifique : snapshot-at-the-beginning (<a
href="http://www.memorymanagement.org/glossary/s.html#snapshot-at-the-beginning" title="SATB" target="_blank">SATB</a>). Ce marquage, concurrent et très rapide, fournit au GC une analyse périodique et exhaustive de l&#8217;utilisation des différents objets en mémoire. Toutes les références des différents objets sont suivies. Leur examen permet la détection des objets qui ne sont plus utilisés : ils sont alors considérés comme déchets.</p><p>Un ensemble de métrique est également maintenu afin de permettre d&#8217;évaluer l&#8217;occupation des différentes régions du tas : taille maximale de la région, ancienneté, pourcentage d&#8217;occupation et surtout, pourcentage de déchets. De plus, les collectes passées permettent au GC de connaître relativement précisément le coût de la collecte d&#8217;une région particulière. En croisant ces évaluations (probabilités) avec le recensement des références dans les régions du système, le GC peut effectuer une sélection arbitraire d&#8217;un ensemble de régions nettoyable durant une période prédéfinie. La configuration du GC permet à l&#8217;utilisateur de spécifier une fraction de temps maximale consacrée à la collecte (par exemple : sur 100 secondes d&#8217;exécution de l&#8217;application, le nettoyage des données ne peut pas dépasser 5 secondes (5%)), ce qui revient presque à définir les horaires des collectes par configuration. Les régions privilégiées sont celles qui possèdent les données les plus jeunes et le plus de déchets, car elles proposent généralement un meilleur rendement : voici donc d&#8217;où vient le nom de l&#8217;algorithme &laquo;&nbsp;Garbage First&nbsp;&raquo;. Cette sélection de régions peut être considérée comme une young génération dont le contenu est défini dynamiquement : Garbage First est donc un algorithme générationnel. Par ailleurs, afin d&#8217;éviter de dépasser ce temps &#8216;objectif&#8217;, et donc pour d&#8217;optimiser le débit, la collecte peut-être reportée si nécessaire (dans la mesure du possible), peut être qu&#8217;au prochain passage plus de déchets seront présents dans une des régions.</p><h4>Illustrons ces propos par un exemple :</h4><p>Supposons que le tas est découpé en 12 régions. Les zones vertes sur les schémas suivants représentent des régions vides.</p><p>Le marquage a été effectué, il en résulte le découpage suivant. Le pourcentage affiché dans chacune des cases ci-dessous correspond au pourcentage d&#8217;objets vivants dans leur région associée. Ainsi dans la 2e case, 3% des objets présents dans celle-ci sont toujours utilisés, par conséquent cette région possède 97% de déchets. Les régions qui ne comptent pas d&#8217;objets vivants sont entièrement libérées. La collecte de zone ne contenant que des déchets est très rapide, on peu le comparer à celui utilisé dans les &#8216;survivor&#8217; dans les algorithmes générationnels traditionnels.</p><div
align="center"> <img
src='http://blog.xebia.fr/wp-content/uploads/2008/03/g1-sample1.jpg' alt='jdk7-g1-sample1.jpg' /></div><p>L&#8217;application continue de tourner autant de temps que nécessaire pour remplir une nouvelle région intégralement : les nouveaux objets sont référencés dans une même région (case orange). Si un cycle de collection n&#8217;est pas suffisant pour remplir cette région, le GC ne se lance pas.</p><div
align="center"> <img
src='http://blog.xebia.fr/wp-content/uploads/2008/03/g1-sample2.jpg' alt='jdk7-g1-sample2.jpg' /></div><p>Maintenant que cette nouvelle région est remplie, le GC sélectionne les régions les contenant le plus de déchets qu&#8217;il estime pouvoir traiter simultanément (GabageFirst !). Les données vivantes restant dans ces régions sont copiées et rassemblées dans une autre région. Comme il s&#8217;agit d&#8217;un algorithme de copie, très peu de temps est nécessaire à l&#8217;exécution de cette tâche. Une fois que la copie terminée, les zones sélectionnées ne contiennent plus d&#8217;objets vivants, elles sont alors collectées.</p><div
align="center"> <img
src='http://blog.xebia.fr/wp-content/uploads/2008/03/g1-sample3.jpg' alt='jdk7-g1-sample3.jpg' /></div><p>Au final, si on récapitule, les avantages avancés de ce nouvel algorithme sont les suivants :</p><ul><li>Meilleure prédiction des temps de pauses destinées au GC.</li><li>Courte pause sans fragmentation.</li><li>Nettoyage acceptant la parallélisassions et la concurrence.</li><li>Meilleure utilisation du tas.</li></ul><p>En plus d&#8217;améliorer le débit des collectes, comme le tas n&#8217;est pas divisé en générations, les problèmes de sizing des différentes générations ne sont plus d&#8217;actualité : fini les prises de tête avec le calcul des ratios young / tenured générations.</p><p>Informations complémentaires à propos de ce nouvel algorithme :</p><ul><li><a
href="http://blogs.sun.com/jonthecollector/entry/our_collectors" title="Collectors" target="_blank">Jon Masamitsu&#8217;s Weblog : Our Collectors</a></li><li><a
href="http://research.sun.com/jtech/pubs/04-g1-paper-ismm.pdf" title="GarbageFirst Garbage Collection" target="_blank">GarbageFirst Garbage Collection (pdf)</a></li><li><a
href="http://researchweb.watson.ibm.com/ismm04/slides/detlefs.pdf" title="Low Latency, High Throughput Garbage Collection" target="_blank">GarbageFirst : Low Latency, High Throughput Garbage Collection</a></li></ul><div
align="center"> <a
href="http://twitter.com/ealliaume" ><br
/> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/04/twitter4.png"  alt="twitter erwan alliaume" title="twitter erwan alliaume" border="0" /><br
/> </a></div> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/03/12/gc-generationnels-traditionnels-jdk6-vs-gc-garbage-first-jdk7/feed/</wfw:commentRss> <slash:comments>15</slash:comments> </item> </channel> </rss>
