Introdução
Neste laboratório, você aprenderá como usar a memória Heap do Java (Java Heap Memory) de forma eficaz para evitar erros de memória Heap do Java.
Erro de Memória Heap Java
O erro de memória Heap do Java (Java Heap Memory Error) ocorre quando a Máquina Virtual Java (JVM) fica sem memória ao alocar objetos na memória Heap do Java (Java Heap Memory). Práticas de programação ruins, vazamentos de memória (memory leaks), bibliotecas de terceiros podem resultar nesse erro.
Código:
import java.util.ArrayList;
public class JavaHeapMemoryError {
public static void main(String[] args) {
ArrayList<Object> list = new ArrayList<Object>();
while (true) {
Object o = new Object();
list.add(o);
}
}
}
Para ver o erro em ação, compile e execute o código no terminal:
javac JavaHeapMemoryError.java
java -Xmx512m JavaHeapMemoryError
O programa tenta alocar o máximo de memória possível, criando continuamente objetos e adicionando-os ao ArrayList até que a JVM lance o OutOfMemoryError. O parâmetro -Xmx define a memória heap máxima alocada para a JVM.
Causas do Erro de Memória Heap Java
O erro de memória Heap do Java (Java Heap Memory Error) ocorre principalmente devido a práticas de programação ruins, vazamento de memória (memory leakage) e bibliotecas de terceiros. Para evitá-lo, devemos evitar loops infinitos, objetos não utilizados mantidos por muito tempo sem serem limpos e disponibilizar objetos não utilizados para o coletor de lixo (garbage collector).
Código:
public class JavaHeapMemoryError {
public static void main(String[] args) {
int[] arr = new int[100000000];
for(int i=0; i<arr.length; i++){
arr[i] = i;
}
System.out.println("Memory allocated");
}
}
Para ver o código em ação, compile e execute o código no terminal:
javac JavaHeapMemoryError.java
java -Xmx256m JavaHeapMemoryError
Vazamento de Memória (Memory Leak)
Vazamento de memória (Memory Leak) ocorre quando um objeto não utilizado na memória heap ainda possui referências válidas e não pode ser removido pelo Coletor de Lixo (Garbage Collector). Para evitar vazamentos de memória, todos os recursos abertos devem ser fechados usando o finally block.
Código:
public class MemoryLeak {
static ArrayList<String> arrList = new ArrayList<String>(500);
public static void main(String args[]) {
for (int i = 0; i < 500; i++) {
arrList.add("Element " + i);
}
arrList = null;
}
}
Para ver o código em ação, compile e execute o código no terminal:
javac MemoryLeak.java
java -Xmx256m MemoryLeak
Uso Excessivo de Finalizadores
O uso excessivo de finalizadores (finalizers) pode levar ao erro de memória Heap do Java (Java Heap Memory Error) porque classes que contêm um método finalize não têm seus espaços de objeto recuperados durante a Coleta de Lixo (Garbage Collection).
Código:
public class ExcessiveFinalizer {
public void finalize() {
//Do some cleanup
}
public static void main(String[] args) {
ArrayList<ExcessiveFinalizer> list = new ArrayList<ExcessiveFinalizer>();
while (true) {
list.add(new ExcessiveFinalizer());
}
}
}
Para ver o código em ação, compile e execute o código no terminal:
javac ExcessiveFinalizer.java
java -Xmx256m ExcessiveFinalizer
Aumentar Memória Heap
Se o erro foi causado por memória insuficiente alocada à JVM, podemos aumentar o espaço de heap disponível para ela, aumentando o limite definido pelo comando -Xmx.
Código:
public class IncreaseHeapMemory {
public static void main(String[] args) {
Integer[] outOfMemoryArray = new Integer[Integer.MAX_VALUE];
}
}
Para ver o código em ação, compile e execute o código no terminal:
javac IncreaseHeapMemory.java
java -Xmx8g IncreaseHeapMemory
Resumo
Neste laboratório, você aprendeu como gerenciar a Memória Heap de forma eficaz para suas aplicações Java, a fim de evitar erros de memória Heap do Java (Java Heap Memory Errors). Exploramos diferentes técnicas para prevenir o erro, como evitar loops ineficientes, fechar recursos não utilizados e disponibilizar objetos não utilizados para o coletor de lixo (garbage collector) antecipadamente. Por fim, se a memória heap insuficiente foi a causa do erro, aumentamos o limite usando o comando -Xmx.



