Выбор ответа Senior JVM: память, GC, загрузка классов обновлено
ClassCastException: X cannot be cast to X
Вопрос
В сервере приложений получили ClassCastException: com.acme.User cannot be cast to com.acme.User. Что вероятнее всего?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Класс загружен двумя загрузчиками: для JVM это два разных типа. Тип в JVM определяется именем класса и загрузчиком.
Варианты ответа
- Разные версии JDK на этапе компиляции и запуска сервера
- Класс User не реализует Serializable, и копия не приводится
- Ошибка в JIT-компиляторе, который спутал два одинаковых класса
- Класс загружен двумя загрузчиками: для JVM это два разных типаправильный ответ
Разбор
Тип в JVM определяется именем класса и загрузчиком. Если один и тот же класс загружен, например, загрузчиком веб-приложения и общим загрузчиком сервера, объекты одного нельзя привести к другому, хотя имена совпадают. Разные версии JDK дают UnsupportedClassVersionError, а не CCE. Serializable тут ни при чём.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «JVM: память, GC, загрузка классов»
- Делегирование загрузчиков
- JVM в контейнере
- Сборщик по умолчанию
- Escape analysis
- Этапы загрузки класса
- GC roots
- Области памяти JVM
- Виды ссылок