2009-07-22 6 views
8

Tengo un programa en C para comprobar si la pila de la máquina está creciendo hacia arriba o hacia abajo en la memoria en¿Cómo sabría si la pila de una máquina crece o baja en la memoria? (JAVA)

Se va así:.

#include <stdio .h> 

void sub(int *a) { 
int b; 

if (&b > a) { 
    printf("Stack grows up."); 
} else { 
    printf("Stack grows down."); 
} 
} 

main() { 
int a; 
sub(&a); 
} 

ahora quiero hacer lo mismo en Java . :-)

Cualquiera sabe una solución sin escribir ningún código nativo ???

Gracias

+0

Por cierto, ¿por qué quieres hacer lo mismo en Java? Pura curiosidad? –

+0

Nada, me hicieron esta pregunta en Google. Entonces el entrevistador me pidió que implementara esto en Java. :-) – Roman

+0

Este código está roto. Más detalles en mi respuesta a continuación. – sigjuice

Respuesta

14

Si usted no está haciendo ningún código nativo, entonces no puedo imaginar una situación en la que posiblemente podría importar en código Java puro. Después de todo, la pila de Java podría asignarse en cualquier dirección en lugar de ser un bloque de memoria estrictamente contiguo (como la pila de la máquina).

+7

Para que se dé cuenta de lo que quiere decir, no hay una regla que diga que tiene que subir * o * hacia abajo. Si lo desea, puede almacenar cada marco de llamada en una posición asignada en el montón e ir por todo el lugar. Con alguna cooperación GC/JIT, incluso podría mover los marcos de pila mientras el programa se está ejecutando. * La capacidad de admitir esta flexibilidad vino al eliminar la capacidad del programador para examinarlo directamente. * –

+2

"podría almacenar cada marco de llamada en una posición asignada en el montón". He trabajado con una implementación que hizo esto.En realidad, no hizo una asignación para cada fotograma, usó un fragmento y luego se encadenó a otro. De modo que en una prueba simple (si uno fuera posible) habría parecido descender, pero en realidad bajó un poco, luego "de costado" a un nuevo bloque, luego bajó nuevamente. La razón fue que la JVM se diseñó para funcionar en arquitecturas que carecen de memoria virtual. Así que la única forma de reservar un rango contiguo grande para la pila habría sido asignarlo todo por adelantado para cada hilo. –

+0

... No sé si esta estrategia es común o no, ya que es solo esa implementación que alguna vez he tenido la tapa. Pero ciertamente no fallamos ninguna prueba de conformidad, por lo que no se puede descartar. –

2

woah, no podrá obtener ninguna información útil de un código tan simple en Java, al menos no que yo sepa.

El código que tiene hace muchas suposiciones que, incluso en C en realidad, pueden o no ser ciertas. Dependerá de la plataforma y el sistema operativo que ejecute su programa.

En Java, dependerá por completo de la implementación de la JVM para el direccionamiento y, como tal, no podrá hacerlo.

Mi primera respuesta sería utilizar un generador de perfiles. También puede crear su propio agente de creación de perfiles utilizando el API provided (JVMTI) para este fin. Es mucho más complejo que tu enfoque, pero deberías poder obtener lo que necesitas.

También existe este page en IBM que puede ser de ayuda.

Esto es más o menos todo lo que tengo sobre el tema, espero que le ayudará a

6

código fuente de Java se compila en Java de código byte que es un montaje como el lenguaje que se ejecuta en la JVM. JVM es una máquina virtual, por lo que se verá exactamente igual por definición tanto en máquinas que usan apilamiento como apilamiento.

Debido a esto, no es posible saber si en una máquina específica, la pila aumenta o disminuye desde el código de Java.

6

Esto no se puede hacer en código Java. No se puede hacer en código C tampoco. El código que ha publicado invoca un comportamiento indefinido (&b > a). Según el estándar, el resultado de comparar dos punteros no está definido a menos que los punteros apunten a elementos dentro de la misma matriz. El estándar no dice nada sobre la dirección del crecimiento de la pila o si existe una pila.

+0

Entonces, ¿no hay forma de saber si la pila crece hacia arriba o hacia abajo en C? –

Cuestiones relacionadas