la récursivité et de la mémoire
J'ai un programme qui passe dans des quantités énormes de données, disons 1000 variables, par le biais de la récursivité. La récursivité à au moins 50 ou 60 fois. Ce qui m'inquiète, c'est, est-il possible d'obtenir plus de données écrites sur les emplacements de mémoire, car il n'y a pas beaucoup de place, ou si les cas ont été qu'il n'y a pas de mémoire, je voudrais obtenir une exception que la mémoire de programme est épuisé (je n'ai reçu aucune erreur de ce type)?
Est-il une possibilité d'obtenir une mauvaise solution, car le programme n'a plus de mémoire et est écrit sur les sites existants?
- vous obtenez une exception que la mémoire de programme a exécuter
- Si vous exécutez hors de la mémoire physique de votre ordinateur sans l'exécution de la JVM de l'espace, il peut exécuter incroyablement lentement, mais vous auriez encore pas mal de réponses.
Vous devez vous connecter pour publier un commentaire.
Il y a deux zones de stockage en cause: l' pile et le tas. La pile est l'emplacement de l'actuel état d'un appel de méthode est conservé (c'est à dire les variables locales et les références), et le segment de mémoire est l'endroit où les objets sont stockés. Le Hotspot de la documentation dit que sur Linux 64 bits, chaque thread a une pile de 1024kB par défaut. Le tas peut être fait arbitraire grand, et aujourd'hui c'est dans l'ordre de GO.
Une méthode récursive utilise à la fois la pile et le tas. Lequel de vous lancer de la première dépend de la mise en œuvre. Considérez, par exemple, une méthode qui a besoin de milliers d'entiers: si elles sont déclarées comme variables locales, c'est à dire:
votre programme crask avec un
StackOverflowError
. D'autre part, si vous organisez votre entiers dans un tableau, comme:le tas sera rempli bientôt, et le programme se termine avec un
OutOfMemoryError
. Dans les deux cas, la mémoire est corrompue ou des données écrasées. Cependant, dans les deux cas, le code est mal et doit être fixé en quelque sorte - mais pour vous dire comment nous avions besoin d'en savoir plus au sujet de votre programme.Java stocke des objets dans l'espace du tas et que ces valeurs sont régénérées par le garbage collector. Cela signifie que ce que vous êtes de passage sont des références et non pas les valeurs de votre fonction, qui ne consomme de la mémoire parce que vous n'êtes pas la copie de vos variables (mais augmente la mémoire, par l'augmentation de la pile des images tout de même). Si vos objets sont référencés dans une pile de thread alors il n'y a aucun moyen, il sera écrasé.
Vous obtiendrez un Asynchrone exception (OutOfMemoryError) dans le cas de la JVM appauvri de sa mémoire, mais ici, la seule exception vous obtenez est un StackOverflowError si votre récursivité de la fonction s'appelle elle-même un grand nombre de fois.
Il n'y a aucune chance d'obtenir de mauvais résultats: dans le cas d'une stackoverflow votre programme mettre fin à prématurément avec un StackOverflowError.
Les emplacements de mémoire où vous stockez les données ne peuvent pas être remplacées par autre chose.
Java, ou même pour la question C, votre mémoire programme ne changera jamais l'état de sans rapport avec la mémoire.
Si la JVM ne prend pas en charge la queue de la récursivité. Donc, au maximum, vous arriverez StackOverFlowError quand il n'y a plus d'espace disponible. Vous ne devriez pas vous inquiéter à propos de la corruption des données, mais plutôt de voir si la récursivité de la pile est trop élevé (disons au-dessus de 2000). Les travaux sur ce si
Il peut y avoir deux cas
Assez de mémoire, la récursivité se termine et vous obtenez ressult.
Pas mough mémoire amd obtenir StackOverFlowError et le programme se termine
Vous n'aurez pas de mauvais résultats en raison de l'écrasement de la mémoire qui n'arrive pas