Je sais que je peux obtenir stacktrace en utilisant Thread.getAllStackTraces() (il retourne Map, mais clear ne fonctionne pas). Quand je cours la méthode de récursion je peux obtenir l'exception parce que stacktrace étant trop grand, y a-t-il un moyen de l'effacer?puis-je nettoyer stacktrace?
Répondre
Ce n'est pas la trace de la pile qui cause votre problème, c'est la pile elle-même. Chaque fois que vous appelez une méthode, des informations sont placées sur la pile pour vous permettre de revenir à la méthode d'appel. Si vous recursez assez, vous finissez par remplir tout l'espace de la pile (qui est lié par une taille maximale) et votre programme s'arrête. La trace de la pile vous montre simplement votre historique d'appels. Vous avez probablement une récursion infinie et vous devez trouver un moyen de l'arrêter avant que votre programme échoue. Soit il y a une erreur dans votre algorithme ou vous devez trouver un moyen de le résoudre différemment dans les limites de la mémoire à votre disposition.
Si vous rencontrez un débordement de pile dû à une récursivité incontrôlée, vous n'avez pas de chance. Le contenu de la pile est nécessaire pour revenir des appels de fonction, il n'y a aucun moyen de le "nettoyer" sensiblement. Le problème n'est pas la carte retournée par getAllStackTraces(), mais plutôt le contenu réel de la pile.
Vous devez restructurer votre code pour qu'il ne se répète pas à un niveau aussi profond.
Vous pouvez également rechercher s'il est possible d'augmenter la taille de la pile, mais si vous avez besoin d'une taille de pile non standard, cela indique généralement une implémentation problématique.
Vérifiez d'abord que votre programme n'a pas de bogue dans son code provoquant une récursion infinie menant au débordement de la pile.
Si ce n'est pas le cas, vous pouvez essayer d'allouer plus d'espace de pile à votre programme. Sous Linux, vous pouvez le faire avec la commande bash ulimit
comme:
ulimit -s 8000
ou même
ulimit -s unlimited
Si vous avez vraiment besoin pour décompresser la pile, vous pouvez utiliser setjmp/longjump en C ou utiliser des exceptions ou des continuations comme:
struct ClearStack {} ;
void myLongComputationWhichCausesStackOverflow() {
// do something
if (needsToClearTheStack)
throw ClearStack() ;
// do something else
}
int main(int ac, char *av[]) {
try {
mylongcomputation() ;
// continuation of program
// no stack clearing occurred
}
catch(const ClearStack & cs) {
// the stack was cleared and do something appropriately
}
}
Il fait ce que vous voulez mais ce n'est pas vraiment un bon style de programmation. Notez que vous devez trouver un moyen de savoir quand effacer la pile. Cela peut être assez difficile car vous ne pouvez pas savoir combien d'espace de pile reste ou si l'appel d'une fonction débordera la pile!
- 1. Eval stacktrace avec formatage
- 2. Eclipse Stacktrace System.err problème
- 3. Java StackTrace Editor ou GUI
- 4. Obtenir une stacktrace plus longue de FastMM?
- 5. Comment éviter "(null)" StackTrace dans DPH_BLOCK_INFORMATION?
- 6. Je ne vois pas stacktrace dans Instruments
- 7. Nettoyer les motifs Invoke?
- 8. Comment nettoyer sys.conversation_endpoints
- 9. Outil pour nettoyer les CSS?
- 10. Nettoyer les expressions régulières Python
- 11. Nettoyer le code indésirable C#
- 12. Comment nettoyer les URL Seaside?
- 13. StackTrace à partir de Exception sur différents threads?
- 14. Nettoyer l'espace de noms avec dom4j
- 15. Nginx nettoyer les urls réécrire pour Mediawiki
- 16. PHP pour nettoyer collé entrée Microsoft
- 17. Nettoyer AppBar après l'arrêt du processus
- 18. Comment nettoyer après avoir utilisé le dojo?
- 19. en utilisant mysql_real_escape_string pour nettoyer mes requêtes
- 20. Comment nettoyer le magasin de symboles?
- 21. Comment valider/nettoyer() un champ unique = True sans utiliser ModelForm?
- 22. Nettoyer les rôles de document dans une bibliothèque de documents
- 23. Après les grails nettoyer je ne peux pas courir-app
- 24. Renommer les contrôleurs dans Rails et nettoyer le contenu généré
- 25. php curl laisser le fichier dans le répertoire - Comment nettoyer
- 26. appel à nettoyer le code dans un environnement mod_perl
- 27. Expressions régulières PHP pour nettoyer les balises HTML dupliquées
- 28. Comment nettoyer les colonnes mal alignées dans du texte?
- 29. Dois-je nettoyer le caractère * transmis à NewStringUTF?
- 30. Nettoyer le chargeur de classes de timerTask connectionpool
Ceci est une information utile, mais ne s'applique pas à cette question. –