TGViewer
Java Portal | Программирование Java Portal | Программирование @java_iibrary · 11.6K subscribers
Post #1996 2.65K
Часто мы пишем public static void main и просто предполагаем, что Java сама «делает свою работу».

Но за этим стоит довольно сложная и интересная система , а именно ClassLoader’ы.

Именно они отвечают за то, чтобы находить, проверять и загружать каждый класс, который использует твоё приложение.

Без ClassLoader’ов нет JVM, нет Spring, нет плагинов, вообще ничего нет.

Что такое ClassLoader?

Это компонент JVM, который отвечает за:

- Поиск определения класса (файлы .class, JAR’ы, модули).
- Загрузку его в память.
- Проверку байткода на валидность и безопасность.
- Определение класса в изолированном пространстве.

Проще говоря, он превращает байткод в то, что JVM может исполнять.

Иерархия держит хаос под контролем

В Java используется модель делегирования вверх {parent delegation}

Это защищает от конфликтов, дублирования и неожиданных подмен классов.

Основные загрузчики:

- Bootstrap ClassLoader
Написан на C++, загружает базовые классы языка (java.lang.*, java.util.* и так далее).
Живёт прямо внутри JVM.

- Platform / Extension ClassLoader
Загружает библиотеки самого JDK и системные модули.

- Application ClassLoader
Загружает твои классы, зависимости и весь прикладной код.

Типичный поток загрузки выглядит так:

Когда ClassLoader пытается загрузить класс, он сначала делегирует запрос родителю.
Если родитель не находит класс, тогда уже текущий загрузчик пытается загрузить его сам.

Это не даёт тебе случайно переопределить String, List, Object и другие базовые классы.

Как загружается твой код?

Когда ты запускаешь JAR:

java -jar app.jar


Твой код загружает Application ClassLoader. Процесс простой:

- Проходит по classpath
- Открывает JAR’ы
- Находит .class
- Загружает их по мере необходимости

Загрузка классов происходит по требованию.

Если у тебя 200 классов, а реально используются только 10, будут загружены только эти 10.

Почему это реально важно?

Потому что всё, что мы используем поверх Java, строит свою работу на ClassLoader’ах:

Spring Boot создаёт собственный ClassLoader для загрузки fat JAR’ов.
Модульные приложения используют загрузчики для изоляции компонентов.
Веб-контейнеры вроде Tomcat создают отдельный ClassLoader на каждое приложение.
Плагины (IDEA, Jenkins, Minecraft, OSGi) работают через отдельные загрузчики.
Инструменты hot reload (Spring DevTools, JRebel) зависят от динамической перезагрузки классов.

Зачем это понимать на практике?

Рано или поздно ты столкнёшься с ошибками вида ClassNotFoundException. Понимание ClassLoader’ов даёт отличную точку старта для отладки.

Самые частые проблемы:

ClassNotFoundException — класс отсутствует в classpath текущего загрузчика.
NoClassDefFoundError — класс был доступен, но возникла ошибка при загрузке или верификации.
“Невозможный” ClassCastException — объект вроде бы нужного типа, но Java считает иначе. Обычно это означает, что один и тот же класс был загружен разными ClassLoader’ами.
Memory leak в веб-приложениях — Tomcat некорректно выгружает ClassLoader при redeploy.

Последнее происходит значительно чаще, чем кажется.

ClassLoader’ы это как кровеносная система Java ( их не видно, но без них ничего не работает. )

Понимание того, как Java загружает классы это не пустая теория. Это делает тебя сильнее в отладке, увереннее при разборе сложных багов и даёт чёткое понимание среды, в которой реально работает твоё приложение.

И когда в продакшене что-то падает с ClassNotFoundException, ты точно будешь рад, что разобрался в этом заранее.

👉 Java Portal
  • 👍 14
  • ❤ 10
More from @java_iibrary
  1. Sep 28, 2026Проблема в продакшене. Приложение зависло. Вы запускаете: jstack <pid> Через несколько сек…
  2. Sep 27, 2026Java-разработчики, CopyOnWriteArrayList создаёт копию всего внутреннего массива при каждом…
  3. Sep 27, 2026Java-разработчики, ConcurrentHashMap потокобезопасен. Но он не блокирует всю коллекцию при…
  4. Sep 26, 2026Во многих приложениях есть такой эндпоинт. Фронтенд удаляет JWT после того, как пользовате…
  5. Sep 26, 2026Java: используйте Deque вместо Stack для работы по принципу LIFO («последним пришёл — перв…
  6. Sep 25, 2026Каждый Java-разработчик использует HashMap. Но задумывались ли вы… Почему его ёмкость всег…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →