счет за волкаПожалуйста, указывайте первоисточник при перепечатке, спасибо!
Пусть к тебе хорошо относится этот мир
от«Что касается собеседований по Java, вы должны подготовить эти очки знаний»Объем чтения и лайки этой статьи можно найти.Кажется, все предпочитают такие статьи.Возможно, технические статьи относительно скучны.Это лишь некоторые из проблем, с которыми я недавно столкнулся во время собеседований.Я надеюсь разобраться с ними. Оказывайте помощь нуждающимся учащимся и более систематически изучайте различные точки знаний.
####Виртуальная машина, связанная с JVM Не каждый интервьюер задаст этот вопрос, но если вы претендуете на руководящую должность, эта ссылка незаменима, а уровень сложности собеседования разный.Некоторые интервьюеры могут попросить вас рассказать о модели памяти виртуальной машины, а именно Однако , некоторые также позволят вам объяснить реализацию сборки мусора, конечно, также будет практический опыт настройки виртуальной машины, устранения неполадок онлайн и так далее.
Сценарий диалога: Интервьюер: Вы знаете что-нибудь о виртуальной машине Java?
Я: Ну, у меня было небольшое разоблачение... (Брат Шуй сказал, что нельзя слишком много говорить, легко дать пощечину)
Интервьюер: Тогда вы можете сначала поговорить о его модели памяти.
Я: куча Java, стек Java, счетчик программ, область методов, постоянное поколение 1.7, метапространство 1.8.... (я объясню концепцию потрескивания, кратко опишу назначение каждой области памяти и расскажу все, что думаю of, не резервируйте, не ждите, пока интервьюер спросит: «Что-нибудь еще?»)
Интервьюер: Хорошо, как реализована общая куча Java?
Я: В реализации виртуальной машины HotSpot куча Java разделена на новое поколение и старое поколение.В то время я смотрел на реализацию 1.7, и все они имеют постоянное поколение.Новое поколение разделена на зону эдема и зону выжившего, а зона выжившего делится на S0 и S1, или от и до, (в это время прошу бумагу и ручку, т.к. думаю эту тему можно обсуждать долго, и это знакома мне... при рисовании и описании), среди которых размер памяти eden по умолчанию, от и до составляет 8:1:1 (должны быть оговорены всевозможные детали...), в это время я нарисовали на бумаге область, представленную новым поколением и старым поколением
Интервьюер: Ну, расскажи мне о процессе инициализации объектов в памяти?
Я: (Не говорите просто, что новый объект размещается и инициализируется в куче Java или в области eden) Чтобы инициализировать объект, сначала загрузите файл класса, соответствующий объекту.Данные будут загружены в постоянную память. генерация, и базовый объект instanceKlass будет создан для представления класса, а затем будет выделено место в памяти для объекта, который будет инициализирован. Размер сначала будет выделен в личном пространстве памяти потока. Если места недостаточно, то память будет выделена в eden. ...^&&*%
Интервьюер: Ну, ладно, расскажите мне об общем процессе YGC...
Я: Сначала найдите корневые объекты, такие как объекты, на которые ссылаются в стеке Java, объекты, на которые ссылаются статические переменные, и объекты, на которые ссылаются системный словарь ожидания, пометьте эти объекты как активные объекты, скопируйте их в область to, а затем пройдитесь по ним. активные объекты Отметьте объекты, на которые ссылаются, найдите объекты объектов старости, которые имеют отношение ссылки в области Эдема, и пометьте их, и, наконец, скопируйте эти отмеченные объекты в к. В процессе копирования также необходимо оценить, возраст gc активного объекта достиг порога.при достижении порога он напрямую повышается до старости.после окончания YGC происходит обмен ссылками от from и to (если можно сказать больше, то я говори больше, провинциальный интервьюер будет задавать вопросы еще раз, а я грубо скажу старость cms рециркуляция., думал интервьюер пропустит тему, молод еще).
Интервьюер: Вы только что упомянули, что когда вы были в YGC, некоторые объекты могли продвигаться, что делать, если продвижение не удалось?
Я: .... (остановился на несколько секунд, помню, что анализировал этот код, но не впечатлен) Помню, что на этапе разметки объект и соответствующие ему данные заголовка объекта сохраняются в два стека, если продвижение не удалось, восстановите заголовок объекта...
Интервьюер: Сталкивались ли вы с такой ситуацией в своем реальном проекте и какие проблемы это вызовет?
Я: ... (ни разу с этим не сталкивался) Да, сталкивался один раз, при анализе лога gc обнаружил, что после того, как произошел YGC, лог показал, что памяти после gc стало больше, и это позже обнаружилось из того, что это было из-за объекта неудачи продвижения по службе. (смутно помню, что читал статью Stupid God, и ответ был очень пустым)
Интервьюер: (не опровергая, продолжайте спрашивать) Есть ли у вас опыт настройки производительности виртуальных машин?
Я: (Честно говоря, у меня действительно нет большого опыта настройки) Ну, есть один момент, которого не очень достаточно, то есть, когда наш проект XX был запущен, мы обнаружили, что YGC был очень частым ^^&^ 8&, настроив размер нового поколения (параметры виртуальной машины онлайн-среды установлены по умолчанию) и проверьте код бизнес-логики &*&?~~!
Интервьюер: А? Больше?
Я: (Интервью было таким долгим, что я боюсь, что следующее предложение интервьюера будет «Ну? Есть что-нибудь еще?» Очевидно, интервьюер не удовлетворен моим ответом, но я могу ответить только так.. .) Что ж, опыт действительно ограничен, и некоторые сопутствующие оптимизации были сделаны на основе этого проекта.
Интервьюер: . . . . . .
Я:. . . . . .
Интервьюер: Тогда давайте посмотрим на что-нибудь еще.
Что касается статей о виртуальных машинах, то я написал анализ реализации хотспота, желающие могут посмотреть, эти статьи действительно немного скучноваты.
Статьи по Теме:Процесс запуска JVM анализа исходного кода JVM Инициализация динамической памяти для анализа исходного кода JVM Процесс загрузки классов Java при анализе исходного кода JVM Процесс создания объектов Java при анализе исходного кода JVM Как запускать и выполнять потоки GC при анализе исходного кода JVM Выполнение процесса сборки мусора анализа исходного кода JVM Внедрение нового поколения DefNewGeneration анализа исходного кода JVM Реализация алгоритма сборки мусора TenuredGeneration в старости анализа исходного кода JVM
###Подробности Детали определяют успех или неудачу В процессе собеседования, хотя здесь также присутствует элемент удачи, владение деталями может быть хорошим показателем технического уровня экзаменуемого.
####изменчивый Сценарий диалога: Интервьюер: Расскажите о принципе реализации ключевого слова volatile.
я: ключевое слово volatile обеспечивает видимость памяти и запрещает переупорядочивание памяти
Интервьюер: Объясните отдельно
Я: Поскольку в памяти виртуальной машины есть понятия основной памяти и рабочей памяти, у каждого процессора есть своя рабочая память, при чтении общей переменной сначала читается переменная рабочей памяти, если в ней нет соответствующей рабочей памяти. рабочая память Переменная загружается из основной памяти в рабочую память, а обычные переменные рабочей памяти модифицируются, и они не будут синхронизированы с основной памятью сразу, другие потоки могут читать последнее значение && %%. ..
Интервьюер: Как это гарантируется?
Я: при записи изменяемой переменной непосредственно записывайте последнее значение в основную память и очищайте данные строки памяти, в которой находится переменная, в рабочей памяти других процессоров.При чтении изменяемой переменной она будет читать данные из основной памяти&&&%%¥@
Интервьюер: Вы знаете, как реализован системный уровень?
Я: (что, что ты, о чем ты говоришь) я помню, что ассемблерный код, который манипулирует volatile-переменными, будет иметьlockинструкция префикса
Интервьюер: Вы говорите об уровне кода, я говорю об уровне системы.
Я: (с недоумением...) Я действительно не изучал это дальше...
Статьи по Теме:"головоломка с ключевыми словами Java"
####Object.finalize Сценарий диалога: Интервьюер: Расскажите о принципе реализации метода finalize класса Object.
Я: (Я вообще не ожидал, что интервьюер спросит об этом) При создании нового объекта JVM определит, переписал ли класс, соответствующий объекту, метод finalize, и тело метода finalize не пусто, затем инкапсулирует объект как объект Finalizer и добавьте его в список Finalizer.
Интервьюер: Ну и что?
Я: В классе Finalizer будет инициализирован поток типа FinalizerThread, который отвечает за получение объекта Finalizer из очереди ссылок, и выполняет метод runFinalizer объекта Finalizer, и, наконец, выполняет метод finalize исходного объекта, && %%## (эта логика немного запутана, и ответ был немного неверным в то время)
Интервьюер: Когда объект Finalizer окажется в очереди ссылок?
Я: (пытаясь вспомнить) Когда происходит GC, в какой момент времени или как он вставляется в очередь ссылок, я забыл реализацию... (Я действительно забыл, я просто помню, что эта часть логики слишком сложна)
Интервьюер: Хорошо, вы проверили, будет ли выполняться метод finalize?
Я: Ну, я сам написал примеры, чтобы доказать это, и я также видел реализацию исходного кода.
Интервьюер: Как вы это доказали?
Я: Инициализируйте большой массив, вы можете четко видеть, переработан ли gc после, а затем выполните System.gc(), выведите информацию &&%%@@ в методе finalize (повторите предыдущую проверку)
Интервьюер: Ну, вы можете...
Статьи по Теме:"Глубокий анализ принципа реализации метода Object.finalize"
###Большая проблема Что такое большая проблема, это большая проблема, пусть сами разберетесь в этом, и вынесите то, чему научились в своей жизни.
Сценарий диалога: Интервьюер: Если бы вам дали систему, как бы вы ее оптимизировали?
Я: (Что оптимизировать? Производительность, стабильность или другие аспекты, я могу только стиснуть зубы и объединить проект, который я сделал) 1. Проанализируйте систему и определите показатели 2. Через систему точек захоронения собирайте значения измерений показателей и итеративно оптимизируйте показатели&&^%&$#
Интервьюер: И все? Это прошло?
Я: (Поскольку это было телефонное интервью, я чувствовал, что в то время у меня в голове ничего не было. Предполагается, что это как-то связано с уровнем интервьюера.) Если показателем является производительность интерфейса, вы можете увидеть, системная память может быть оптимизирована для производительности с помощью кеша, такого как Redis. Если это данные, к которым обращаются очень часто и которые не часто меняются, например, данные горячих точек, вы можете напрямую использовать локальный кеш для оптимизации.В конце концов, сетевой запрос также занимает 1~2 миллисекунды
Интервьюер: Вы ушли?
Я: (Поскольку мой опыт в оптимизации системы действительно небогат, интервьюер думает, как я могу думать только о таком небольшом количестве точек оптимизации) Разделение чтения и записи базы данных, подбазы данных и подтаблицы базы данных, если вы часто запрашиваете базу данных, вы можете ввести службу поиска es или lucene для оптимизации