«Не смотри, сожалей» 38 избранных вопросов и ответов JVM, сделайте вас экспертом!

Java JVM

Оригинал: Miss Sister Taste (идентификатор публичной учетной записи WeChat: xjjdog), добро пожаловать, пожалуйста, сохраните источник для перепечатки

В этой статье столько же38道Вопросы для интервью, учитывающие все аспекты JVM, являются общими вопросами. Если вы прочитаете и запомните ее, очень легко попасть на большую фабрику.

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

Некоторые вопросы интервью открытые, некоторые основаны на знаниях, обратите внимание на разницу. Для интервью нет стандартных ответов, тем более открытых вопросов, их нужно систематизировать в просторечии, чтобы максимально себя показать.

Если вы опишете в своем ответе что-то, с чем вы не очень знакомы, вас могут спросить. Поэтому по задаче организуйте себе подходящую, которая посолиднее учения.

Набор систем с открытым исходным кодом для учебных целей, добро пожаловать в звезду:GitHub.com/star hotel о, хорошо/неплохо…. Он включает в себя сложный бизнес ToB, бизнес с высокой степенью параллелизма в Интернете, приложение кэширования, DDD, руководство по микросервисам. Управляемый моделью, управляемый данными. Поймите путь эволюции крупномасштабных сервисов, навыки кодирования, изучите Linux и настройте производительность. Помощь Docker/k8s, мониторинг, сбор логов, изучение промежуточного ПО. Front-end технология, back-end практика и т.д. Основная техника:SpringBoot+JPA+Mybatis-plus+Antd+Vue3.

1. Какие области памяти есть у JVM? (Какова структура памяти JVM?)

JVM содержит,元空间,Java虚拟机栈,本地方法栈,程序计数器и другие области памяти. Среди них куча является самой большой частью памяти. наш обычный-Xmx,-Xmsи другие параметры предназначены для кучи.

  • куча: данные в куче JVM являются общими и занимают наибольшую область памяти
  • стек виртуальных машин: стек виртуальной машины Java основан на потоке, используемом для запуска инструкции байт-кода службы.
  • счетчик команд: Индикатор номера строки байт-кода, выполняемого текущим потоком.
  • метапространство: здесь находится область метода, а не куча

Локальная память: другой объем памяти

2. Какова модель памяти Java? (Что такое ДММ?)

JVM пытается определить унифицированную модель памяти, которая может инкапсулировать различия в доступе к памяти различного базового оборудования и операционных систем, чтобы Java-программы могли достичь одинакового эффекта параллелизма на различном оборудовании и операционных системах. Она разделена на рабочую память и основную память, потоки не могут получить доступ к основной памятинепосредственныйДля работы поток хочет взаимодействовать с другим потоком, а обмен возможен только через основную память.

Можно сказать, что JMM является основой параллелизма в Java, и его определение напрямую повлияет на механизм многопоточной реализации. существенный.

Приведенные выше два вопроса часто сбивают с толку, но их содержание совершенно разное.

3. Как определить мусор при сборке мусора JVM? Что такое корни GC?

JVM использует алгоритм анализа достижимости. JVM определяет выживание объектов через GC Roots. отGC RootsОтслеживание и поиск произведутReference Chainцепь. Когда объект не может иметь связи ни с одним корнем GC, он оценивается как мусор.

Корни GC обычно включают:

  • Различные ссылки, относящиеся к активным потокам, например ссылки в кадрах стека в стеке виртуальной машины.
  • Ссылка на статическую переменную класса.
  • ссылки JNI и т. д.

Конечно, есть более подробные ответы, и я лично думаю, что этих достаточно. Подробная версия выглядит следующим образом:

  1. В потоке Java все методы, вызываемые в настоящее время,引用类型Параметры, локальные переменные, временные значения и т. д. это с нами栈帧Различные сопутствующие ссылки.
  2. Все загруженные в данный момент классы Java.
  3. Статическая переменная ссылочного типа класса Java.
  4. Константа ссылочного типа (тип String или Class) в пуле констант времени выполнения.
  5. Некоторые ссылки на внутренние структуры данных JVM, такие какsun.jvm.hotspot.memory.Universeсвоего рода.
  6. Мониторинг объектов, используемых для синхронизации, например, вызывая объектwait()метод.
  7. JNI ручки, включая глобальные ручки и локальные ручки

4. Если объект Справочной цепочки удастся найти, выживет ли он?

Это не обязательно, это также зависит от типа ссылки. Слабые ссылки будут собираться во время сборки мусора, а мягкие ссылки будут собираться при нехватке памяти. Но объекты без Reference Chain точно будут переработаны.

5. Что такое сильные ссылки, мягкие ссылки, слабые ссылки и виртуальные ссылки?

Нормальное отношение ссылки на объект является строгой ссылкой.

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

Слабый ссылочный объект по сравнению с мягкими ссылками, чтобы быть более бесполезным一些У него более короткий жизненный цикл. Когда JVM является сборщиком мусора, объект, связанный со слабой ссылкой, перерабатывается независимо от того, достаточно ли памяти.

Виртуальная ссылка — это виртуальная ссылка, которая мало используется в реальных сценариях, в основном используется для отслеживания действий объектов, собираемых сборщиком мусора.

6. Вы сказали, что сделали настройку параметров JVM и конфигурацию параметров.Как я могу проверить значение по умолчанию системы JVM?

Используйте параметр -XX:+PrintFlagsFinal, чтобы увидеть значение параметра по умолчанию. Это значение по умолчанию также связано со сборщиком мусора, например UseAdaptiveSizePolicy.

7. Какие общие базовые параметры конфигурации JVM вы использовали в своей повседневной работе?

Xmx,Xms,Xmn,MetaspaceSizeЖдать.

Вам нужно всего лишь запомнить около 10, чтобы иметь дело с绝大多数Интервью, рекомендуется запоминать только параметры, относящиеся к G1. CMS, которая отнимает много времени и имеет много параметров и исключается, не стоит внимания. Время собеседования ограничено, так что вы не будете с ним бороться, если только вы не слишком высокомерны.

8. Пожалуйста, расскажите о своем понимании OOM

OOM - очень серьезная проблема, за исключением程序计数器, другие области памяти подвержены риску переполнения. Самое близкое к нашей обычной работе — переполнение кучи. Кроме того, метапространство переполняется, когда в области метода много содержимого. Существует также переполнение стека, которое обычно оказывает относительно небольшое влияние. Существует также возможность переполнения за пределами кучи, что сложнее устранить.

9. Какие средства есть у вас для устранения переполнения памяти?

(Эта тема очень большая, вы можете выбрать одну из практических занятий и обобщить ее. Вот пример самой распространенной)

Вы можете придумать достойный ответ:

Переполнение памяти включает в себя множество ситуаций, наиболее распространенная из которых я сталкиваюсь в своей повседневной работе.堆溢出. Был сбой на линии.После перезагрузки воспользовался командой jstat и обнаружил, что область Old все время растет. Я использовал команду jmap для экспорта онлайн-стека, а затем использовалMATанализ. сквозьGC RootsАнализ, я нашел очень большой объект HashMap, это изначально одноклассник做缓存Он используется, но неограниченный кеш приводит к постоянному увеличению использования памяти кучи. Позже измените этот кеш на Кэш гуавы, и поставил слабую ссылку, ошибка исчезла.

Этот ответ не очень блестящий, но это распространенный вопрос, и в нем невозможно найти ошибку.

10. Какая связь между алгоритмом сборки мусора GC и сборщиком мусора?

Обычно используемые алгоритмы сборки мусора включают алгоритмы очистки меток, сортировки меток и копирования. Счетчики ссылок также являются своего рода алгоритмом, но ни один сборщик мусора не использует этот алгоритм из-за проблемы циклических зависимостей.

Многие сборщики мусора представляют собой сборку поколений. Для молодого поколения в основном есть сборщики мусора, такие как Serial и ParNew, а в процессе переработки в основном используется алгоритм репликации.

Алгоритмы переработки старого поколения включают Serial, CMS и т. д., в основном использующие алгоритмы удаления меток и сортировки меток.

Мы больше используем G1 онлайн, а также есть понятия молодого поколения и старого поколения, но это сборщик целой кучи, а его объект переработки — небольшая область кучи.

В настоящее время, когда сегодня популярна G1, действительно не стоит беспокоиться о такой непростой вещи, как CMS.

11. Как настроить сборщик мусора в продакшене?

Во-первых, это проблема размера памяти.В принципе, я устанавливаю верхний предел для каждой области памяти, чтобы избежать проблем с переполнением, таких как метапространство. Обычно пространство кучи я задаю операционной системе2/3(Это сделано для того, чтобы зарезервировать время для других процессов и операционной системы), G1 предпочтительнее для куч размером более 8 ГБ.

Далее я бы провел предварительную оптимизацию JVM. Например, в соответствии с целью повысить скорость старости, отрегулировать соотношение между старым и молодым поколением.

Следующим шагом является специальная оптимизация.Основным основанием для оценки является пропускная способность системы, задержка доступа, пропускная способность и т. д. Наш сервис является высококонкурентным, поэтому он очень чувствителен ко времени для STW.

Я найду это узкое место, записав подробные журналы GC, позаимствовавgceasy(выделено) С помощью таких инструментов анализа журнала легко найти проблему. Причина, по которой я решил использовать этот инструмент, заключается в том, что журнал gc кажется слишком хлопотным, gceasy известен как проблема обучения и анализа ИИ, а визуализация лучше.

12. Как проверить, какой сборщик мусора по умолчанию на сервере?

Обычно это принимает другой параметр:-XX:+PrintCommandLineFlagsМожно распечатать все параметры, включая используемый сборщик мусора.

13. Если загрузка ЦП в производственной среде слишком высока, расскажите о своих идеях анализа и позиционировании.

Это действительно распространено, но уже гниет на улице. Если вы все еще опытный разработчик и не знаете, вам нужно подумать об этом.

Во-первых, используйтеtop -HКоманда получает поток с максимальной загрузкой ЦП и преобразует его в шестнадцатеричный формат.

Затем используйтеjstackКоманда получает информацию о стеке приложения и ищет это шестнадцатеричное число. Это позволяет легко найти конкретную причину высокой загрузки ЦП.

Если в состоянии напрямую использоватьarthasПросто сделайте это, вам не нужно делать эти кропотливые и кропотливые операции.

14. Какие инструменты мониторинга и анализа производительности вы использовали в JDK?

jps: используется для отображения процесса Java;jstat: используется для просмотра GC;jmap: используется для сброса кучи;jstack: используется для сброса стека;jhsdb: Используется для просмотра информации о память в выполнении;

Все они являются очень распространенными инструментами и должны быть освоены. Поскольку онлайн-среды обычно имеют множество ограничений, графические инструменты недоступны. Когда возникают такие ситуации, приведенная выше команда спасает жизнь.

15. Какие данные содержит кадр стека?

Работа JVM основана на стеке, который подобен стеку языка C. Большая часть ее данных находится в куче, и только небольшая часть данных времени выполнения находится в стеке.

В JVM элементы в каждом стеке потоков называются栈帧.

Стекская рама, содержащая: локальную таблицу переменных, стопку операнда, динамическое соединение, обратный адрес.

16. Что такое джит?

Чтобы повысить эффективность выполнения горячего кода, во время выполнения виртуальная машина будет компилировать эти коды в машинный код, связанный с локальной платформой, и выполнять различные уровни оптимизации. Компилятор, выполняющий эту задачу, называется компилятором Just In Time или сокращенно JIT-компилятором.

17. Каков родительский механизм делегирования Java?

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

Java по умолчанию использует это поведение. Конечно, в Java также есть много операций, нарушающих поведение родителей, таких как SPI (загрузка драйвера JDBC), OSGI и т. д.

