[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-jvm-chto-takoe-jit-kompilyatsiya-i-kakie-urovni-kompilyatsii-sushchestvuyut":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":17,"progress":18,"seo":19},1218,"chto-takoe-jit-kompilyatsiya-i-kakie-urovni-kompilyatsii-sushchestvuyut",38,"jvm","JVM","⚙️","Что такое JIT-компиляция и какие уровни компиляции существуют","JIT (Just-In-Time) компиляция — это механизм JVM, при котором байт-код компилируется в нативный машинный код во время выполнения программы, а не заранее. Это позволяет выполнять оптимизации, невозможные при статической компиляции, на основе реального профиля выполнения.\n\n> Аналогия из жизни: представьте переводчика, который сначала переводит документ устно (интерпретация — быстро начать, но медленно при повторных обращениях). Заметив, что один и тот же абзац запрашивают часто, он записывает перевод (JIT-компиляция). В следующий раз вместо повторного перевода он просто зачитывает готовый текст.\n\n### Интерпретатор vs JIT\n\n```\nБайт-код (.class)\n      |\n      v\n Интерпретатор ---- медленное выполнение, быстрый старт\n      |\n      | (метод вызван N раз - \"горячий\" код)\n      v\n  JIT-компилятор -- быстрое выполнение, затраты на компиляцию\n      |\n      v\n Нативный код ----- максимальная производительность\n```\n\n### Уровни компиляции (Tiered Compilation)\n\nС Java 8 по умолчанию включена многоуровневая компиляция (`-XX:+TieredCompilation`), объединяющая два компилятора:\n\n| Уровень | Компилятор | Описание |\n|---|---|---|\n| 0 | Интерпретатор | Интерпретация байт-кода, сбор базового профиля |\n| 1 | C1 (Client) | Простая компиляция без профилирования |\n| 2 | C1 (Client) | Компиляция с ограниченным профилированием |\n| 3 | C1 (Client) | Компиляция с полным профилированием |\n| 4 | C2 (Server) | Агрессивная оптимизация на основе собранного профиля |\n\nТипичный путь: 0 -> 3 -> 4 (интерпретация -> C1 с профилированием -> C2 с оптимизацией).\n\n### Ключевые оптимизации JIT\n\nInlining (встраивание методов) — вызов метода заменяется его телом, устраняя overhead вызова:\n\n```java\n\u002F\u002F До инлайнинга\npublic int square(int x) { return x * x; }\npublic int compute(int n) { return square(n) + square(n + 1); }\n\n\u002F\u002F После инлайнинга (JIT делает автоматически)\npublic int compute(int n) { return n * n + (n + 1) * (n + 1); }\n```\n\nEscape Analysis (анализ побега) — если объект не покидает метод, JIT может:\n- Scalar replacement — разложить объект на отдельные переменные\n- Stack allocation — разместить объект на стеке вместо heap\n- Lock elision — устранить синхронизацию на объекте\n\n```java\npublic int sumPoints() {\n    Point p = new Point(3, 4);  \u002F\u002F объект не \"убегает\" из метода\n    return p.x + p.y;\n    \u002F\u002F JIT заменит на: return 3 + 4; (scalar replacement)\n}\n```\n\nOn-Stack Replacement (OSR) — JIT заменяет интерпретируемый код на скомпилированный прямо во время выполнения метода, не дожидаясь следующего вызова. Особенно полезно для длинных циклов.\n\n\u003Cdetails>\n\u003Csummary>Диагностика JIT-компиляции\u003C\u002Fsummary>\n\n```bash\n# Показать компилируемые методы\n-XX:+PrintCompilation\n\n# Логирование в Java 9+ (Unified Logging)\n-Xlog:jit+compilation=info\n\n# Показать инлайнинг\n-XX:+PrintInlining\n\n# Отключить C2 (только C1)\n-XX:TieredStopAtLevel=1\n\n# Отключить JIT полностью (только интерпретация)\n-Xint\n\n# Увеличить порог компиляции (по умолчанию ~10000 вызовов)\n-XX:CompileThreshold=5000\n```\n\n\u003C\u002Fdetails>\n\n### GraalVM JIT (Graal Compiler)\n\nGraalVM предоставляет альтернативный JIT-компилятор, написанный на Java (вместо C++ компилятора C2):\n- Написан на Java — легче разрабатывать и поддерживать\n- Продвинутые оптимизации (partial escape analysis)\n- Можно использовать как замену C2: `-XX:+UseJVMCICompiler`\n- Основа для GraalVM Native Image (AOT-компиляция)\n\n### Частые ошибки\n\n- Микробенчмарки без прогрева JIT — результаты не показывают реальную производительность (используйте JMH)\n- `-Xint` в production — отключает JIT, производительность падает в 10-100 раз\n- Слишком большие методы (> 300 строк) — JIT не будет их инлайнить и может не оптимизировать\n- Предположение, что JIT оптимизирует всё — только горячий код компилируется\n\n> **На собеседовании:** объясните суть JIT (компиляция горячего кода в native во время выполнения) и путь 0 -> 3 -> 4 (интерпретация -> C1 -> C2). Назовите ключевые оптимизации: inlining, escape analysis, OSR. Частая ловушка — вопрос о деоптимизации: JIT может откатить спекулятивную оптимизацию, если она оказалась неверной. Упомяните JMH для корректных бенчмарков.","","middle",[7,15,16],"performance","jit",[],null,{"title":20,"description":21,"ogTitle":22,"ogDescription":23,"keywords":24,"schemaAnswer":35,"featuredSnippetReady":36},"Что такое JIT-компиляция и какие уровни компиляции существуют — Gymterview","JIT-компиляция в JVM: Tiered Compilation (уровни 0-4), компиляторы C1 и C2. Inlining, Escape Analysis, On-Stack Replacement. GraalVM JIT и диагностика.","JIT-компиляция в JVM: уровни, оптимизации, GraalVM — Gymterview","Tiered Compilation: путь 0→3→4, компиляторы C1\u002FC2, ключевые оптимизации (inlining, escape analysis, OSR).",[25,26,27,28,29,30,31,32,33,8,34],"JIT","Just-In-Time","Tiered Compilation","C1","C2","inlining","escape analysis","OSR","GraalVM","собеседование","JIT — механизм JVM, компилирующий байт-код в нативный машинный код во время выполнения. Tiered Compilation (5 уровней): 0 — интерпретатор, 1-3 — C1 (быстрая компиляция), 4 — C2 (агрессивная оптимизация). Типичный путь: 0→3→4. Ключевые оптимизации: inlining (встраивание методов), escape analysis (устранение аллокаций), OSR (замена кода в цикле). GraalVM JIT — альтернатива C2, написанная на Java.",true]