2015-12-24 4 views
2

Je suis en train de régler un tas lourd d'applications Java en cours d'exécution dans un environnement 64 bits (obligatoire taille du tas plus de 32G) et ayant l'intention d'augmenter Xmx à un nombre approprié.Y at-il un moyen de déterminer la taille prise par OOPS dans un processus jvm

Après 32G, OOPs (Pointeurs objet ordinaire) ne seront pas compressés en utilisant option -XX: + UseCompressedOops. J'ai donc besoin de connaître la taille exacte des POO dans mon application pour compenser les OOPS non compressés et augmenter la mémoire supplémentaire requise en plus de cela.

Y at-il un moyen de déterminer la mémoire totale consommée par OOPs seul?

+1

Quels sont OOPs ?? –

+0

Pointeurs d'objets ordinaires – Vivek

+0

semble être un double de http://stackoverflow.com/questions/52353/in-java-what-is-the-best-way-to-determine-the-size-of-an-object ? rq = 1 Avez-vous essayé d'utiliser un profileur? Pouvez-vous partager le résultat si oui? –

Répondre

1

Il est assez simple en utilisant la bibliothèque Java Object Layout qui est available sur Maven Central. Il suffit de vérifier le champ statique org.openjdk.jol.util.VMSupport.OOP_SIZE:

import org.openjdk.jol.util.VMSupport; 

public class Test { 
    public static void main(String[] args) { 
     // Prints OOP size in bytes: usually 4 or 8 
     System.out.println(VMSupport.OOP_SIZE); 
    } 
} 

Exemple de sortie:

$ java -cp jol-core-0.4.jar;bin -Xmx32G Test 
8 

$ java -cp jol-core-0.4.jar;bin -Xmx31G Test 
4 

$ java -cp jol-core-0.4.jar;bin -Xmx32G -XX:-UseCompressedOops Test 
8 
+0

Cela me dira la taille d'une POO, ce qui n'est pas quelque chose que je voulais. Je voulais connaître la taille consommée par tous les POO dans le processus – Vivek

+0

@Vivek La seule façon de procéder est de vider tous les objets du tas et de compter le nombre de références. Pourquoi veux-tu savoir ça? Peut-être qu'il y a une meilleure façon de faire cela? Avez-vous essayé d'utiliser un profileur de mémoire? –