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

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Un bogue sur Java 7 paralyse Apache Lucene et Solr
Une optimisation défectueuse du compilateur Hotspot incriminée

Le , par lunatix

72PARTAGES

16  0 
Mise à jour du 27 octobre 2011 par Idelways

Une anomalie découverte quelques jours avant la sortie de Java 7, et laissée pour compte par manque de temps, vient d'être écartée.

Oracle sort l'Update 1 de Java 7 qui corrige l'optimisation défectueuse du compilateur Hotspot, responsable de boucles potentiellement erronées, pouvant produire des résultats de calculs incorrects, ou faire crasher la JVM à l'exécution.

Cette anomalie touchait notamment Apache Lucence, le célèbre moteur de recherche en full TEXT, ainsi que son sous-produit Solr.

Oracle a sortie cet Update il y a quelques jours, mais n'a mis à jour qu'aujourd'hui les statuts des trois rapports du compilateur "JIT [Just in Time] et les bogues de boucle" signalés par la fondation. D'autres bogues relatifs, découverts en interne, ont été corrigés.

Uwe Schindler, un contributeur du projet confirme après des tests que l'anomalie a bien été résorbée. Il n'a cependant pas précisé si l'utilisation des flags -XX:+OptimizeStringConcat et -XX:+AggressiveOpts reste toujours recommandée.

Télécharger Java 7u1

Source : Oracle, blog d'un contributeur à Apache

Un bogue sur Java 7 paralyse Apache Lucene et Solr
Une optimisation défectueuse du compilateur Hotspot incriminée

Mise à jour du 1 août 2011 par Idelways

Un sérieux bogue vient d'être dévoilé suite au lancement final de Java 7. Il entrave le fonctionnement de deux projets de la fondation Apache, notamment Lucene, le célèbre moteur de recherche en full-text.

Le problème se situe plus précisément au niveau du compilateur Hotspot qui intègre un optimisateur défectueux, capable de créer des boucles potentiellement erronées.
Par conséquent, la machine virtuelle Java peut planter à l'exécution, ou produire des résultats de calculs incorrects.

Pour Lucene, ce bogue risque de corrompre l'index, plus particulièrement sur la version qui embarque le PulsingCodec.

L'autre projet phare de la fondation Apache affecté par ce bogue est Solr, le moteur de recherche issu de la bibliothèque Lucene sus-citée.

Oracle aurait découvert ce bogue 5 jours avant la sortie de Java 7 en version définitive, mais aurait préféré reporter sa correction au deuxième « service release » de Java 7, le premier étant réservé à la correction des bogues de sécurité, sauf changement de planning.

En attendant, les utilisateurs des deux projets doivent temporiser avant de passer à Java 7 en production ou l'utiliser avec l'option -XX:-UseLoopPredicate qui désactive l'optimisation et met ainsi l'index Lucene à l'abri.

Un bogue similaire peut surgir sur Java 6 avec les flags -XX:+OptimizeStringConcat et -XX:+AggressiveOpts qui activent des optimisations Hotspot par défaut désactivées.

Trois rapports de bogues ont été admis par Oracle, l'un de faible priorité et les deux autres de priorité modérée.
De pareils dysfonctionnements n'ont pas encore été signalés sur des produits autres que ceux de la fondation Apache.

Pour plus d'informations sur les nouveautés de Java 7, lire ci-dessous.

Source : avertissement de la fondation Apache

Et vous ?

Qu'en pensez-vous de ce bogue ? L'avez-vous rencontré ?

Java 7 disponible en version finale
Oracle publie son environnement d'exécution et le JDK 7

Mise à jour du 29/07/11, par Hinault Romaric

Après plus de quatre ans depuis la sortie de Java 6, Oracle vient de publier la version finale de Java Runtime Environment (JRE) 7.

Cette version est la première de Java SE publiée depuis la reprise du langage par Oracle suite au rachat de SUN.

Java SE 7 apporte un support pour un bon nombre de tendances qui ont déferlé dans le monde du développement informatique depuis la publication de la dernière version. Il offre une prise en charge amélioré des langages dynamique conçus pour fonctionner sur la machine virtuelle Java comme Scala et Groovy.

Java SE 7 embarque une API permettant de simplifier l’exécution d’un programme à travers des processeurs multi-cœurs. Et plusieurs autres nouveautés importantes (lire-ci avant).

Le nouveau Runtime Java 7 peut-être utilisé par les développeurs avec les environnements de développement NetBeans ou encore IntelliJ IDEA 10.5. Oracle a annoncé qu’il publiera avant la fin de l’année une mise à jour de son EDI JDeveloper pour un support de Java 7.

Le Runtime Java 7 est disponible pour les systèmes d’exploitations Linux, Solaris et Windows 32 bits et 64 bits.

