Что такое OutOfMemoryError: Java heap space?

Ошибка OutOfMemoryError: Java heap space возникает в Java, когда JVM не может выделить больше памяти в heap для создания новых объектов.

Причины возникновения

  • Недостаточно памяти heap
  • Memory leaks в приложении
  • Неэффективные структуры данных
  • Проблемы с обработкой больших данных

Как отладить ошибку

  1. Мониторь использование памяти - используй JVM мониторинг
  2. Используй профилировщики - для анализа использования памяти
  3. Проверь на memory leaks - ищи утечки памяти
  4. Анализируй heap dumps - для детального анализа

Как исправить ошибку

1. Увеличь размер heap

1# Увеличь максимальный размер heap
2java -Xmx2g -jar application.jar
3
4# Установи начальный и максимальный размер
5java -Xms512m -Xmx2g -jar application.jar

2. Оптимизируй структуры данных

 1// Неправильно - неэффективно для больших данных
 2List<String> list = new ArrayList<>();
 3for (int i = 0; i < 1000000; i++) {
 4    list.add("item" + i);
 5}
 6
 7// Правильно - используй streaming для больших данных
 8Stream.iterate(0, i -> i + 1)
 9    .limit(1000000)
10    .map(i -> "item" + i)
11    .forEach(System.out::println);

3. Исправь memory leaks

 1// Неправильно - потенциальная утечка памяти
 2private static List<Object> cache = new ArrayList<>();
 3
 4public void addToCache(Object obj) {
 5    cache.add(obj); // растет бесконечно
 6}
 7
 8// Правильно - ограниченный кэш
 9private static final int MAX_CACHE_SIZE = 1000;
10private static List<Object> cache = new ArrayList<>();
11
12public void addToCache(Object obj) {
13    if (cache.size() >= MAX_CACHE_SIZE) {
14        cache.remove(0); // удаляем старые элементы
15    }
16    cache.add(obj);
17}

4. Используй streaming для больших данных

1// Обработка больших файлов
2try (Stream<String> lines = Files.lines(Paths.get("large-file.txt"))) {
3    lines.filter(line -> line.contains("keyword"))
4         .forEach(System.out::println);
5}

Как мониторить подобные ошибки

  • Настрой мониторинг heap usage
  • Используй JMX для мониторинга JVM
  • Настрой алерты на высокое использование памяти
  • Используй инструменты профилирования (JProfiler, YourKit)

FAQ

В: Когда возникает эта ошибка?

О: Ошибка возникает при разработке и выполнении, когда JVM не может выделить больше памяти.

В: Как предотвратить эту ошибку?

О: Следуй best practices и реализуй правильную обработку памяти с мониторингом.

В: Какие инструменты помогают диагностировать ошибку?

О: Используй отладочные инструменты, логи и системы мониторинга.

Лучшие практики

  • Мониторь использование памяти регулярно
  • Используй streaming для обработки больших данных
  • Исправляй memory leaks своевременно
  • Оптимизируй структуры данных
  • Настраивай правильные размеры heap