LINUX.ORG.RU

Параллельный вызов оператора new в Java

 , ,


0

1

Если 2 потока одновременно вызовут оператор new для разных объектов, то эти «new» выполнятся параллельно или последовательно?
Т.е. если множество потоков вызывают огромное количество new, то это может привести к частой блокировки потоков из-за аллокатора памяти JVM?
И что сделать, чтобы это исправить?

Ответ на: комментарий от vertexua

Реализация JVM разве не вызывает сишный malloc для new ?
malloc вроде должен блокировать глобальный мьютекс со всеми вытекающими

nerdogeek
() автор топика
Ответ на: комментарий от nerdogeek

Нет, в Java malloc работает как стек в С. Просто увеличивается указатель конца young памяти, она уже заранее зануленная. При сборке мусора дефрагментируется одним махом

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 1)

For multithreaded applications, allocation operations need to be multithread-safe. If global locks were used to ensure this, then allocation into a generation would become a bottleneck and degrade performance. Instead, the HotSpot JVM has adopted a technique called Thread-Local Allocation Buffers (TLABs). This improves multithreaded allocation throughput by giving each thread its own buffer (i.e., a small portion of the generation) from which to allocate. Since only one thread can be allocating into each TLAB, allocation can take place quickly by utilizing the bump-the-pointer technique, without requiring any locking. Only infrequently, when a thread fills up its TLAB and needs to get a new one, must synchronization be utilized. Several techniques to minimize space wastage due to the use of TLABs are employed. For example, TLABs are sized by the allocator to waste less than 1% of Eden, on average. The combination of the use of TLABs and linear allocations using the bump-the-pointer technique enables each allocation to be efficient, only requiring around 10 native instructions.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.