Monday, June 11, 2007

Tutorial[4parteRepost]

.::3-Alocação em Memória e Passagens de Parâmetros::.

3.1-As áreas em memória.

Passagens de parâmetro em Java é um assunto que mesmo programadores experientes na linguagem tropeçam ao tentar explicar como ela ocorre. Antes de irmos direto ao assunto, é necessário termos idéia de como as variáveis são alocadas na memória. Como já foi dito antes, uma variável é um nome associado a uma posição (endereço hexadecimal) de memória.Na sua declaração, o compilador "arranja" (aloca) um espaço para ela. Como isso ocorre?É simples: A VM (máquina virtual em inglês) define várias áreas de execução de dados que são utilizadas durante a execução de um programa (algumas criadas no start-up da VM e destruídas quando ela termina seu trabalho, outras existentes durante o ciclo de vida de uma thread), mas devemos considerar duas áreas cruciais para a alocação e execução de dados na sua memória principal (RAM) que são utilizadas pela Java Virtual Machine (JVM) durante a execução de um programa: a stack e o heap. Vamos á elas e as demais áreas de dados em execução:

A stack ("pilha") é uma área com suporte direto ao processador, através de seu apontador de pilha(stack pointer-sp).Ele empilha ( faz um"push") para criar nova memória, e desempilha("pop") para liberar aquela memória;ou seja, cabe ao sp guardar o endereço do próximo endereço vago na stack (o topo da stack). A stack é uma forma extremamente rápida para alocar espaço, perdendo apenas para registradores (que são localizados dentro dos processadores), mas o programador não tem qualquer controle ou evidência de que seu programa fará uso deles. O compilador sabe (durante a criação do .class) o tamanho e o tempo de vida de cada dado que será armazenado na stack, porque através desse conhecimento é que será gerado o código para movimentar o sp (conforme aloca ou libera espaço na memória).O limite da pilha (por default o tamanho da stack é 220KB na VM da Sun em máquinas usando Windows) restringe o que pode ser armazenado nela.Em geral, armazena variáveis locais, chamadas a métodos com seus parâmetros, variáveis temporárias para algum cálculo e referências a objetos (não os objetos em si, que ficam na heap).

A heap ("monte") é um local da memória que armazena todos os objetos que serão utilizados no seu programa (por isso é conhecido também como pool de memória). Quando um objeto é instanciado (geralmente através do operador new), esses objetos criados e seus respectivos parâmetros são automaticamente alocados na heap (através de seu construtor). Quando um método que utiliza o objeto é finalizado, uma exceção ocorre, ou o número de referências ao objeto cai a zero, ou threads que utilizam o mesmo morrem (são finalizadas); Ele -o objeto- fica passível de ser coletado pelo Garbage Collector, apesar de não sabermos quando isso ocorrerá (ficará a cargo da Máquina Virtual).
Existem outras áreas de dados em execução como a MethodArea (área de método), compartilhada entre todas as threads da JVM, armazenando estruturas como o Pool de Constantes, campos e dados de métodos; o Pool de Constantes (pertencente a MethodArea), que contém vários tipos de constantes, incluindo de literais numéricas (int, float...) que são conhecidas em tempo de compilação até métodos e campos de referências que devem ser resolvidas em tempo de execução; e a pilha de métodos nativos, que permite usar métodos escritos em outras linguagens, como C, mas sua existência depende da implementação da JVM(algumas permitem,outras não), e o pc register . A VM pode suportar diversas threads ao mesmo tempo (na verdade quase, elas são concorrentes, não simultâneas!). Cada thread possui seu próprio registrador contador de programas (pc register). De qualquer ponto, cada thread está executando o código de um único método, o método corrente para aquela thread. Se o método não é nativo, o registrador contém o endereço da instrução da VM que está sendo executada, se o método não é nativo, seu valor é indefinido. Esse registrador (pc) é grande o suficiente para armazenar um endereço de retorno, ou um ponteiro nativo específico de uma dada plataforma. O programador não possui qualquer controle direto sobre esse registrador ou qualquer área de dados que alocam/liberam memória (são transparentes ao programador)!

Essas áreas de memória são apenas para dar uma visão maior da plataforma Java em si, mas para nós, programadores, o que nos interessa é a stack e a heap, pois precisamos delas para saber como se processam as passagens de parâmetro em Java. O leitor já se perguntou o que ocorre em memória quando um simples objeto é alocado?Dada uma classe Guj, resolvemos criar uma instância g em memória de Guj. Ao fazermos:

Guj g=new Guj();

É utilizada uma área em memória da stack (com a variável de referência "g") para armazenar o endereço de memória heap aonde foi criada (logicamente) a estrutura do objeto Guj! Note que ao ser feita a declaração na stack (de Guj g; ) o objeto ainda não existe em memória realmente!Pois só quando fazemos new Guj(); alocamos esse objeto na área heap (aonde nossos objetos residem!). Quando criamos uma nova instância de Guj e atribuímos g a essa instância, passam a existir apenas uma área de memória em heap, mas existem duas áreas para as variáveis de referência na nossa pilha (stack). Exemplo:

Guj g1=new Guj();
g1=g;
//apontam para o mesmo local em heap!

Apesar de ser relativamente grande, o espaço na stack e na heap são limitados (pelo algoritmo empregado em dada VM e pelo seu espaço físico de memória principal disponível). Um sistema prevalente (que aloja todos os seus objetos em RAM) armazenando milhões de objetos na memória ou um programa que abusasse de recursividade criando inúmeras variáveis locais a cada iteração fatalmente estourariam os limites da heap e da stack . Alguns comandos que devemos saber para otimizar nossos programas:
*Atenção!Não são aplicáveis a todas as VMs (mas principalmente a HotspotVM )!

-Alterar o tamanho da sua stack padrão:
java -Xss:tamanho SeuPrograma

-Maior tamanho da stack possível:
javaXoss

-Maior tamanho possível da heap:
java -XX:+AggressiveHeap

Isso foi só uma curiosidade, mas tome cuidado ao passar esses parâmetros, pois gerar um caos no seu programa!Dê uma passada em http://java.sun.com/docs/hotspot/VMOptions.html para saber mais!

1 comment:

Anonymous said...

Yes indeed, in some moments I can say that I acquiesce in with you, but you may be inasmuch as other options.
to the article there is even now a suspect as you did in the fall delivery of this demand www.google.com/ie?as_q=spyware terminator 1.8.7.991 ?
I noticed the axiom you suffer with not used. Or you use the pitch-dark methods of helping of the resource. I have a week and do necheg