18. Какие случаи нарушили механизм родительского делегирования?

  1. Tomcat может загружать файлы классов в свой каталог и не передаст его на погрузчик родительского класса.
  2. SPI Java, инициатором являетсяBootstrapClassLoader,BootstrapClassLoaderЭто уже наверху. он получает прямоAppClassLoaderВыполните загрузку драйверов, что противоположно родительскому делегированию. .

19. Кратко опишите процесс (поколенческой) сборки мусора

Сборщик поколений имеет два раздела: старого поколения и нового поколения, а пространство нового поколения по умолчанию составляет 5% от общего пространства.1/3доля по умолчанию старое поколения2/3.

Новое поколение использует алгоритм репликации, и в новом поколении есть 3 раздела:Eden,To Survivor,From Survivor, их пропорции по умолчанию8:1:1, его поток выполнения выглядит следующим образом:

Когда область Эдена в молодого поколения заполнена, срабатывает GC (Minal GC) молодого поколения. Конкретный процесс выглядит следующим образом:

  1. В реализации района Эдем第一次После GC выжившие объекты будут перемещены в один из разделов Survivor (далее из)
  2. Район eden снова GC, затем будет использовать алгоритм репликации, а также уборку и от области Eden. Живые объекты копируются в область. Далее область должна быть опустошена только от него

20. Каковы этапы CMS?

CMS устарела. Жизнь прекрасна, время ограничено, и дальнейшие исследования не рекомендуются. Если вы столкнулись с проблемами, вы можете напрямую прибегнуть к процессу утилизации.

(1) Начальная отметка (2) Параллельная маркировка (3) Параллельная предварительная очистка (4) Параллельная отменяемая предварительная очистка (5) Повторная пометка (6) Параллельная очистка

Благодаря популярности книги «Углубленное понимание Java виртуальных машин», в целом нет проблем для опускания шагов 3 и 4 во время интервью.

21. Какие проблемы с CMS?

(1) Проблема фрагментации памяти. Завершающая фаза полного GC вызовет длительную паузу. (2) Необходимо зарезервировать место для размещения «плавающего мусора», созданного на этапе сбора. (3) Используйте больше ресурсов ЦП для выполнения сканирования кучи во время работы приложения. (4) Время паузы непредсказуемо.

Именно из-за этих проблем все и пользуются более полной G1. Тем более сейчас эпоха большой памяти, G1 может хорошо играть, CMS использовать не надо.

22. Какие важные параметры сборщика мусора G1 вы использовали?

самое главное этоMaxGCPauseMillis, через него можно установить целевое время паузы G1, и он попытается достичь этой цели. G1HeapRegionSize может установить размер небольшой области кучи, который обычно равен степени 2.

InitiatingHeapOccupancyPercentПроцент использования кучи памяти при запуске одновременный GC. G1 Используйте его, чтобы вызвать параллельный цикл GC, основанный на всей использовании кучи, а не просто используя отношение памяти определенного поколения, по умолчанию на 45%.

более? Если вы не являетесь экспертом, нет необходимости просить других быть такими же.

23. Что означают Real, User и sys в журнале GC?

realФактическое время относится к времени, проведенному от начала до конца. Например, процесс ждет ввода-вывода, который тоже вычисляется.userОтносится ко времени, проведенному процессом в пользовательском режиме, только время, используемое в этом процессе, означает многоядерность.sysОтносится к количеству процессорного времени, затраченного процессом в режиме ядра, относится к времени, затрачиваемому системными вызовами в ядре, и подсчитывает только время, используемое этим процессом.

Это для просмотра журнала. Если вы не читаете журнал, ничего страшного, если вы его не понимаете. Однако значения этих трех параметров в основном одинаковы, где бы вы их ни видели, например, в операционной системе.

24. Что вызовет переполнение метапространства?

MetaSpace не имеет верхнего предела по умолчанию, и опасно иметь никакого предела. Когда в приложении слишком много классов Java, такие как пружины и другие рамки, которые используют динамические прокси, многие классы генерируются. Если оккупированное пространство превышает我们的设定值, происходит переполнение метапространства.