Oracle a également annoncé la disponibilité de la version finale du Kit de Développement de Java 7 (JDK7),

Télécharger Java 7 sur le site d'Oracle

Télécharger JDK 7 sur le site d'Oracle

La RC de Java 7 est disponible
nio2, coin, javadoc et autres nouveautés

Enfin ! Plus de quatre ans après la dernière version majeure de Java, Oracle vient d'annoncer la disponibilité de Java 7 en Release Candidate.
Oracle relance enfin l'évolution de la plate-forme phare qu'est Java qui avait été ralentie par la sortie de JavaFX 1.X et ensuite par le rachat de Sun par Oracle.

Les nouveautés, si elles sont moins nombreuses qu'initialement espérées (un bon nombre ont été repoussées pour Java 8) sont tout de même importantes. Nous allons en faire un rapide tour d'horizon.

Le Projet Coin va apporter des nouveautés au cœur du langage.
  • Strings in switch
    Code : Sélectionner tout
    1
    2
    3
    case "truc":
        processTruc(s);
        break;
  • Binary integral literals
    Code : Sélectionner tout
    int value = 0b10000000; // 128
  • Underscores in numeric literals
    Code : Sélectionner tout
    1
    2
    3
    int oneMillion = 1_000_000;
    //plutôt que
    int oneMillion = 1000000;
  • Multi-catch and more precise rethrow
    Code : Sélectionner tout
    1
    2
    3
    4
    catch (IOException|SQLException ex) {
        logger.log(ex);
        throw ex;
    }
  • Improved type inference for generic instance creation (diamond)
    Code : Sélectionner tout
    1
    2
    3
    Map<String, List<String>> map = new HashMap<String, List<String>>();
    //pourra s’écrire plus rapidement grâce au diamond opérateur :
    Map<String, List<String>> map = new HashMap<>();
  • try-with-resources statement
    Code : Sélectionner tout
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    BufferedReader br = new BufferedReader(new FileReader(path));
    try {
       return br.readLine();
    } finally {
       br.close();
    }
    //pourra s’écrire :
    try (BufferedReader br = new BufferedReader(new FileReader(path)) {
       return br.readLine();
    }
  • Simplified varargs method invocation


Nio2 Le gros morceau à avaler car cela va remplacer l'antique java.io.File (qui reste cependant présent) par une API beaucoup plus moderne et complète. La plupart de ces nouveautés se trouvent dans le package java.nio.File
  • Détection de modification de fichiers grâce à la classe WatchService
  • Une toute nouvelle API de manipulation de fichiers.
  • Gestion des E/S asynchrones
  • Enfin une copie de fichier simple
    Code : Sélectionner tout
    1
    2
    3
    4
    FileSystem default = FileSystems.getDefault();
    Path source  = default.getPath("pets/cat.txt");
    Path target  = default.getPath("nicePets/nicecat.txt");
    Files.copy(source, target);
  • Un support complet des liens physiques et symboliques (si le système de fichier les supporte).
  • Une gestion propre des erreurs, via des exceptions.
  • Un API complète pour l'accès aux attributs des fichiers, qui supporte les fonctionnalités de chaque système (DOS et Posix) ainsi que la gestion des utilisateurs (propriétaire et liste ACL). Le tout parfaitement extensible pour supporter d'autres systèmes de fichiers via des providers. D'ailleurs ce dernier point se concrétise en standard par l'intégration du filesystem "ZIP" qui permet de traiter un fichier ZIP comme un système de fichier standard (ou presque).
    Ainsi pour extraire un fichier d'un ZIP on peut faire ceci (noter l'utilisation du try-with-resource) :
    Code : Sélectionner tout
    1
    2
    3
    4
    5
    try (FileSystem zip = FileSystems.newFileSystem(Paths.get("file.zip"), null)) {
        Path source = zip.getPath("pets/cat.txt");
        Path target = Paths.get("nicePets/nicecat.txt");
        Files.copy(source, target);
    }


invokeDynamic : Une amélioration de la JVM pour les langages dynamiques (Groovy par exemple) mais qui sera utilisable directement en Java via l'API java.lang.invoke. CGlib et JavaAssist vont sûrement beaucoup évoluer.

Concurrency and collections updates (jsr166y) : pour améliorer vos programmes multi-threadés avec la classe ForkJoinPool

Plus anecdotique mais quand même bien sympathique :

un nouveau look beaucoup plus moderne pour la javadoc :


Et enfin, toute l'API est pleine de petites nouveautés. Par exemple, la nouvelle classe Objects que vous pouvez découvrir avec Adiguba.

L'annonce sur le site d'oracle
Télécharger Java 7 sur le site d'Oracle
La liste officielle des nouveautés

Une erreur dans cette actualité ? Signalez-nous-la !

