2016-08-26 3 views
8

Je sais qu'il y a un surcoût intrinsèque de la JVM, et je voulais faire d'autres recherches pour voir exactement de quoi il s'agit. En utilisant le profileur YourKit, j'ai pu constater qu'il y a des int int [] remplis d'informations apparemment aléatoires. Mon hypothèse était que ceux-ci stockent des métriques de performance et d'autres choses que la JVM utilise pour optimiser les applications; mais à ma grande surprise tous les éléments sont la valeur 0.Pourquoi la JVM utilise-t-elle le géant int [] de tous les 0?

Pour obtenir mes résultats, j'ai utilisé le programme "ne rien faire" suivant, de sorte que les résultats n'incluent que des choses qui se passent sur la JVM.

public final class Main { 

    public static void main(String[] args) throws InterruptedException { 
     Thread.sleep(Long.MAX_VALUE); 
    } 

} 

C'est une capture d'écran du résultat de profilage, et je peux télécharger un instantané de la mémoire si nécessaire.

Screenshot from YourKit profiler

+3

C'est peut-être pour cette raison qu'il a posté cette question ...? –

+1

@Jire S'il vous plaît ne pas faire des modifications substantielles qui détournent la poste. Dans ce cas, le PO l'a approuvé, mais cela est généralement inacceptable. – 4castle

+0

@ 4castle L'anglais n'est pas ma langue maternelle alors j'ai apprécié ses modifications. Merci pour le FYI. –

Répondre

0

J'ai joué avec cela encore plus et cela a certainement à voir avec la taille du tas. Par exemple, si je mets -Xmx5m -Xmx5m, l'allocation de tableau int est partie. Alors que si je mets -Xmx5g -Xms5g cela crée beaucoup plus de tableaux.

enter image description here

Je me demande ce qu'ils les utilisent pour.

Vous avez obtenu de l'aide de/r/java.

« Très probablement, ce sont des objets de remplissage dans cette discussion buffers d'allocation locale qui aident à parsability tas. https://shipilev.net/jvm-anatomy-park/5-tlabs-and-heap-parsability/ Ils sont censés être inatteignable, et filtrés par des outils qui analysent les décharges de tas dans la capture d'écran, le profileur affiche » Tous Objets (accessibles et inaccessibles) "."

+0

Cela sera probablement marqué et peut-être supprimé bientôt, parce que ce n'est pas une réponse à la question.Au lieu de cela, vous devez modifier votre question et inclure les nouvelles informations que vous avez trouvées. – Marco13

1

Vous pouvez trouver la réponse en examinant les liens entrants vers ces tableaux. Cliquez avec le bouton droit sur un tableau accessible, sélectionnez "Objets sélectionnés", puis passez à "Références entrantes".

Je trouve qu'il ya des tables à sun.util.calendar.ZoneInfo, sun.util.Calendar.BaseCalendar, java.util.Currency etc.

Il est difficile de dire à coup sûr, mais le plus probable, ces grands inatteignables tableaux non mises à zéro ont été utilisés par JVM pour charger le code Java octet .class-fichiers. JVM n'en a pas besoin après la compilation, donc ils ont été libérés mais n'ont pas encore été collectés.

+2

Merci ne le savais pas. Mais ma principale préoccupation est les tableaux avec des indices> 600k qui sont inaccessibles. –

+0

J'ai ajouté mes réflexions à la réponse. –

+1

Ils ne sont jamais collectés pendant toute la durée du programme, ce qui fait que nous nous demandons à quoi ils servent. Bonne théorie cependant :) –