2010-08-20 1 views
6

Nous avons récemment mis à jour une de nos applications de Java 1.4 à Java 6.La récupération de place passe-t-elle de Java 1.4 à Java 6?

Avec une certaine charge & tests de performance, nous avons constaté que la mémoire disponible est resté en général des niveaux beaucoup plus bas en Java 6 qu'à ce qu'elle était avec Java 1.4. Après un certain profilage sur l'application avec Java 6, nous avons remarqué que de nombreux objets qui ne sont plus référencés par d'autres objets (candidats à la récupération) restaient en mémoire et n'étaient apparemment jamais collectés. Nous avons pris cela comme l'explication de la mémoire disponible inférieure. La question est: est-ce que le comportement de la récupération de place est passé de Java 1.4 à Java 6?

+6

Je pense qu'il ne faut pas supposer que * toutes * les parties de la JVM, y compris le GC, se sont améliorées pendant toutes ces années ... delnan

+1

Etes-vous sûr que les objets sont de véritables candidats à la collection? Est-ce qu'ils sont collectés si vous lancez une collecte via JConsole? –

+0

Java 7 est censé avoir encore plus d'optimisations sur le garbage collector. – Steve

Répondre

15

Est-ce que le comportement de la récupération de place est passé de Java 1.4 à Java 6?

Certainement!

Java 1.4 à Java 6 est un laps de temps assez long (environ 5 ans entre les initialreleases et plus de 8 ans entre l'initial 1.4 release et the current Java 6 release, selon this wiki article).

De nombreuses modifications et optimisations sont appliquées pendant cette période et vous ne devriez pas vous en soucier tant que votre programme fonctionne toujours. Avoir plus de mémoire utilisée signifie que la JVM ne perd pas de temps avec la récupération de place quand elle n'en a pas besoin. Si vous voulez utiliser moins de mémoire, alors vous devriez réduire le tas maximum (ou modifier les paramètres de la JVM, this article explique comment faire cela dans Java 5, une grande partie du conseil est toujours applicable).

C'est un peu différent si vous obtenez réellement OutOfMemoryError que vous n'aviez pas précédemment. Ensuite, vous devriez vérifier comment vous utilisez les références faibles et souples ou, en dernier recours, essayer de savoir si vous avez rencontré un bogue JVM.

3

Java SE a beaucoup changé en 8 ans.

En ce qui concerne le garbage collector, il a été beaucoup amélioré avec Java SE 6. Dans Java SE 6 Update 14, le nouveau GC Garbage First a été introduit.

+0

Alors que G1 est livré avec des versions> = u14, il n'est activé par défaut dans aucune version de Java 6, pour autant que je sache. –

+0

Il ne l'est pas, vous devez l'activer avec '-XX: + UnlockExperimentalVMOptions -XX: + UseG1GC' –

+0

HEBERT: préparez-vous seulement pour les erreurs de segmentation et les plantages de la machine virtuelle, sauf si vous utilisez G1 avec Java 7. –

Questions connexes