памяти Java Heap разделяют резьбу! Интервьюер: Вы уверены?

Автор л Hollis

Эта статья перепечатана с разрешения Холлис (ID: hollischuang)

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

В структуре пам ти JVM, более распространенным из двух областей является память кучи и стека памяти (если не особо, упоминаются в данной статье относится к виртуальной стека стека машины), о разнице между кучи и стека, многие разработчики также знакомо, есть много книг, или статей в Интернете по этому поводу описаны:

1, то куча нить общие области памяти, стек потока является исключительной областью памяти.

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

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

Во-первых, принять все знать, почему я хотел бы сказать, «это поток разделяемая область динамической памяти, стек нить эксклюзив область памяти.» Это предложение не совсем правильно! ?

Перед тем, как начать в тему, позвольте мне задать вопрос и казалось бы, ничего общего с вопросом: как процесс объекта Java выделение памяти является обеспечение потокобезопасной?

Процесс выделения памяти объектов Java как обеспечить потокобезопасной?

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

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

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

Для решения этой проблемы параллелизма, объекты процесса распределения памяти должны быть синхронизированы контролем. Но все мы знаем, что независимо от того, какого рода схем синхронизации (на самом деле, виртуальная машина может использовать CAS) использование влияет на эффективность распределения памяти.

объект Java присваивается операции высокой частоты в Java, все люди думают, что другого пути для повышения эффективности. Здесь мы сосредоточимся на этом одном аспекте виртуальной машины HotSpot:

Каждая нить небольшого кусочек предварительно выделенной памяти кучи в Java, а затем дать объект для выделения памяти при выделенной непосредственно в своей части «частной» память, когда эта часть региона израсходована, новое перераспределение «частный». память.

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

Что такое TLAB

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

Отмечено, что приведенное выше описание «эксклюзивные темы», «использовать только текущий поток», «каждый поток имеет отдельный» описать это?

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

Стоит отметить, что мы говорим, TLAB нить является эксклюзивной, но только в «распространении» Это действие нить эксклюзивное, как чтение, вывоз мусора и другие действия являются общими нитями. Но и в использовании не будет исключением.

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

И, после того, как назначение TLAB не влияет на движение и восстановление объекта, который должен сказать, хотя цель в начале может TLAB выделить память, хранящуюся в районе Эден, но по-прежнему будет мусор или быть перемещены в Survivor Space, Старый Gen и так далее.

Еще один момент, следует отметить, что мы говорим, TLAB область выделяется в Иден, Иден, потому что сам регион не слишком большой, но пространство TLAB памяти очень мал, что составляет лишь 1% от всего по умолчанию Иден пространства корпуса. Таким образом, должны быть некоторые большие объекты не могут быть непосредственно выделенные TLAB.

TLAB сталкивается крупные объекты, которые не могут быть выделены, или объекты могут быть размещены в старом районе Иден, или так далее, но это назначение на необходимости контроля синхронизации, поэтому мы часто говорим: выделить небольшие объекты, чем крупные объекты более эффективным.

Проблемы, вызванные TLAB

Хотя в какой-то степени, TLAB значительно повысить скорость распределения объекта, но не TLAB не имеют каких-либо проблем.

Мы уже говорили, потому что область памяти TLAB не очень большая, так что не может быть достаточно часто появляются. В одном случае в «реальных Java виртуальных машин»:

TLAB пространство, такие как поток имеет 100KB, который был использован 80KB, когда это необходимо перераспределение объекта 30kb не может быть непосредственно выделен TLAB, в этом случае, есть два варианты лечения:

1, если субъект, нуждающийся в пространстве больше, чем остальное пространство TLAB, непосредственно в распределение динамической памяти объекта памяти.

2, если объект нуждается в пространстве большего, чем остальные пространства TLAB, текущего TLAB отходов, повторное применение TLAB памяти выделения пространства снова.

Оба варианта имеют свои плюсы и минусы выше, если вариант 1, то может быть крайний случай, TLAB только 1KB, это приведет к последующей потребности выделить большинство объектов должны быть непосредственно выделена память кучи.

Если вариант 2, может существовать часто заброшенный TLAB, TLAB ситуацию на частое применение, и мы знаем, что при выделении памяти на TLAB нить является эксклюзивным, но они на самом деле конфликт памяти TLAB может существовать из процесса, вырезанные из кучи Таким образом, процесс распределения TLAB фактически требует управления параллелизмом. И частый TLAB выделяется утраченное чувство TLAB.

