Распределение кучи для конкретного потока - PullRequest
7 голосов
/ 17 января 2012

Можно ли заставить некоторые подмножества потоков (например, из определенного ThreadPool) выделять память из собственной кучи? Например. большинство потоков выделяется из обычной общей кучи, и лишь немногие рабочие потоки выделяют из отдельных куч (1: 1 на поток).

Цель состоит в том, чтобы обеспечить безопасное выполнение кода в разделяемой среде - типичный работник не имеет состояния и работает в отдельном потоке, обработка одного запроса не должна занимать более 4 МБ кучи.

Обновление № 1 Re: Но почему вы беспокоитесь о «безопасном выполнении» и непредсказуемом увеличении потребления кучи?

Речь идет о безопасном размещении произвольного стороннего Java-кода в моем процессе. Один из моментов - не получить «Недостаточно памяти» для всего процесса из-за ошибок в стороннем коде.

Обновление № 2 Re: Из-за ограничения использования памяти на поток, в языке Java это невозможно

Согласно моему расследованию до того, как я опубликовал этот вопрос, мое мнение такое же, я просто надеюсь, что что-то упустил.

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

1) Сколько памяти занимает мой java-поток? - отслеживать использование памяти потока в каком-то потоке регулятора и завершать плохие потоки

2) Запускать Java-код на моей собственной JVM - Да, это возможно. Вы можете скачать реализацию с открытым исходным кодом JVM, изменить ее ...:)

Ответы [ 3 ]

4 голосов
/ 17 января 2012

Извлечение Выделение неблокируемой памяти Java - потоки обычно уже выделяют память из своих собственных блоков выделения. Так что, если скорость вызывает беспокойство, Sun сделала это для вас.

Что касается ограничения использования памяти на поток, в языке Java это невозможно. Является ли это возможным (или имеет смысл) в JVM и Java, платформа - интересный вопрос. Конечно, вы можете сделать это так же, как это делает любой профилировщик памяти , но я боюсь, что система управления скоро перерастет само приложение.

2 голосов
/ 17 января 2012

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

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

2 голосов
/ 17 января 2012

Нет.В Java нет этого понятия.Есть одна «куча», из которой new выделяет.Распределение Java является поточно-ориентированным.И почему вы думаете, что создание большего количества кучи приведет к тому, что потоки будут занимать меньше памяти?

Если вы хотите контролировать использование памяти в потоке, не выделяйте вещи.

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

...