Ява управления памятью с несколькими потоками
Я использую сервлет tomcat, который одновременно сохраняет контент, когда он становится доступным сервлету. Один запрос может содержать 1 или несколько тысяч частей (компонентов), которые могут потребоваться для хранения.
Чтобы справиться с параллелизмом, я использую таблицу указателей потоков фиксированного размера. Когда компонент становится доступным для хранения - объект хранения назначается слоту в таблице, и начинается выполнение. Когда поток завершает работу, слот обнуляется, а другой объект хранения назначается по мере необходимости. Если используются все слоты в таблице, то таблица периодически проверяется на завершенные потоки, и поток заменяется.
Управление памятью с помощью этой модели может быть затруднено, поскольку сборка мусора никогда полностью не очищает память, используемую протекторами после их смерти. Это может привести к переполнению памяти или слишком маленькому восстановлению памяти.
Есть ли способ обработки GC с этим типом - например, требуется синхронизация с последующим GC? Есть ли обработчик параллелизма Java, который соответствует этому типу обработки...
Мы ценим любые предложения.
Спасибо
1 ответ
То, что я первоначально думал, было проблемой в GC, не полностью очищающей память, было то, что я видел только небольшую коллекцию GC, которая только частично очистила. Когда произойдет крупная коллекция, наш сервис будет заморожен на 10 минут.
После некоторых экспериментов с различными сборщиками, похоже, что новый сборщик G1 в версии 7, делает свое дело.
Спасибо всем, кто это исследовал.