2012-04-13 2 views
2

Кто-нибудь знает, есть ли способ динамически (время выполнения) увеличить размер стека основного потока? Кроме того, и я считаю, что это тот же вопрос, возможно ли увеличить/обновить размер стека Thread после его создания?Обновить размер стека java-потока во время выполнения

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

Согласно java language specification можно установить размер стека «когда стек создается», но есть примечание:

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

IMO, что не очень понятно, это значит, что некоторые ручки Темы VM с максами (редактирование) размеров стеков формирующихся в пределах заданного диапазона? Можем ли мы сделать это с помощью Hostpot (я не нашел связанных с размером стека параметров рядом с Xss)?

Спасибо!

+0

http://stackoverflow.com/questions/3700459/how-to-increase-to-java-stack-size вы проверили этот вопрос? theres нет прямого ответа, но хорошая дискуссия по управлению размером стека – kommradHomer

+0

@kommradHomer это интересно, но это не совсем то, что я ищу.Я хочу знать, можно ли обновить размер стека, когда Thread уже запущен (в крайних случаях вместо сбоя с помощью stackoverflow Thread попытается «адаптировать», увеличив размер стека). – Jerome

ответ

4

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

То, что вы можете установить, это максимальный размер, который может быть с помощью -Xss. Это используемый размер виртуальной памяти, и вы можете сделать его таким же большим, как на 64-битных JVM. Используемая фактическая память основана на объеме используемой памяти. ;)

EDIT: Важным отличием является то, что максимальный размер зарезервирован как виртуальная память (так же как и куча бит). то есть адресное пространство зарезервировано, поэтому его нельзя продлить. В 32-битных системах у вас ограниченное адресное пространство, и это все еще может быть проблемой. Но в 64-битных системах у вас обычно есть до 256 ТБ виртуальной памяти (ограничение процессора), поэтому виртуальная память дешевая. Фактическая память выделяется на страницах (обычно 4 КБ), и они выделяются только при их использовании. Вот почему память Java-приложения растет со временем, хотя при загрузке выделяется максимальный размер кучи. То же самое происходит с стеками потоков. Выделяются только затронутые страницы.

+0

Хорошо, я понимаю, что вы имели в виду. Он не отвечает на мой вопрос, но вы указали, что причина, по которой я его спрашивал, была неправильной. На самом деле я думал, что после создания Thread весь размер стека (максимум) был зарезервирован (чтобы предотвратить фрагментацию или что-то еще). Это неверно :), поэтому нет необходимости создавать потоки с малыми размерами стека, ожидая, что они будут потреблять меньше памяти, а затем в конечном итоге настраивают их максимальный размер стека. – Jerome

+0

Помогите объяснить немного Петра? Означает ли это, что я могу -Xss104K (minimmum) и не беспокоиться об исключениях StackOverflow, потому что JVM автоматически увеличивает размер стека каждого потока, когда он приближается к 104k? Или ? – kellogs

+0

@kellogs Операционная система выделяет страницы для процесса, так как использует их. Если вы установите максимум 1 МБ, но никогда не используете более 100 КБ, тогда ОС выделяет только 100 Кбайт страниц для этого процесса для этого потока. Это хорошо работает, потому что разные потоки имеют одинаковое максимальное, но различное использование стека. –

3

Там не способ сделать это в стандартной версии JDK, и даже stackSize аргумент не высечены в камне:

Влияние параметра STACKSIZE, если таковые имеются, в высшей степени зависит от платформы. ... На некоторых платформах значение параметра stackSize может не иметь никакого эффекта. ... Виртуальная машина может рассматривать параметр stackSize как предложение.

(Подчеркнуто в original.)

+0

Под «установленным камнем» вы имеете в виду окончательный? Да, почему они не установили stackSize в качестве конечной переменной, если обновление невозможно? -Я проверил, обновляется ли переменная stackSize потока, как только вы начнете ее выполнение, она никогда не обновляется (выполняется с такими значениями, как -1, 0, 13). Мне не хочется проверять openJDK в течение нескольких часов: s – Jerome

+0

Нет, я имел в виду, что даже если вы передадите 'stackSize' в конструктор' Thread's', нет никакой гарантии, что JVM позаботится. Документы прямо говорят, что JVM может рассматривать ваш аргумент как просто предложение или вообще игнорировать его. – yshavit