Avatar de Uther
Expert éminent sénior https://www.developpez.com
Le 07/07/2011 à 23:16
Citation Envoyé par _skip Voir le message
Mais cela permet d'écrire
Code : Sélectionner tout
1
2
foreach(var listeClient in table.Values )
C'est particulièrement pour cette raison que je n'aime pas cette notation : dans ce cas, le type de la variable listeClient n'est pas evident au premier coup d'oeil.

A mon avis, le fait d'avoir systématiquement le type de la variable en début de déclaration apporte vraiment un plus à la lisibilité.
10  0 
Avatar de tchize_
Expert éminent sénior https://www.developpez.com
Le 08/07/2011 à 10:27
ce qui m'ennuie quand on ne précise pas le type, c'est que si demain la méthode retourne un sous type avec des méthodes supplémentaire (genre machin(String) en plus de machin(Object), le code va changer de sens, alors que si on avait sagement visé le type connu au moment de la création du code (exemple une interface X) machin(String) n'entrerais jamais dans l'équation.

Bref c'est un des nombreux effets de bord qui ont du être pirs en compte dans la décision je suppose

Sans compter qu'un typeage automatique, ca va au delà de facilité l'utilisation des generic
5  0 
Avatar de _skip
Expert éminent https://www.developpez.com
Le 07/07/2011 à 17:57
Il a fallu quoi? 5 ans bien tapés pour ça?
Je suis un peu déçu par l'absence d'un sucre syntaxique pour les get/set. Et notre API de date promise censée remplacer cette grosse merde (désolé) de Calendar dans tout ça?

Quant à la syntaxe en diamant, je trouve que l'inférence de type (le mot clef "var" en C#) aurait été une tellement meilleure solution.


Avec le try-with-resource, on peut ajouter des catch et finally (et donc l'exemple est un poil naze là-dessus) ou même pas ?
Avec un peu de chance, ça t'évite d'écrire cette beauté :

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

BufferedReader br = null; 

try 
{
   br = new BufferedReader(new FileReader(path));
   return br.readLine();
} 
finally 
{
   
    if( br != null)
    {
        try 
        { 
            br.close()
        }
        catch(IOException ex)
        {
            //rien
        }
    }
}
}
J'ai bon espoir que la nouvelle syntaxe étouffe la checked exception sur close().
4  0 
Avatar de _skip
Expert éminent https://www.developpez.com
Le 07/07/2011 à 20:35
Citation Envoyé par tchize_ Voir le message
A pitié, par les types variant, ca a des tonns de p** d'effets de bord. La syntaxe diamant a pour but d'éviter de ce répéter, pas de créer des types variables.
Désolé de te faire pitié mais sur ce coup t'es pas à jour. Le mot clef var en c# ne désigne en rien un type variable, écrire :

Code : Sélectionner tout
var table = new Hashtable<int, List<Client>>()
est strictement équivalent à

Code : Sélectionner tout
Hashtable<int, List<Client>> table = new Hashtable<int, List<Client>>()
Le type est connu à la compilation et n'a aucune ambigüité. Si tu venais à déclarer.

Code : Sélectionner tout
var liste = null;
Ca ne compilerait pas car l'inférence du type n'est pas possible. Ca n'a absolument rien à voir avec un type "variable", c'est un pur sucre syntaxique et toute la force du typage est préservée sans compromis.

Mais cela permet d'écrire

Code : Sélectionner tout
1
2
foreach(var listeClient in table.Values )
Alors qu'en java il ne sera probablement pas possible d'écrire autrement que :

Code : Sélectionner tout
1
2
for( List<Client> listeClient : table.values() )
Après on aime ou on aime pas, perso j'apprécie car ça m'évite de devoir faire le boulot à la place du compilateur.
6  2 
Avatar de Hinault Romaric
Responsable .NET https://www.developpez.com
Le 29/07/2011 à 11:52
Java 7 disponible en version finale
Oracle publie son environnement d'exécution et le JDK 7

Mise à jour du 29/07/11

Après plus de quatre ans depuis la sortie de Java 6, Oracle vient de publier la version finale de Java Runtime Environment (JRE) 7.

Cette version est la première de Java SE publiée depuis la reprise du langage par Oracle suite au rachat de SUN.

Java SE 7 apporte un support pour un bon nombre de tendances qui ont déferlé dans le monde du développement informatique depuis la publication de la dernière version. Il offre une prise en charge amélioré des langages dynamique conçus pour fonctionner sur la machine virtuelle Java comme Scala et Groovy.

Java SE 7 embarque une API permettant de simplifier l’’exécution d’un programme à travers des processeurs multi-cœurs. Et plusieurs autres nouveautés importantes (lire-ci avant).

Le nouveau Runtime Java 7 peut-être utilisé par les développeurs avec les environnements de développement NetBeans ou encore IntelliJ IDEA 10.5. Oracle a annoncé qu’il publiera avant la fin de l’année une mise à jour de son EDI JDeveloper pour un support de Java 7.

Le runtime Java 7 est disponible pour les systèmes d’exploitations Linux, Solaris et Windows 32 bits et 64 bits.

Oracle a également annoncé la disponibilité de la version finale du Kit de Développement de Java 7 (JDK7),

Télécharger Java 7 sur le site d'Oracle

Télécharger JDK 7 sur le site d'Oracle
4  0 
Avatar de Flaburgan
Modérateur https://www.developpez.com
Le 29/07/2011 à 13:22
Un seul mot : ENFIN !

Oracle a peut être bien fait de reporter la majorité des nouveautés à Java 8. Il fallait absolument qu'une mise à jour sorte, pour prouver que le langage continue d'évoluer...
4  0 
Avatar de Uther
Expert éminent sénior https://www.developpez.com
Le 07/07/2011 à 16:43
Citation Envoyé par bhamp0 Voir le message
*Underscores in numeric literals
Code : Sélectionner tout
1
2
3
int one_million = 1_000_000;
//plutôt que
int one_million = 1000000;
--> argh mais quelle horreur !
Il manquerait plus qu'il nous fasse en Java8 la possibilité d'utiliser des chiffres pour nommer des constantes et on y verra plus rien !
Ce qui est horrible dans l'exemple, c'est surtout d'utiliser les underscores dans les noms de variable alors que Java recommande d'utiliser les majuscules pour démarquer les mots.
Mais à mon avis, les underscores à l’intérieur d'un chiffre peuvent le rendre bien plus lisible. C'est même limite indispensable avec les littéraux binaires.

Citation Envoyé par bhamp0 Voir le message
* try-with-resources statement
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
BufferedReader br = new BufferedReader(new FileReader(path));
try {
   return br.readLine();
} finally {
   br.close();
}
//pourra s'ecrire :
try (BufferedReader br = new BufferedReader(new FileReader(path)) {
   return br.readLine();
}
--> super, l'exemple nous fait perdre le close() sur notre BufferedReader !!
Avec le try-with-resource, on peut ajouter des catch et finally (et donc l'exemple est un poil naze là-dessus) ou même pas ?
Justement! L'un des principaux intérêt du "try with ressource" est que le close() est fait automatiquement et proprement quand on sort du bloc try.
On peut rajouter un catch et un finally si on le souhaite, mais la plupart du temps, ça ne sera plus nécessaire.
3  0 
Avatar de tchize_
Expert éminent sénior https://www.developpez.com
Le 07/07/2011 à 22:10
Citation Envoyé par _skip Voir le message
Désolé de te faire pitié mais sur ce coup t'es pas à jour. Le mot clef var en c# ne désigne en rien un type variable, écrire :
ok merci pour l'info, je suis pas trop c#

Pour le diamant, je sais qu'il y a eu beaucoup de discussion a l'époque pour savoir si il fallait inférer à gauche, à droite, des deux coté, et quand on infère de savoir dans quel règles on applique. Dans tous les cas où on regardais le problème, il y avait des pour et des contres, et comme toujours, il faut finir par prendre une décision.

L'avantage avec le diamant c'est qu'on peut faire des choses du genre

Code : Sélectionner tout
1
2
3
4
5
MonType<Map<String,String>> donnee;
if (condition)
  donnee = new MonSousType<>();
else
  donnee = new MonTypeReadOnly<>();
Le type du stockage n'est pas 100% contraint par le type de la déclaration.
3  0 
Avatar de tchize_
Expert éminent sénior https://www.developpez.com
Le 08/07/2011 à 10:59
Citation Envoyé par Népomucène Voir le message

ça fait franchement bizarre d'écrire un nombre de cette façon
Entre nous, tu préfère tomber sur un code où une constante est écrite

100_000_000
ou
100000000

moi, au moins, dans le premier cas je vois immédiatement que la constante vaut 100 millions Dans le deuxième je dois balader mon curseur pour compter les 0.
3  0 
Avatar de Uther
Expert éminent sénior https://www.developpez.com
Le 29/07/2011 à 15:33
Citation Envoyé par air-dex Voir le message
Maintenant que Java 7 est sorti, on va pouvoir inscrire les enums Java dans la liste des espèces en voie de disparition. Place aux codage avec les pieds et aux Strings dans les switch et leurs futures erreurs chronophages dues à des problèmes de casse indécelables avant l'exécution.
Encore faut il que l'énumération ait un sens. S'il s'agit de créer une énumération qui ne sert que pour un switch c'est bidon.

De toute façon quand ces gens la voient que les String dans un switch ne marchent pas, ils font tout simplement une chaine de if, pas une énumération.
3  0