Domanda generale: Java ha l'heap e lo stack locale. Puoi accedere a qualsiasi oggetto dall'heap?

StackOverflow https://stackoverflow.com/questions/289138

  •  08-07-2019
  •  | 
  •  

Domanda

Stavo davvero osservando le differenze tra il passaggio per valore e il modo in cui Java alloca gli oggetti e cosa fa Java per mettere gli oggetti in pila.

Esiste comunque un accesso agli oggetti allocati sull'heap? Quali meccanismi applica java per garantire che il metodo giusto possa accedere ai dati giusti dall'heap?

Sembra che tu fossi furbo e magari manipolassi il bytecode java durante il runtime, che potresti essere in grado di manipolare i dati dall'heap quando non dovresti?

È stato utile?

Soluzione

Non ci sono istruzioni nel set di istruzioni JVM che dia accesso arbitrario all'heap. Quindi, la manipolazione del bytecode non ti aiuterà qui.

La JVM ha anche un verificatore. Controlla il codice di ogni metodo (mentre viene caricata una classe) per verificare che il metodo non tenti di estrarre più valori dallo stack di esecuzione di quello che aveva inserito su di esso. Ciò garantisce che un metodo non possa " vedi " gli oggetti indicati dal suo metodo di chiamata.

Infine, le variabili locali sono memorizzate in un array per metodo (noto come "array di variabili locali"). Ancora una volta, il verificatore si assicura che ogni istruzione di lettura / scrittura da / a quella matrice specifichi un indice inferiore alla dimensione della matrice. Si noti che queste istruzioni JVM possono specificare solo un indice costante. Non possono prendere un valore calcolato e usarlo come indice.

Quindi, per ricapitolare, la risposta è No.

Altri suggerimenti

Tutti gli oggetti in Java si trovano nell'heap. Non sono del tutto sicuro di cosa intendi per "accedere agli oggetti dall'heap". Le uniche cose memorizzate nello stack sono l'elenco delle funzioni che hanno richiamato nel contesto corrente e le loro variabili e parametri locali. Tutte le variabili e i parametri locali sono tipi o riferimenti primitivi.

Se si alloca un oggetto utilizzando new (che è l'unico modo per allocare tipi non primitivi; sì, questo include i tipi di array), l'oggetto viene allocato sull'heap e un riferimento a quell'oggetto è archiviato nello stack o nell'heap, a seconda che il riferimento sia memorizzato in una variabile / parametro locale o come membro di un altro oggetto.

Quando viene passato come parametro alle funzioni, tutti gli oggetti vengono passati per riferimento - se la funzione modifica il parametro, viene modificato anche l'oggetto originale. Allo stesso modo, si potrebbe anche dire che i riferimenti agli oggetti vengono passati per valore: se si modifica un parametro per fare riferimento a un nuovo oggetto, continuerà a fare riferimento a quell'oggetto per la durata della funzione, ma l'oggetto originale che è stato passato in farà ancora riferimento a qualsiasi cosa a cui si riferiva prima. Anche i tipi primitivi vengono passati per valore.

Per quanto riguarda gli oggetti nello stack, è solo la nuova VM Java 6 di SUN (e forse alcuni altri) che tenterà di ottimizzare il codice byte inserendo gli oggetti nello stack. In genere, tutti gli oggetti andranno nell'heap. Per riferimento, controlla: http://www.ibm.com/ developerWorks / java / library / j-jtp09275.html

Anche le specifiche JVM sono disponibili all'indirizzo http : //java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html#6348 . JVM protegge il suo mucchio semplicemente non dandoti le istruzioni necessarie per corromperlo. I difetti nelle implementazioni JVM possono variare il chilometraggio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top