Sto provando a determinare la quantità di memoria di stack che ogni metodo consuma durante l'esecuzione. Per fare il compito, ho ideato questo semplice programma che sarà solo forzare un StackOverflowError
,Inversione dell'uso della memoria di stack di un metodo in Java
public class Main {
private static int i = 0;
public static void main(String[] args) {
try {
m();
} catch (StackOverflowError e) {
System.err.println(i);
}
}
private static void m() {
++i;
m();
}
}
stampa di un numero intero a dirmi quante volte m()
è stato chiamato. Ho impostato manualmente dimensione dello stack del JVM (-Xss
parametro VM) a valori variabili (128k, 256k, 384k), ottenendo i seguenti valori:
stack i delta
128 1102
256 2723 1621
384 4367 1644
delta è stato calcolato da me, ed è il valore tra l'ultimo line's i e quello corrente. Come previsto, è stato risolto. E qui sta il problema. Come so, l'incremento della memoria della dimensione dello stack era di 128k, che produce qualcosa come un 80byte di memoria per chiamata (che sembra esagerato).
Alzando m()
in BytecodeViewer di, otteniamo la profondità massima di una pila di 2. Sappiamo che questo è un metodo statico e che non c'è this
passaggio di parametri, e che m()
non ha argomenti. Dobbiamo anche prendere in considerazione il puntatore dell'indirizzo di ritorno. Quindi ci dovrebbe essere qualcosa come 3 * 8 = 24 byte usati per la chiamata al metodo (sto assumendo 8 byte per variabile, che ovviamente potrebbero essere completamente off. E '?). Anche se è un po 'più di questo, diciamo 48 byte, siamo ancora lontani dal valore di 80bytes.
Ho pensato che potesse avere qualcosa a che fare con l'allineamento della memoria, ma la verità è che in tal caso avremmo un valore di circa 64 o 128 byte, direi.
Sono in esecuzione una JVM a 64 bit con un sistema operativo Windows a 64 bit.
Ho fatto diverse ipotesi, alcune delle quali potrebbero essere totalmente off. Essendo questo il caso, sono tutto orecchie.
Prima che qualcuno comincia a fare questo che sto facendo questo I must be frank..
Questa era un'informazione interessante, signore. Potresti teorizzare sul perché ogni chiamata al metodo sembra richiedere 80 byte? –
Posso dirti quali informazioni contiene la mia implementazione JVM all'interno della struttura Frame? – Jivings
@devouredelysium Aggiornato la mia risposta con l'origine OpenJDK. – Jivings