Lisez d'abord le message, puisque heap space, metaspace, direct buffer et GC overhead limit exceeded pointent vers des causes très différentes. Exécutez avec le dump du tas à la sortie mémoire pour capturer l'état au moment de l'échec, puis ouvrez le dump dans un analyseur de mémoire et regardez l'arbre de dominateurs pour voir ce qui retient le plus. Comparez des dumps dans le temps pour distinguer une vraie fuite d'un jeu de travail simplement plus grand que le tas.
Pourquoi les recruteurs posent cette question
Le recruteur veut une méthode reproductible et une familiarité avec l'outillage. Distinguer les variantes de l'erreur est un signal de crédibilité immédiat, tout comme connaître les coupables habituels : caches sans borne, ThreadLocal sur des threads de pool, fuites de class loader au redéploiement, et requêtes qui matérialisent une table entière. Il vérifie aussi que vous n'allez pas simplement augmenter la taille du tas et déclarer que c'est réglé.
Comment structurer votre réponse
- Lisez la variante précise de l'erreur avant de théoriser.
- Capturez automatiquement un dump du tas au moment de l'échec.
- Analysez la taille retenue et l'arbre de dominateurs, pas des comptages superficiels.
- Confirmez le correctif avec un cache borné ou une requête en flux, puis vérifiez.
Exemple de réponse
La variante compte. Java heap space veut dire que des objets vivants remplissent vraiment le tas, metaspace veut dire que des classes sont chargées et jamais libérées, et une erreur de direct buffer pointe vers NIO ou une bibliothèque native plutôt que vers mes objets. Donc je lis ça en premier, puis je m'assure que la JVM tourne avec le dump du tas à la sortie mémoire et un chemin sur un volume qui survit au redémarrage, parce que deviner sans dump fait perdre des jours. Avec le dump je regarde la taille retenue plutôt que la taille superficielle, et l'arbre de dominateurs nomme en général le coupable en deux minutes. Ce que je trouve en pratique est répétitif : une map utilisée comme cache sans éviction, une ThreadLocal posée sur un thread de pool et jamais nettoyée donc elle vit aussi longtemps que le pool, ou une méthode de repository qui renvoie toutes les lignes parce que quelqu'un a supprimé la pagination. Je regarde aussi les logs du ramasse-miettes pour voir si le tas montait régulièrement ou s'il piquait sur certaines requêtes. Le correctif consiste à borner quelque chose, un cache avec une taille maximale et une expiration, ou une requête en flux, puis je surveille le jeu vivant sur une semaine pour confirmer qu'il est plat.
Vous passez cet entretien bientôt ? GhostPilot écoute votre appel en direct, repère la question dès qu'elle est posée et affiche une réponse structurée à l'écran en temps réel. Essayez-le lors de votre prochain entretien blanc, ou prenez un Session Pass à $29, sans abonnement, pour le jour J.
Voir comment ça marcheQuestions de relance à prévoir
- Comment distinguez-vous une fuite d'un jeu de travail simplement trop gros ?
- Qu'est-ce qui cause une erreur de metaspace en particulier ?
- Comment les ThreadLocal fuient-elles sur un thread de pool ?
Autres questions pour Développeur Java
Votre recruteur posera sa propre version de celle-ci. Collez votre véritable fiche de poste dans le Question Predictor gratuit et obtenez les 20 questions que ce poste a le plus de chances de poser, avec ce que chacune cherche vraiment à sonder.
Prédire mes questions