Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Изменение размера стека и heap


Автор: world 2.2.2011, 23:39
Доброе время суток.

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

Код

#pragma comment(linker, "/STACK:10000000")

Автор: aleksandy 3.2.2011, 06:00
Насколько мне изместно размер кучи можно указать при помощи параметров
Код

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size
-Xss<size>        set java thread stack size


З.Ы. Параметры работают в SunOracleJVM

Автор: world 3.2.2011, 12:12
Цитата

размер кучи можно указать при помощи параметров


Ну это параметры компилятора, указываемые в командной строке, а у меня доступа к ним не будет (

Автор: LSD 3.2.2011, 12:13
Цитата(world @  3.2.2011,  13:12 Найти цитируемый пост)
Ну это параметры компилятора, указываемые в командной строке, а у меня доступа к ним не будет ( 

Не компилятора а JRE. А в самом байткоде такие параметры как размер стека и кучи вообще смысла не имеют.

Автор: sergioK1 3.2.2011, 19:44
хотя стек по определению задаеться до запуска программы, директив прекомпайлера в жаве нет ,
т,е  нужно запускать родной код на С, под конкретную OS. до запуска жава программы,
какое то извращение  smile 

P.S.
А в чем задача то ? Может изначально есть другое решение? 

Автор: jk1 3.2.2011, 23:46
Цитата

хотя стек по определению задаеться до запуска программы

... это с процессом компиляции исходника в байткод не связано вообще никак.

Цитата

директив прекомпайлера в жаве нет

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

Цитата

какое то извращение

Полностью согласен.

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



Автор: sergioK1 4.2.2011, 13:21
Цитата(jk1 @ 3.2.2011,  23:46)
Цитата

хотя стек по определению задаеться до запуска программы

... это с процессом компиляции исходника в байткод не связано вообще никак.

Цитата

директив прекомпайлера в жаве нет

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

Цитата

какое то извращение

Полностью согласен.

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

1) Байт код или не байт код, размер стэка на уровне процесса задаеться заранее, размер стэка у среда можно 
задать в функции CreateThread для контретной  ОS.

2)Если быть точным,то   прекомпайлер,  есть только доступ к нему найтивный 
3) Раз уж пошла такая пьянка , то мне стало интересно  , размер стэка задаеться  ключами JVM ,
   то должна быть возможность этот размер проверить? или это недоделки Java  smile ?

Автор: jk1 4.2.2011, 15:06
Цитата

то должна быть возможность этот размер проверить? или это недоделки Java  ?


Это не недоделки, сама идеология языка не подразумевает прямой работы с памятью или стеком.
http://www.odi.ch/weblog/posting.php?posting=411 человек пытается проводить тесты чтобы выяснить, как оценивать размер стека в райнтайме.

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

Таким образом, если Ваш код зависит от конкретной глубины стека (Мы не берем крайние случаи про глубину = 2) и его поведение различается при максимуме 1500 и 5000 (например), значит менять надо код. Если же задача настолько специфична, что без зависимости от глубины стека никуда - то Java как язык не подходит для решения этой задачи.

Автор: sergioK1 5.2.2011, 22:49
Цитата(jk1 @ 4.2.2011,  15:06)
Цитата

то должна быть возможность этот размер проверить? или это недоделки Java  ?


Это не недоделки, сама идеология языка не подразумевает прямой работы с памятью или стеком.
http://www.odi.ch/weblog/posting.php?posting=411 человек пытается проводить тесты чтобы выяснить, как оценивать размер стека в райнтайме.


Таким образом, если Ваш код зависит от конкретной глубины стека (Мы не берем крайние случаи про глубину = 2) и его поведение различается при максимуме 1500 и 5000 (например), значит менять надо код. Если же задача настолько специфична, что без зависимости от глубины стека никуда - то Java как язык не подходит для решения этой задачи.

глубина стека это что такое?  размер это понятно,

2 чего ?Mв ? 1500-5000 ?


Автор: jk1 6.2.2011, 11:08
Глубина стека вызовов - максимальное количество последовательный вызовов в рамках одной рекурсивной цепочки.

Из формулировки проблемы совершенно неясно, что собственно мешает: маленький размер стека в байтах или маленькая его глубина.

В любом случае, если не хватает - увеличиваем -Xss. 
Если увеличивать значение параметра больше некуда (ресурсы не позволяют), а проблема не решается - садимся переписывать код.

Мне не встречалось настолько специфичных задач, чтобы эти два простых правила не давали в итоге решения проблемы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)