Таким образом, риск по умолчанию высок, но если вы не дадите ему достаточно места, он переполнится.

25. Когда будет вызвано переполнение памяти вне кучи?

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

26. Повлияет ли SWAP на производительность?

При недостаточном объеме памяти операционной системы часть данных, записываемых в SWAP, будет обмениваться точками, но производительность SWAP будет относительно низкой. При доступе к большому количеству приложений и приложений, требующих частого уничтожения памяти, склонны к катону. В общем, сценарии с высоким параллелизмом, отключенный SWAP.

27 Какие идеи по устранению неполадок с внешней динамической памятью?

Для памяти, занятой процессом, вы можете использовать верхнюю команду, чтобы увидеть значение, занятое сегментом RES. Если это значение значительно превышает максимальную кучу памяти, которую мы устанавливаем, это доказывает, что память Off-кучи занимает большую площадь.

Используйте gdb для создания дампа физической памяти, и обычно вы можете увидеть содержимое внутри. Для более сложного анализа можно использовать инструменты perf или gperftools с открытым исходным кодом от Google. Те нативные функции, которые используют больше всего памяти, легко найти.

28. Может ли ключ в HashMap быть обычным объектом? На что нужно обратить внимание?

Ключ и значение карты могут быть любого типа. Но следует отметить, что обязательно перепишите его методы equals и hashCode, иначе могут возникнуть утечки памяти.

29. Как увидеть заблокированные темы?

С помощью команды jstack вы можете получить информацию о стеке потока. Информация о тупиковой ситуации будет подсказана в очень очевидной позиции (как правило, в конечной).

30. Как написать простой код взаимоблокировки?

Частота прохождения этого письменного теста также довольно высока (компаниям, которые проходят письменный тест, стоит подумать дважды), так что вот ответ (вариантов много).

public class DeadLockDemo {
    public static void main(String[] args) {
        Object object1 = new Object();
        Object object2 = new Object();
        Thread t1 = new Thread(() -> {
            synchronized (object1) {
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (object2) {
                }
            }
        }, "deadlock-demo-1");

        t1.start();
        Thread t2 = new Thread(() -> {
            synchronized (object2) {
                synchronized (object1) {
                }
            }
        }, "deadlock-demo-2");
        t2.start();
    }
}

31, инструкция invokedynamic делает?

Это более продвинутая тема. Те, кто не видел виртуальные машины, обычно не знают. Так что если вы не знакомы с ним, не расстраивайтесь, дерзайте! (Маленький кулачок бьет тебя в грудь).

invokedynamicдаJava7Недавно добавленные инструкции байт-кода можно использовать для реализации некоторых функций языка с динамическим типом. Используемое нами лямбда-выражение реализовано с помощью инструкции invokedynamic в байт-коде. Его функция чем-то похожа на отражение, но реализована с помощью дескрипторов методов, что более эффективно.

32. Какой принцип волатильного ключевого слова? Для чего это?

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

Как правило, изменяемая переменная bool используется для управления рабочим состоянием потока.

volatile boolean stop = false;
	
	void stop(){
		this.stop = true;
	}
	void start(){
		new Thread(()->{
			while (!stop){
				//sth
			}
		}).start();
	}

33. Что такое встроенный метод?

Чтобы уменьшить накладные расходы на вызовы методов, вы можете поместить несколько коротких методов, таких какgetter/setter, включенных в область вызова целевого метода, требуется на один вызов метода меньше, и скорость может быть улучшена.Это концепция встраивания методов.

34. Как объект переходит от молодого поколения к старому поколению?

