Java Memória: Montão Espaço e Coletor de Lixo

Saiba mais sobre como Java gerencia a memória através do espaço de pilha e coleta de lixo. Compreender alocação de memória pode ajudar a evitar vazamento de memória em programas Java.

A+ A-

Recentemente, escrevi um aplicativo Java que, quando executado, requer um pouco de memória e eu comecei a obter o erro OutOfMemory:

 Erro: java.lang.OutOfMemoryError: Java heap space 

Isso geralmente acontece quando precisamos executar programas que consomem muita memória. A seguir estão algumas maneiras de resolver tais problemas.

O que é Java heap space?

Primeiro de tudo, vamos entender o que é espaço de pilha. Bem, Java usa memória principalmente nos arranjos de heap e pilha . Java mantém os parâmetros que são transmitidos a partir de um método de chamada para um método chamado , sob a forma de uma estrutura de pilha (isto é, os parâmetros são empurrados para dentro e saiu da pilha de acordo com a necessidade). Por outro lado, pilha é um espaço de memória acessado aleatoriamente em Java cria e mantém objetos. Java cria o objeto dentro deste espaço de pilha onde quer que encontra espaço suficiente para conter o objeto. Então, quando você cria um novo objeto (por exemplo, nova String () ;) o objeto é criado no espaço de pilha e ocupa a memória que pode caber em. Durante a coleta de lixo, Java libera o espaço de pilha desses objetos que não são mais referenciados. Mas se o número de referência (ou seja, "necessária") objetos continua a aumentar e nós não deferência-los -a JVM corre para fora do espaço de pilha.

A quantidade de memória que uma classe exigiria depende do número e tipo de seus membros de dados.

  1. A classe em si requer um mínimo de 8 bytes
  2. Cada membro de dados requer 4 bytes (longo e duplo exigem 8 bytes). Mesmo uma variável booleana é usar 4 bytes que ele só precisa de um pouco para se armazenado.
  3. Quantidade de memória usada cresce em blocos de 8 bytes
Otimizar seus programas Java

O primeiro passo para contornar este problema deve ser para ir através do programa e ver como ele poderia ser modificado de modo a fazê-lo usar menos memória. Desde muito o custo de memória tem sido extremamente baixo em comparação com o que foi durante 1960. E os programadores se tornaram muito extravagante em termos de subsídio de memória para seus programas. No entanto, ainda assim, na maioria das vezes, é preciso escrever programas que requerem mais memória do que disponível. Frugalidade no contexto do uso de memória é sempre bom, não só porque ele reduz as chances de acidente de programa, mas também, por vezes, aumenta a velocidade de execução.

Você deve definir objetos para ser nulo quando eles não são mais necessários em seu código. Isto é ainda mais importante se você estiver executando um loop em que você criar o objeto (s), mas, então, não descartá-los quando eles não são necessários.

Fazer uso de método coletor de lixo Java

O segundo passo para a otimização de uso de memória poderia ser para chamar explicitamente o método de coleta de lixo. Java automaticamente chama este método como e quando necessário e libera o espaço de memória que contém os objetos que não são mais referenciados. Mas você também pode chamar esse método explicitamente no seu código (por exemplo, depois de uma "grande tarefa" é realizado e no próximo "grande tarefa" está prestes a começar). Para chamar o coletor de lixo, use:

 Runtime.getRuntime () gc (.); 

Você pode monitorar o status da memória antes e depois gc () é chamado.

 System.out.println ( "nnCalling lixo Collectornn");
System.out.println ( "libertar memória antes:" + Runtime.getRuntime () freeMemory ().);
Runtime.getRuntime () gc (.);
System.out.println ( "memória livre depois:". + Runtime.getRuntime () freeMemory ());
System.out.println ( "recolha finishednn nnGarbage"); 

Método freeMemory () retorna quantidade de memória livre disponível medido em bytes. Para outros métodos fornecidos pela classe Runtime ver Java API

Dê mais memória para JVM

Os esforços para apesar de otimização de uso de memória, às vezes JVM, de fato, precisa de mais memória. Nesses casos, podemos dizer JVM via linha de comando para usar uma determinada quantidade de memória:

 java -Xms2000m -Xmx3500m 

-Xms E -Xmx muda especificar a quantidade de espaço de troca (memória virtual) que JVM pode usar em sua máquina.

-Xms Especifica o mínimo (ou seja, inicial) quantidade de memória

-Xmx Especifica a quantidade máxima de memória que JVM poderia usar.

Estes valores de memória devem ser especificadas em Megabytes.

Então, isso era sobre Java gerencia a memória através do espaço de pilha e mecanismo de coleta de lixo. Estas são escolhas inteligentes e cada programador Java deve ter uma compreensão clara de como Java lida com a memória. Só você vai ser capaz de trabalhar de forma eficiente em programas intensivos de memória.