2013-03-13 10 views
2

Если у меня есть 8GB RAM и я использую следующее на 64-битной JVMКак общий объем памяти в Java рассчитывается

  • размер макс кучи 6144MB
  • макс завивка генераторных пространство 2048MB
  • размер стека 2MB

Q1: Пространство perm gen выделено из максимальной кучи или отдельной?

Q2: если в отдельности будет запущен jvm с настройками выше, или он даст ошибку, так как куча + permgen + stack + данные программы будут выше общей ОЗУ?

ответ

3

кучи и пермены - это разные части памяти JVM. Таким образом, вы будете потреблять практически всю память в системе. Всегда лучше оставить 20% бара, чтобы быть свободным для выполнения os/других задач должным образом.

Кроме того, 2 gb для perm space - огромная фигура. Вы посмотрели оптимизацию jar, означающую, что в пути к классам присутствуют только соответствующие классы?

+0

thx ... размеры были ориентировочными ... но читали где-то, что permgen - это пространство, зарезервированное из кучи ... ni думаю, что нужно принимать во внимание множество других требований к memry, например, стек за нить и другие требования к памяти на экземпляр jvm ... какая оптимизация jar? – sasa

+0

Может ли jvm не использовать swap, подобный os ... вместо ужасной ошибки OOM? – sasa

2

Это зависит от JVM и версии JVM.

  • В Hotspot Java 6, PermGen пространство независимо отмакс кучи размера аргумент (только -Xmx и -Xms управления в/OldGen размеры Young). Размер пространства PermGen дается -XX:PermSize и -XX:MaxPermSize. См Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning

  • UPDATE: В Hotspot Java 8, есть нет PermGen пространства больше и объекты находятся в пространствах Young/Old Generation.

+1

PermGen полностью удален в Java 8, а не 7. Просто интернированные строки удалены из PermGen в Java 7, метаданные класса все еще существуют. См. Http://docs.oracle.com/javase/7/docs/technotes/guides/vm/enhancements-7.html – fglez

+0

Спасибо, вы правы, я обновил ответ. –

5

Прежде всего помните, что параметр вы устанавливаете с -Xmx (так как это так, как я полагаю, вы устанавливаете размер кучи) является размер кучи доступна для кода Java, а не объем памяти виртуальной машины Java будет потреблять. Разница связана с структурами домохозяйства, которые поддерживаются JVM (структуры сборщиков мусора, служебные данные JIT и т. Д.), Иногда память, выделенная собственным кодом, буферами и т. Д. Размер этой дополнительной памяти зависит от версии JVM, используемого приложения и других факторов, но я видел, что JVM выделяют в два раза больше ОЗУ, чем размер кучи, видимый для приложения. Для среднего случая я обычно считаю, что 50% - это безопасная маржа, приемлемая на 20-30%. Если вы зададите размер кучи близким к объему ОЗУ на вашем компьютере, вы попадете на своп, и производительность пострадает.

Теперь для перечисленных вопросов:

Пермь ген представляет собой отдельное пространство из кучи по крайней мере, в JDK Oracle, 6. Это отдельное, потому что он подвергается совершенно разные правилам управления памятью, чем обычная куча. Кстати, 2 ГБ пространства для пергена огромны - вы уверены, что вам это действительно нужно?

Что касается второго вопроса, см. Выше.Если это JDK от Oracle, вы, вероятно, столкнетесь с проблемой, так как пермят и куча суммируются, но будет дополнительная память, обычно порядка 20-50% вашей кучи на 6 ГБ, и вместе с кучей и perm space это будет быть больше, чем ваша оперативная память. Сначала попробуйте установить эту настройку, но как только использование кучи памяти и кулачка будет близким к их настроенным ограничениям, у вас может закончиться нехватка памяти.

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