Pergunta

Eu sei que as variáveis ??e paramters de métodos locais vivem na pilha, mas não capaz de descobrir onde é que, na verdade, métodos de viver em caso de Java?

Se eu declarar qualquer objeto Thread como:

Thread t=new Thread();
t.start();

Então, isso significa que eu criei uma chamada separada de métodos além do método principal. O que isso significa? Será que isso significa chamar de sequência diferente de métodos mais de memória de pilha? Estou certo?

Foi útil?

Solução

Cada segmento é alocado a sua própria pilha.

Este artigo tem uma introdução boa para a separação de memória dentro de um processo Java.

máquina virtual Dentro do Java, cada thread é premiado com uma pilha de Java, que contém dados nenhuma outra lata fio de acesso, incluindo as variáveis ??locais, parâmetros e valores de retorno de cada método da discussão invocado. o de dados na pilha está limitado a primitivo tipos e referências de objeto. Na JVM, não é possível colocar a imagem de um objeto real no a pilha. Todos os objetos residem no heap.

Já vi muitos cenários onde os clientes implementaram servidores extremamente rosca na base de que cada thread faz muito pouco, e se deparam com problemas de memória. Isso porque cada thread é atribuído a sua própria pilha, e isso (obviamente) acrescenta-se. I pensar o valor padrão é 512k por thread, mas eu não encontrei uma fonte canônica para isso.

Outras dicas

Se bem me lembro, o próprio código método irá viver na porção do código de memória, enquanto as variáveis ??declarou internamente vai viver na pilha, e os objetos serão criados no heap. Em Java, os ponteiros de variáveis ??e primitivos vivem na pilha, enquanto todos os objetos criados vivem na pilha.

Para uma (má) representação ASCII:

-------
|STACK|
-------
|FREE |
-------
|HEAP |
-------
|CODE |
-------

Quando o PILHA representa a pilha, LIVRE representa a memória livre, MONTÃO representa o montão, e código representa o espaço de código.

Isto é o que a minha memória diz -. Alguns dos detalhes pode estar errado

A pilha é composta de chamadas de método. O java coloca na pilha é um registro invocação de método, que encapsula todas as variáveis ??(ambos os parâmetros e variáveis ??instanciadas localmente) para esse método. Quando você inicia um aplicativo Java, o método principal (que inclui automaticamente o parâmetro args) é a única coisa na pilha:

main(args)

Quando dizem que você cria um objeto e chamada foo.method Foo (), a pilha agora parece com:

method()
main(args)

Como métodos são chamados, eles são colocados na pilha, e como eles retornam, eles são removidos ou "bateu" a partir da pilha. Como variáveis ??são declarados e utilizado a entrada da pilha, o que corresponde ao método corrente (na parte superior da pilha), cresce para incluir o tamanho da variável.

Para o seu exemplo, com tópicos, cada thread terá sua própria pilha que existe independente de pilha uns aos outros do segmento.

A pilha contém todas as variáveis ??locais e todas as invocações método ativo. A pilha de espera tudo mais.

Como para a sua sub pergunta: isso significa uma nova pilha é criado com sua própria memória dedicada. Enquanto o seu novo segmento irá partilhar o espaço de pilha total (memória) atribuído pelo JVM

A pilha é dividido em várias gerações.

O bytecode, e sua corrosponding JIT compilou vidas código de máquina no chamado geração permanente, juntamente com internado Cordas e outros dados de classe.

Mesmo que ele é chamado de "permanente" geração, ele ainda pode ser lixo coletado. Algumas bibliotecas, frameworks e linguagens JVM gerar bytecode em tempo de execução, de modo que a geração permanente às vezes é preciso limpar. Assim como as outras gerações da pilha, mas (um normalmente espera) com menos frequência.

O bytecode real e / ou código JIT'd viveria na memória do processo. Há provavelmente só iria ser uma cópia do mesmo na memória do processo, como os tópicos em um determinado processo compartilham essa memória. Todas as variáveis ?? compartilhada por esses tópicos serão acessados ??pelos métodos em comum. Variáveis ??locais nas roscas (mesmo método local variáveis ??utilizadas dentro de um tópico) será criado dentro da memória desse segmento.

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