Это старомодная тема. В следующих четырех случаях объект будет входить в старое из молодого поколения.

  1. Если объект достаточно старый, он войдет в старость через Повышение, которое обычно оценивается в соответствии с возрастом объекта.
  2. Динамическое определение возраста объекта. Некоторые алгоритмы сборки мусора, такие как G1, не требуют, чтобы возраст достигал 15 лет для повышения до старости, и будут использовать некоторые методы динамического расчета.
  3. Распределение гарантии. Когда места Survivor недостаточно, ему необходимо полагаться на другую память (относится к старому поколению) для гарантированного распределения. В это время объект также будет размещен непосредственно на старом поколении.
  4. Объекты сверх определенного размера будут размещены непосредственно в старом поколении. Однако это значение по умолчанию равно 0, что означает, что выделяются все предпочтительные области Eden.

35. Что такое точка безопасности?

STW происходит не только при восстановлении памяти. Теперь, когда программисты настолько запутались, вероятность столкнуться с несколькими проблемами с безопасными точками относительно велика.

Когда происходит GC, пользовательский поток должен остановиться до сборки мусора, в этом состоянии мы можем думать, что JVM безопасна (SAFE), весь стек стабилен.

Если потоку не удается войти в точку сохранения до сборки мусора, то вся JVM ожидает заблокированного потока, что приводит к увеличению общего времени сборки мусора.

36. Когда состоятся MinorGC, MajorGC и FullGC?

MinorGC возникает при недостатке места в молодом поколении MajorGC относится к GC старого поколения MajorGC обычно сопровождается MinorGC.

Есть три случая FullGC.

  1. Когда старое поколение больше не может выделять память
  2. Когда метапространства недостаточно
  3. Отображение, когда System.gc вызывается. Кроме того, сборники мусора, такие как CMS, также произойдут Fullgc, когда Minorgc имеет продвижение продвижения

37. Сколько процессов есть для загрузки классов?

Загрузите, проверьте, подготовьте, проанализируйте, инициализируйте.

38. При каких обстоятельствах может произойти переполнение стека?

Размер стека можно задать параметром -Xss, при слишком глубоком уровне рекурсии произойдет переполнение стека. Такие как вызовы цикла, рекурсия и т.д.

End

JVM — большая тема, поэтому у xjjdog есть много расширенных статей. Следующие статьи точно вас порадуют.

"ДжВМ"Картина тысячи забот, память jvm еще никогда не была такой простой!
"ДжВМ"Сбой памяти Java? Только потому, что ты недостаточно красив!
"ДжВМ"Дайте мне 10 000 слов, а также расскажите о неясной проверке памяти в Java. 10 000 не может получиться 20 000~.~"ДжВМ"Драйв, JMC, сиди спокойно (jfr)
"ДжВМ"Зачем добавлять пустую строку в Java-код, а файл класса поворачивается лицом и не узнает человека?
"ДжВМ"Как Java получает конкретное имя параметра метода? Это хороший вопрос!

JVM — это относительно низкоуровневый элемент знаний, необходимое условие для написания высокопроизводительного кода и обязательное знание для продвинутого уровня JAVA. Если это может помочь вам получить предложение от крупной компании, не забудьте добавить моего друга, чтобы сообщить мне, и хорошо проведите время вместе.

Набор систем с открытым исходным кодом для учебных целей, добро пожаловать в звезду:GitHub.com/star hotel о, хорошо/неплохо…. Он включает в себя сложный бизнес ToB, бизнес с высокой степенью параллелизма в Интернете, приложение кэширования, DDD, руководство по микросервисам. Управляемый моделью, управляемый данными. Поймите путь эволюции крупномасштабных сервисов, навыки кодирования, изучите Linux и настройте производительность. Помощь Docker/k8s, мониторинг, сбор логов, изучение промежуточного ПО. Front-end технология, back-end практика и т.д. Основная техника:SpringBoot+JPA+Mybatis-plus+Antd+Vue3.

Об авторе:Мисс сестра вкус(xjjdog), публичная учетная запись, которая не позволяет программистам идти в обход. Сосредоточьтесь на инфраструктуре и Linux. Десять лет архитектуры, десятки миллиардов ежедневного трафика, обсуждение с вами мира высокой параллелизма, дающие вам другой вкус. Мой личный WeChat xjjdog0, добро пожаловать в друзья для дальнейшего общения.​