9
votes

Comment découvririez-vous si une pile d'une machine augmente ou descendez-vous en mémoire? (JAVA)

J'ai un programme C pour vérifier si la pile de la machine se développe en mémoire de haut en mémoire.

Il va comme ça: xxx

je veux maintenant je veux Faites la même chose en Java. : -)

personne connaît une solution sans écrire de code natif ???

merci


3 commentaires

BTW, pourquoi voulez-vous faire la même chose en Java? Pure curiosité?


Rien, on m'a demandé cette question dans Google. Ensuite, l'intervieweur m'a demandé de mettre en œuvre cela en Java. :-)


Ce code est cassé. Plus de détails dans ma réponse ci-dessous.


4 Réponses :


14
votes

Si vous ne faites pas de code natif, je ne peux pas imaginer une situation dans laquelle il pourrait éventuellement une matière dans le code Java pur. Après tout, la pile Java peut être allouée dans n'importe quelle direction au lieu d'être un bloc de mémoire strictement contigu (comme la pile de la machine).


4 commentaires

Juste pour que vous réalisiez ce qu'il veut dire - il n'y a aucune règle qui dit qu'il doit monter ou vers le bas. Si vous le souhaitez, vous pouvez stocker chaque cadre d'appel à une position allouée en tas et aller partout. Avec une coopération GC / JIT, vous pouvez même déplacer les cadres de pile autour de l'exécution du programme. La capacité de soutenir cette flexibilité est venue en supprimant la capacité du programmeur à l'examiner directement.


"Vous pouvez stocker chaque cadre d'appel à une position allouée en tas". J'ai travaillé avec une implémentation qui l'a fait. En fait, cela n'a pas réalisé une allocation pour chaque cadre, il a utilisé un morceau puis enchaîné sur un autre. Donc, dans un simple test (si on pouvait être possible), il semblerait de descendre, mais s'est effondré un peu, puis «sur latéralement» à un nouveau bloc, puis à nouveau. La raison était que la JVM a été conçue pour travailler sur des architectures sans mémoire virtuelle. Donc, le seul moyen de réserver une grande plage contiguë pour la pile aurait été de l'allouer tout avant pour chaque fil.


... Je ne sais pas si cette stratégie est courante ou non, car c'est seulement une implémentation que j'ai jamais eu le couvercle. Mais nous n'avons certainement pas échoué de tests de conformité, vous ne pouvez donc pas l'exclure.


RISC OS (APCS-R) Est-ce que cela. C'était principalement utilisé pour C.



2
votes

WOAH, vous ne pourrez pas obtenir d'informations utiles sur un tel code simple en Java, moins que je sache.

Le code que vous avez apporte beaucoup d'hypothèses qui, même en C en réalité, peuvent être vraies ou non. Cela dépendra de la plate-forme et du système d'exploitation qui exécute votre programme.

En Java, vous dépendrez complètement de la mise en œuvre de la JVM pour adresser et, en tant que tel, ne pourrez pas le faire.

Ma première réponse serait d'utiliser un profileur. Vous pouvez également créer votre propre agent de profilage utilisant le API fournie (JVMTI) à cette fin. C'est beaucoup plus complexe que votre approche, mais vous devriez être capable d'obtenir ce dont vous avez besoin.

Il y a aussi ceci page chez IBM qui peut être utile.

C'est à peu près tout ce que j'ai sur le sujet, j'espère que cela vous aidera


0 commentaires

6
votes

Le code source Java compile au code d'octet Java qui est un montage comme une langue qui fonctionne sur la JVM. JVM est une machine virtuelle et il ressemblera donc exactement à la même chose par définition sur des machines utilisant une empilement et une empilement.

En raison de cela, il n'est pas possible de savoir si sur une pile de machines spécifique augmente vers le haut ou le bas du code Java.


0 commentaires

6
votes

Cela ne peut pas être fait dans le code Java. Il ne peut pas être fait en Code C non plus. Le code que vous avez affiché invoque un comportement non défini (& b> a) . Selon la norme, le résultat de la comparaison de deux pointeurs est indéfini à moins que les pointeurs pointaient des éléments dans le même réseau. La norme ne dit rien sur la direction de la croissance de la pile ou si une pile existe même.


1 commentaires

Il n'y a donc aucun moyen de dire si la pile pousse vers le haut ou vers le bas en C?