2012-04-06 3 views
0

Я хочу уменьшить объем памяти приложения Java, чтобы уменьшить скорость обмена. Я думал об уменьшении размера стека (параметр Xss) для этой цели, но не уверен, как распределяется стек стека, и по умолчанию 512k (для 32-разрядной ОС) для каждого потока всегда находится в резидентной памяти, независимо от того, сколько из них фактически использован.Java уменьшает размер стека для сохранения памяти

Уменьшится ли падение памяти стека до уменьшения замены?

Обновление: Пожалуйста, не предлагайте профайл приложения - это уже сделано.

+1

Что привело вас поверить, размер стеки это проблема? – JaredPar

+0

проблема заключается в том, что не хватает бара, и некоторая память должна быть разрезана, и я не вижу, как я могу вырезать из кучи или perm gen –

+2

Первым шагом для исправления этой проблемы является профилирование приложения. Пока вы не поймете, что происходит с памятью, вы, по сути, угадываете и, скорее всего, потратите время на несуществующую проблему. Профилировщик предоставит вам прямую информацию о том, что занимает память в вашем приложении, и это, вероятно, то, чего вы не ожидаете делать. – JaredPar

ответ

0

да это, конечно, его правило LIFO последнего в первом вышел, меньше стеки меньше поменять

0

Сколько памяти вы используете, и сколько вам нужно сохранить?

Поскольку стек только 512K на поток, это означает, что вам будет нужно 200 Темы для начала ввода значения, которое может быть стоит экономить (100Mb)

Поскольку использование памяти стека будет «очень часто» I будет считать его плохой целью для замены. Если вы не имеете дело с средой с ограничением памяти?

+0

Точно, это ограниченная память среда –

+0

Черт, я забыл упомянуть. Проще всего было бы попробовать и посмотреть, помогает ли это. Я видел, что ваше приложение настроено на использование 640mb, но сколько памяти имеет целевая машина? – pimaster

+0

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

5

Сколько потоков вы используете? Даже с огромным количеством потоков и очень щедрым размером стека (скажем, потоками 10k и размером стека размером 256 КБ) это всего лишь 2 ГБ пространства кучи.

Вы говорите, что работаете на 32-битной JVM, поэтому я предполагаю, что это относительно небольшая система. У вас есть несколько вариантов:

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

  • Ваша машина слишком маленькая. Если 2gb стека является проблемой для ваших потоков 10k +, вы используете слишком «большое» приложение на слишком «маленьком» компьютере. Делайте меньше в программном обеспечении или покупать дополнительное оборудование

  • уменьшить ваш счет нити

  • Проблема на самом деле в другом месте, и вы ложное дерево

+0

OP утверждает, что он заменяет, что означает, что он не исчерпывает адресное пространство, а скорее физическую память. Не будет ли переключение на 64-битный уровень хуже? – trutheality

+0

Это ограниченная память среда. Значение Xmx составляет 640 МБ, есть сотни потоков –

+1

@Artiom * Сотни * потоков? Только довольно мощный сервер мог одновременно обслуживать такое большое количество потоков. Вы, вероятно, должны посмотреть в ThreadPools. – Voo