Geral Pergunta: Java tem a pilha e pilha local. você pode acessar qualquer objeto da pilha?

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

  •  08-07-2019
  •  | 
  •  

Pergunta

Eu estava realmente olhando para as diferenças entre passar por valor e como objetos Java aloca eo que java faz para colocar objetos na pilha.

Existe uma maneira de acessar objetos alocados na pilha? Que mecanismos faz java valer a garantia de que o método correto pode acessar os dados corretos ao largo da pilha?

Parece que se você fosse esperto e talvez até mesmo manipular o bytecode java durante a execução, que você pode ser capaz de manipular dados para fora da pilha quando você não é suposto?

Foi útil?

Solução

Não há nenhuma instrução no conjunto de instruções JVM que dá acesso arbitrário para a pilha. Assim, a manipulação de bytecode não irá ajudá-lo aqui.

A JVM também tem um verificador. Ele verifica o código de cada método (como uma classe está sendo carregado) para verificar se o método não tentar aparecer mais valores fora da pilha de execução do que o que tinha empurrado para ele. Isso garante que um método não pode "ver" os objetos apontado por seu método de chamada.

Finalmente, as variáveis ??locais são armazenados em uma matriz método por (conhecida como a "matriz de variáveis ??locais"). Mais uma vez, o verificador garante que cada instrução de leitura / gravação de- / to- essa matriz especifica um índice que é menor que o tamanho da matriz. Note-se que estas instruções JVM só pode especificar um índice constante. Eles não podem ter um valor calculado e usá-lo como um índice.

Então, para recapitular, a resposta é não.

Outras dicas

Todos os objetos em Java estão localizados no heap. Eu não tenho certeza do que você quer dizer com "objetos de acesso da pilha". As únicas coisas armazenados na pilha são a lista de funções que apelou para o contexto atual e suas variáveis ??e parâmetros locais. Todas as variáveis ??e parâmetros locais são ou tipos primitivos ou referências.

Se você alocar um objeto usando new (que é a única maneira de alocar os tipos não-primitivos, sim isso inclui tipos de matriz), então o objeto é alocado na pilha, e uma referência a esse objeto é armazenado em ambos os pilha ou da pilha, dependendo se a referência é armazenada em uma variável / parâmetro local ou como um membro de outro objeto.

Quando passados ??como parâmetros para funções, todos os objetos são passados ??por referência - se a função modifica o parâmetro, o objeto original também é modificado. Identicamente, também se poderia dizer que as referências a objetos são passados ??por valor - se você alterar um parâmetro para se referir a um novo objeto, ele vai continuar a referir-se a esse objeto para a duração da função, mas o objeto original que foi aprovada em ainda vai se referir a tudo o que se referia a antes. tipos primitivos também são passados ??por valor.

Quanto objetos na pilha, é apenas o novo Java 6 VM da Sun (e talvez alguns outros) que tentarão código byte otimizar colocando objetos na pilha. Normalmente, todos os objetos entrará no heap. Para referência, veja: http://www.ibm.com/ developerworks / java / biblioteca / j-jtp09275.html

Além disso, a JVM especificação é em http : //java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html#6348 . O JVM protege seu acervo por simplesmente não dando-lhe instruções necessárias para que corruptos. Falhas em implementações de JVM pode causar sua milhagem para variar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top