2013-09-29 1 views
0

Lisez la définition ci-dessous dans un livre (Oracle Certified Associate, Java par M. Reese Richard.):Lorsque la mémoire de pile et pile empiète, le programme se termine-t-il?

« Comme Stack et Heap partagent le même espace mémoire, si elles entrent en collision alors le programme prendra fin. "

Est-ce vrai?

Et comment la pile et la mémoire tas collent-elles?

+6

Passez à un meilleur livre. – SLaks

+2

Vous avez déjà entendu parler de [Stack overflow] (http://en.wikipedia.org/wiki/Stack_overflow)? – nosid

+2

De quel livre s'agit-il? – Joni

Répondre

0

Les programmes Java sont multithread, chaque thread étant affecté à une pile distincte. Ils n'ont donc pas une seule pile qui se développe vers le tas, donc les programmes Java eux-mêmes ne peuvent pas provoquer cette collision. Si les piles des threads sont stockées à une extrémité de la mémoire, la création de threads supplémentaires peut provoquer l'augmentation de l'espace de pile total vers le tas. La JVM elle-même aura un peu d'espace de pile, qui croît probablement vers l'espace de tas, et pourrait donc en théorie entrer en collision. La JVM doit être écrite pour éviter une récurrence profonde (et surtout infinie). Si sa pile peut grossir vers le tas (plutôt que d'être finie), elle devrait détecter ce problème et le signaler au programme en utilisant une machine virtuelle virtuelle (VirtualMachineError). Toutefois, les machines virtuelles Java ne permettent pas au segment de se développer de manière incontrôlée, mais sont configurées avec un espace de segment de mémoire maximal et disposent d'un contrôle complet sur la création de nouvelles piles pour les unités d'exécution. Il peut donc empêcher complètement la collision. La seule collision potentielle serait si la création d'une nouvelle pile de thread était impossible. La machine virtuelle Java signale cette condition à l'aide d'une erreur VirtualMachineError (probablement une erreur OutOfMemoryError).

Questions connexes