Для того, чтобы решить проблемы этих двух программ, виртуальная машина определяет значение refill_waste, это значение может быть переведена как «самой большой трата пространства.»

Когда память больше запроса refill_waste выделения, выбирает выделяется память кучи. Если значение меньше, чем refill_waste будет отбрасывать текущее TLAB, воссоздать выделение памяти объектно-TLAB.

В предыдущем примере, общая площадь Tlab 100KB, используя 80KB, 20KB излишек, если установленное значение refill_waste 25KB, а затем, если новый объект больше памяти 25kb, распределение памяти кучи непосредственно перед тем, как меньше, чем 25kb, будет отброшена что TLAB, TLAB перераспределить пространство для выделения памяти для нового объекта.

Параметры, используемые TLAB

TLAB выбрана функция включена или выключена, путем установки -XX: +/- UseTLAB параметр используется для указания того, расходного отверстия TLAB.

TLAB по умолчанию 1% Эдема область, может опция -XX: TLABWasteTargetPercent установить Иден пространство TLAB пространство, занимаемое в процентном размере.

По умолчанию TLAB пространство будет продолжать корректировать во время выполнения, позволяя системе достичь наилучшего рабочего состояния. Для отключения автоматического регулирования размера TLAB, могут быть использованы -XX: -ResizeTLAB чтобы отключить, используя -XX: TLABSize TLAB вручную указать размер.

Refill_waste TLAB также быть отрегулирована, значение по умолчанию равно 64, то есть приблизительно 1/64 признак, как refill_waste пространства, используя параметры: -XX: TLABRefillWasteFraction регулируется.

Если вы хотите, чтобы наблюдать использование TLAB, вы можете использовать параметры -XX + PringTLAB дорожки.

резюме

Для того, чтобы обеспечить безопасность объектов процесса выделения памяти в потоке, машина HotSpot обеспечивает технику, известную TLAB (Thread Local выделения буфера) в.

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

Таким образом, «куча нити разделяемой области памяти» Это предложение не совсем правильно, потому что TLAB является частью динамической памяти, он на самом деле поток на долю в чтении, но и в распределении памяти, токарно-эксклюзив.

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

Скажем несколько слов

После прочтения этой статьи я считаю, часть, можно было бы думать немного слишком «Каламбур», «придирки» был. Некоторая вспыльчивость не может никакой нехватки людей обращается к смотреть прямо в начале конца текста были готова ненавидеть.

Если вы думаете, не согласны с авторами, сказал: «Куча нити разделяемой области памяти этого заявления не совсем корректно.» На самом деле, это не важно, это важно, когда речь идет о динамической памяти, потоки совместно упоминалось, со ссылкой на выделение объекта памяти, вы можете думать, есть TLAB особенный на нем.

Иногда, самое страшное не то, что они не знают, но я не знаю, что они не знают.

Существует, TLAB только оптимизация программы HotSpot виртуальная машина, Java Virtual Machine Specification, ни каких-либо положений о TLAB. Таким образом, не представляет все виртуальную машину имеет эту функцию.

Эта статья основана на обзоре виртуальной машины HotSpot, автор не намеренно, «подметать», но потому, что HotSpot виртуальной машиной является самой популярной виртуальной машиной, и большинство по умолчанию, мы также обсудили на основе HotSpot.

Автор: Холлис, имеет уникальный квест для кодирования людей, технические специалисты тока Alibaba, личные технологий блоггер, технические статьи, сумма чтения всей сети десятков миллионов, «три класса программист» совместного автор.

Рекомендуемая литература 

нет отказа волос! С флаттер + Дарт быстро построить красивый мобильный App

Посмотрите , что я нашел хорошую вещь? Java Дополнительно, безусловно , стоит обучение | Программа Force

Tencent сочетания ACNET упоминания мелкозернистых классификаций, эффект до последнего СОТА | CVPR 2020

Мой любимый облако рекомендация IDE!

передовые особенности солидности письменный договор интеллекта

персонал возвращение E , чтобы вернуться к работе ридми: вернуться к работе, Ухань, Хэфэй летать первый, а затем вернуться и забрать зафрахтованный компанией

Вы смотрите на каждую точку, я серьезно, как любимое

发布了1830 篇原创文章 · 获赞 4万+ · 访问量 1654万+

рекомендация

отblog.csdn.net/csdnnews/article/details/104890434