6
votes

Comment enquêter sur une collection d'ordures Java excessive

J'ai une instance Tomcat qui expose le comportement suivant:

  • Acceptez une seule demande entrante HTTP.
  • Émettez une demande à un serveur de backend et récupérez environ 400 ko de XML.
  • passez à travers ce XML et transformez-le en environ 400 kb de JSON.
  • renvoie la réponse JSON.

    Le problème est que, au cours de la manipulation de la requête 400K, mon webApp génère environ 100 Mo de déchets qui remplissent l'espace Eden et déclenche une collection de jeunes générations.

    J'ai essayé d'utiliser la fonctionnalité de Java HProf intégrée pour faire profilement des sites d'allocation, mais Tomcat ne semblait pas démarrer correctement avec cela en place. Il est possible que j'avais juste un peu impatient que j'imagine que l'allocation de mémoire Le profilage ait une hauteur élevée et que Tomcat Startup peut donc prendre beaucoup de temps

    Quels sont les meilleurs outils à utiliser pour faire du profil de mémoire Java de très jeunes objets / ordures? Je ne peux pas utiliser des décharges de tas car les objets qui m'intéressent sont des ordures.


0 commentaires

5 Réponses :


0
votes

Vous devriez pouvoir obtenir des vidanges de tas de temps à travailler de toute façon en débogage de l'application, plaçant des points d'arrêt aux points clés du code et en créant un dépotoir de tas lorsque l'application est en pause à chaque point d'arrêt.


1 commentaires

Je soupçonne que les ordures sont de courte durée dans ce cas, il serait extrêmement difficile de repérer les bits si la mémoire est nouvellement attribuée. Je veux idéalement quelque chose comme le profilage de la mémoire Visual VM que je peux exécuter mon processus Tomcat sur mon serveur Linux.



1
votes

Vous pouvez utiliser le profileur dans Jvisalvm dans le JDK pour faire du profilage de la mémoire.

Demandez également aux modèles de cache le transformateur XSLT.

http: // java .sun.com / J2SE / 1.5.0 / DOCS / API / JAVAX / XML / Transform / TEMPLATES.HTML


6 commentaires

Le profilage Jvisalvm est difficile car mon serveur Tomcat s'exécute sur Linux et je préférerais éviter l'ovehead de l'obtention d'exécution sur Windows où je fais mon développement ou installe une boîte GUI Linux.


Installez le JDK correspondant sur la Linuxbox et rediriger Jvisualvm pour utiliser un serveur X11 en cours d'exécution sur votre boîte Windows. Xming directement sur la machine ou Knoppix en cours d'exécution dans une session VMware, fonctionne très bien.


Notez également que si vous ajoutez le vaudou approprié à l'invocation Tomcat JVM, VisualVM peut vous connecter à partir de votre boîte de fenêtre sans autre ADIEU.


Jetez un coup d'œil à comment activer la surveillance JMX distante java.sun.com/j2se/1.5.0/docs/guide/management/agent.html#rem Ote . À Tomcat, il suffit de placer les arguments dans bin / setenv.sh (c'est-à-dire exportation catalina_opts = 'com.sun.management.jmxremote.port = 12345' etc.)


Je pense que la redirection de x est susceptible d'être le meilleur pari. Autant que je sache, Visualvm peut se connecter à distance mais ne peut pas effectuer de profilage de la mémoire distante.


En fait, la meilleure solution ressemble au profileur NetBeans qui prend en charge le profilage à distance de Tomcat, ce que je veux exactement. Je vais essayer cela demain.



0
votes

Vous voudrez peut-être essayer LambdaProbe , qui est un profileur pour Tomcat. Il prend en charge les éléments suivants:

Vue d'ensemble

Lambda Sonde (anciennement Tomcat Sonde) est une application Web suffisante, qui aide à visualiser divers paramètres d'une instance Apache Tomcat en temps réel. La sonde Lambda est conçue pour fonctionner spécifiquement à Tomcat, il est donc capable d'accéder à des informations beaucoup plus disposées normalement aux agents JMX. Voici une liste de fonctionnalités disponibles via la sonde Lambda:

  • Nouveau! Utilisation complète de la mémoire JVM moniteur.
  • Compatibilité JBoss
  • Affichage des applications déployées, Leur statut, compte de session, session nombre d'objets, compte de contexte compte, Utilisation de DataSource, etc.
  • commencer, arrêter, redémarrer, déployer et Mise à jour des applications
  • Possibilité de visualiser les fichiers JSP déployés
  • capacité à compiler tout ou sélectionné Fichiers JSP à tout moment.
  • possibilité de pré-compiler des fichiers JSP sur Déploiement des applications.
  • Nouveau! Capacité à visualiser automatiquement généré JSP Servlets
  • Affichage de la liste des sessions pour un application particulière
  • Affichage des attributs de session et leurs valeurs pour un particulier application. Capacité à enlever Attributs de session.
  • capacité à afficher le contexte de l'application attributs et leurs valeurs.
  • capacité à expirer des sessions sélectionnées
  • Affichage graphique de DataSource détails y compris le nombre maximum de Connexions, Nombre de personnes occupées Détails des connexions et de la configuration
  • Nouveau! Capacité à regrouper la source de données Propriétés par URL pour aider à la visualisation Impact sur les bases de données
  • capacité à réinitialiser les sources de données au cas où des applications qui fuient la connexion
  • Affichage des informations système y compris system.properties, mémoire Barre d'utilisation et détails du système d'exploitation
  • Affichage de l'état du connecteur JK y compris la liste des demandes Exécution en attente
  • Tableaux d'utilisation du connecteur en temps réel et Statistiques.
  • surveillance du cluster en temps réel et CLULSTER TRAFIC TRAFICS
  • Nouveau! Utilisation de la mémoire du système d'exploitation en temps réel, échange UTILISATION ET UTILISATION DE LA CPU Surveillance
  • possibilité de montrer des informations sur le journal Fichiers et télécharger des fichiers sélectionnés
  • capacité à queuner les fichiers journaux en réel Temps d'un navigateur.
  • capacité à interrompre l'exécution de Demandes "Accrocher" sans serveur Redémarrez
  • Nouveau! Capacité à redémarrer Tomcat / JVM Via Java Serview Wrapper.
  • Disponibilité "Vérification rapide"
  • Support pour DBCP, C3P0 et Oracle Datasources
  • Support pour Tomcat 5.0.x et 5.5.x
  • Support pour Java 1.4 et Java 1.5

0 commentaires

2
votes

sur le problème réel: l'analyse XML peut être une mémoire très en mémoire lors de l'utilisation d'un analyseur à base de DOM. Pensez à utiliser un SAX ou Parser binaire XML ( VTD-XML est une API Java basée sur cela).

En réalité, si la cartographie XML-> JSON est pure 1: 1, vous pouvez également envisager de simplement lire le XML et écrire la ligne JSON REALTime par ligne à l'aide d'une petite pile.


Retour à la question: Je suggère d'utiliser VisualvM pour cela. Vous pouvez trouver ici Article de blog Comment obtenir le fonctionnement avec Tomcat.


0 commentaires

0
votes

https://github.com/mchr3k/org.inmemprofiler/wiki ( http://mchr3k.github.io/org.inmemprofiler/ )

InMeMeProfiler peut être utilisé pour identifier quels objets sont collectés après une période très courte.


0 commentaires