Fuite mémoire dans java.text.DecimalFormat de GnuClasspath

Aujourd’hui, un collègue me montre du code qui utilise java.text.DecimalFormat de GnuClasspath, la JCL du projet GNU, et qui plante avec une java.lang.OutOfMemoryError.

L’objectif est de formater un double suivant un nombre de décimal, ce que fait très bien la classe java.text.DecimalFormat.

Voici la stacktrace complète de mon code de test :

Exception in thread "main" java.lang.OutOfMemoryError
at java.util.ArrayList.ensureCapacity(ArrayList.java:176)
at java.util.ArrayList.add(ArrayList.java:340)
at java.text.DecimalFormat.addAttribute(DecimalFormat.java:2236)
at java.text.DecimalFormat.handleFractionalPart(DecimalFormat.java:2074)
at java.text.DecimalFormat.formatInternal(DecimalFormat.java:1942)
at java.text.DecimalFormat.format(DecimalFormat.java:387)
at java.text.NumberFormat.format(NumberFormat.java:818)
at trash.MyTrash.testNewDecimal(MyTrash.java:34)
at trash.MyTrash.(MyTrash.java:18)
at trash.MyTrash.main(MyTrash.java:8)

Commençons les investigations de java.text.DecimalFormat.

(Lire la suite…)

Conversion d’un entier vers une chaîne de caractères

Au cours d’une relecture de code, je tombe sur cette ligne :

int myInt = 1979;
byte[] foo = ("" + myInt).getBytes();

L’objectif de ce code étant de récupérer un tableau de byte d’un entier en passant par une chaîne de caractères et ça fonctionne ! Mais cela est-il performant ?
(Lire la suite…)

Java Performance de Charlie Hunt et Binu John

Je vous avais présenté différents livres dans un article précédent et en voilà un nouveau sur les performances de Java qui vient de sortir ce 10 octobre 2011, Java Performance, The java series.

Les auteurs, Charlie Hunt, ingénieur sénior chez Oracle sur tous les sujets touchant à la performance de la JVM et Binu John,  ingénieur sénior sur les problématiques de performances chez Ning, Inc, ont dus nous pondre un livre très intéressant que je vais m’empresser d’acheter !

Java Performance / 1st Edition
Auteur : Charlie Hunt / Binu John
Éditeur : Prentice Hall
Parution : 10 octobre 2011
Pages : 720
● ISBN 10 / 13 : 0137142528 / 978-0137142521

Bonne lecture !

Java Class Librairy : c’est quoi ?

La JCL, ça pourrait être le Judo Club de Longvic en Bourgogne mais en fait cela signifie Java Class Library !

Plus précisément c’est un ensemble de bibliothèques Java qui est chargée dynamiquement par la JVM. Elle propose des implémentations Java pour fournir des services de base tel que les accès aux fichiers, la manipulation de chaîne de caractères, les calculs mathématiques, le graphisme, etc. Par conséquent, une JCL dépend directement de l’architecture. De plus, elle doit passer le Technology Compatibility Kit (TCK) pour être validée mais toutes ne le sont pas !

La JCL est importante pour les systèmes embarqués. En effet, celle-ci doit être choisie suivant son occupation en mémoire de masse, en mémoire vive mais aussi en services fournies.

(Lire la suite…)

Chaîne de caractères littérales et objet String

Les spécifications de Java expliquent que les chaînes de caractères littérales sont une suite vide ou de plusieurs caractères entre guillemets. Ceci correspond donc au type String. Par conséquent le langage Java permet de créer des chaînes de caractères de deux manières différentes :

// Initialisation de la chaîne de caractères
// par la construction de l'objet String
String foo = new String("Hello World foo");
 
// Initialisation de le chaîne de caractères
// par affectation d'une chaîne de caractères littérale
String bar = "Hello World bar";

On peut se demander si le compilation de ce code donne le même code intermédiaire (bytecode) ou pas.
(Lire la suite…)

Littérature sur l’optimisation de la JVM et du langage Java

Afin de partager l’information, j’avais écrit l’article Partage d’info sur les optimisations, l’embarqué et le temps réel pour donner quelques liens de sites internet et un autre article Littérature sur le Java temps réel pour indiquer quelques livres à lire sur le temps réel.

Aujourd’hui, je souhaite partager les livres qui m’aident au quotidien pour les optimisations de la plateforme J2SE dans l’embarqué, aussi bien pour la JVM que pour le code Java.
(Lire la suite…)

JAMon : mesurer le temps d’exécution d’une méthode

Dans un article précédent, Mesurer le temps d’exécution d’une méthode, je présentais quelques APIs disponibles sur Internet. L’objectif pour moi est de simplement savoir combien de temps prends une méthode en perturbant le moins possible l’application. Pour cela, je vais commencer par Java Application Monitor (JAMon) :

(Lire la suite…)

Mesurer le temps d’exécution d’une méthode

Pour mes tests de performances, j’ai souvent besoin de calculer le temps d’exécution d’une méthode afin de valider ou non les optimisations.

Sachant que les JVMs actuelles analysent le code à la volée pour l’optimiser, la mesure de la méthode à analyser doit être faite plusieurs fois pour faire une moyenne. Naturellement, la première idée est d’utiliser System.currentTimeMillis() .
(Lire la suite…)

Le combat : String vs StringBuilder vs StringBuffer

L’objet String est immuable, c’est à dire que son état ne peut pas être modifié après sa création, et toute manipulation entraînera la création d’un nouvel objet ce qui peut diminuer les performances de la JVM.

Pour pallier à ce problème de performance, la classe StringBuffer permet de manipuler des chaînes de caractères sans créer à chaque changement un nouvel objet. Cette classe est méconnue mais existe depuis le JDK 1.0 !

Cependant, il faut savoir que toutes les méthodes de la classe StringBuffer sont synchronisées, elle est dite thread-safe ! Ceci est indispensable si la chaîne de caractères peut être accédée de manière concurrente sinon c’est inutile.

Heureusement, depuis Java 1.5, la nouvelle classe StringBuilder est une copie de StringBuffer mais avec des méthodes non synchronisées permettant ainsi  d’améliorer les performances pour la manipulation de chaînes de caractères sans accès concurrent.

J’ai écrit un petit test pour illustrer tout cela.
(Lire la suite…)

Develop with real-time Java: create applications with predictable response times

Voici un article d’IBM du 2 juin 2011 sur le développement d’application Java temps réel Develop with real-time Java.

Cet article explique notamment :

  • pourquoi la plateforme Java convient aux applications temps réels
  • comment porter une application Java non temps réel dans un environnement avec des contraintes de temps
  • comment la JVM peut tirer les bénéfices d’un systèmes d’exploitation temps réel
  • pourquoi certains outils externes peuvent aider à développer

Bonne lecture !