Можно ли запустить параллельную коллекцию в Young Generation для незначительной коллекции - PullRequest
2 голосов
/ 12 июля 2011

Или, другими словами, существует ли какой-либо алгоритм, такой как «алгоритм параллельного копирования», который может помочь в малой паузе для небольших коллекций?

Ответы [ 2 ]

2 голосов
/ 12 июля 2011

Да, существуют разные такие алгоритмы.

Самый простой в реализации алгоритм Eden / Young-Generation, который можно запустить одновременно, - это просто использовать несколько Edens, а также кучи Gen 1.В зависимости от того, какой поток готов (в настоящее время это не «сбор копий», то есть «копирование всего, на что ссылаются, затем переключение указателя на новую память»), этот поток ответит указателем на объект;Потоки могут определить, к какой куче Eden или Gen 1 принадлежит объект, сравнивая указатели с min / max-адресами этих куч.

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

Если вам нужна более конкретная идея, просто специализируйте свой вопрос.

0 голосов
/ 12 июля 2011

В пакете java.util.concurrent есть много классов, чтобы помочь с этой областью темы.

Например, CopyOnWriteArrayList , который согласно javadoc равен:

Потокобезопасный вариант ArrayList, в котором все мутативные операции (добавление, установка и т. Д.) Реализованы путем создания новой копии базового массива.

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

...