2012-01-17 3 views
7

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

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

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

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

Update # 2 Re: Как ограничить использование памяти для каждого потока, в Java язык это невозможно

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

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

1) How much memory does my java thread take? - использование нить памяти след в какой-то губернатор нити и прекратить плохие нити

2) Run Java code on my own JVM - Да, это возможно. Вы можете скачать JVM с открытым исходным кодом, изменить его ... :)

+1

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

+1

Типичные реализации JVM используют поточные локальные буферы распределения (TLAB), где каждый поток имеет свою небольшую область для небольших распределений без значительных затрат на потоковую безопасность. Однако это не касается доступности. В RTSJ есть некоторые вещи, относящиеся к потокам и кучам, но это касается задержки. –

ответ

2

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

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

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

3

Check out Java nonblocking memory allocation - потоки обычно выделяют память из собственных блоков распределения. Поэтому, если скорость вызывает беспокойство, Sun сделала это за вас.

Что касается ограничения использования памяти на поток, то в Java язык невозможен. Возможно ли (или имеет смысл) в JVM и Java платформа - интересный вопрос. Конечно, вы можете сделать это the same way as any memory profiler does, но я боюсь, что система управления скоро перерастет приложение.

2

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

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

Смежные вопросы