JVM использует больше памяти чем указано в JAVA_OPTS
От:
Аноним
Дата:
20.04.10 11:27
Оценка:
Выставил параметр JAVA_OPTS=-Xms128M -Xmx512M -XX:MaxPermSize=128M
Стартую джавовское приложение и вижу в Windows Task Manager-е, что приложение потребляет около гига.
Как такое может быть? Я же указал , что максимум — 512M.
Re: JVM использует больше памяти чем указано в JAVA_OPTS
Здравствуйте, Аноним, Вы писали:
А>Выставил параметр JAVA_OPTS=-Xms128M -Xmx512M -XX:MaxPermSize=128M А>Стартую джавовское приложение и вижу в Windows Task Manager-е, что приложение потребляет около гига. А>Как такое может быть? Я же указал , что максимум — 512M.
mx это максимум хипа, а не используемого объема ОЗУ. Хип + Пермген + нужды самой JVM. Например, в итоге, при ограничении 2Гб на процесс, под виндой можно выставить хип только 1.2Гб.
Re: JVM использует больше памяти чем указано в JAVA_OPTS
Здравствуйте, Аноним, Вы писали:
А>Выставил параметр JAVA_OPTS=-Xms128M -Xmx512M -XX:MaxPermSize=128M А>Стартую джавовское приложение и вижу в Windows Task Manager-е, что приложение потребляет около гига. А>Как такое может быть? Я же указал , что максимум — 512M.
Ты указал максимальный размер кучи, а кроме неё есть ещё много разных областей памяти — тот же PermGen = +128M.
Re[2]: JVM использует больше памяти чем указано в JAVA_OPTS
От:
Аноним
Дата:
20.04.10 11:49
Оценка:
B>mx это максимум хипа, а не используемого объема ОЗУ. Хип + Пермген + нужды самой JVM. Например, в итоге, при ограничении 2Гб на процесс, под виндой можно выставить хип только 1.2Гб.
512+128=640
Если у меня сейчас показывается, что JVM занимает около 1.2GB, то на нужды самой JVM расходуется больше 600 метров?
Это нормально?
Re[3]: JVM использует больше памяти чем указано в JAVA_OPTS
Здравствуйте, Аноним, Вы писали:
B>>mx это максимум хипа, а не используемого объема ОЗУ. Хип + Пермген + нужды самой JVM. Например, в итоге, при ограничении 2Гб на процесс, под виндой можно выставить хип только 1.2Гб. А>512+128=640
Запустите jvisualvm, подсоединитесь к процессу и посмотрите что размеры хипа и пермгена именно такие.
Re[4]: JVM использует больше памяти чем указано в JAVA_OPTS
От:
Аноним
Дата:
20.04.10 12:28
Оценка:
B>Запустите jvisualvm, подсоединитесь к процессу и посмотрите что размеры хипа и пермгена именно такие.
Есть сановская JRE.
Есть машина с 2 гигами памяти, из которых на данный момент свободно чуть больше чем 1 гиг.
Выставил переменную set JAVA_OPTS=-Xms512M -Xmx1024M -XX:MaxPermSize=128MЗапустил приложение и приконектился к нему через jvisualvm. Вижу что потребление хипа — около 300 метров.
PermGen — меньше сотни.
В это же самое время таск менеджер показывает что JVM активно набирает память больше чем гиг и свободная память стремится к нулю.
Как результат — приложение падает с OutOfMemory.
Разве винда не должна была скинуть неиспользуемые приложения в своп и дать еще памяти JVM?
Re[5]: JVM использует больше памяти чем указано в JAVA_OPTS
Здравствуйте, Аноним, Вы писали:
А>Как результат — приложение падает с OutOfMemory.
Если у вас OutOfMemoryError, то винда к этому никакого отношения не имеет. Здесь привышения хипа либо PermGen.
Если про PermGen Space в ошибке OutOfMemoryError не сказано, то это превышение хипа. И jvisualvm вам в помощь для анализа.
А>Разве винда не должна была скинуть неиспользуемые приложения в своп и дать еще памяти JVM?
Нет, не должна.
Re[6]: JVM использует больше памяти чем указано в JAVA_OPTS
От:
Аноним
Дата:
20.04.10 13:48
Оценка:
B>Если про PermGen Space в ошибке OutOfMemoryError не сказано, то это превышение хипа. И jvisualvm вам в помощь для анализа.
В PermGen Space хранятся классы.
А почему тогда график не только увеличивается, но временами и уменьшается?
JVM динамически выгружает какие-то классы?
Re[7]: JVM использует больше памяти чем указано в JAVA_OPTS
Здравствуйте, Аноним, Вы писали:
А>В PermGen Space хранятся классы. А>А почему тогда график не только увеличивается, но временами и уменьшается? А>JVM динамически выгружает какие-то классы?
Да. GC работает для PermGen Space тоже.
Re[8]: JVM использует больше памяти чем указано в JAVA_OPTS
От:
Аноним
Дата:
20.04.10 14:05
Оценка:
А что кроме классов хранится в Perm Gen Space?
Выполняю однотипные действия в своем приложении и вижу в jvisualvm что PermGen сначала пристарте приложения вырос, потом рост замедлился, но потихоньку продолжается.
Так как я делаю однотипные действия, то классы должны быть уже все загружены.
Re[9]: JVM использует больше памяти чем указано в JAVA_OPTS
Здравствуйте, Аноним, Вы писали:
А>А что кроме классов хранится в Perm Gen Space? А>Выполняю однотипные действия в своем приложении и вижу в jvisualvm что PermGen сначала пристарте приложения вырос, потом рост замедлился, но потихоньку продолжается. А>Так как я делаю однотипные действия, то классы должны быть уже все загружены.
Например Hibernate CGLIB прокси генерит новые классы.
Re[10]: JVM использует больше памяти чем указано в JAVA_OPTS
От:
Аноним
Дата:
20.04.10 14:23
Оценка:
B>Например Hibernate CGLIB прокси генерит новые классы.
Один раз генерит?
Или при каждом обращении к определенной функциональности?
Re[11]: JVM использует больше памяти чем указано в JAVA_OPTS
Здравствуйте, Аноним, Вы писали:
B>>Например Hibernate CGLIB прокси генерит новые классы.
А>Один раз генерит? А>Или при каждом обращении к определенной функциональности?
Так у вас OOME:PermGen?
Re[9]: JVM использует больше памяти чем указано в JAVA_OPTS
Re[12]: JVM использует больше памяти чем указано в JAVA_OPTS
От:
Аноним
Дата:
20.04.10 14:57
Оценка:
B>Так у вас OOME:PermGen?
В трейсах джейбосса я вижу такое
Exception in thread "CompilerThread0" java.lang.OutOfMemoryError: requested 32776 bytes for Chunk::new. Out of swap space?
и вот такое
java.lang.OutOfMemoryError
at java.util.zip.Inflater.init(Native Method)
at java.util.zip.Inflater.<init>(Inflater.java:75)
at java.util.zip.ZipFile.getInflater(ZipFile.java:375)
at java.util.zip.ZipFile.getInputStream(ZipFile.java:320)
at java.util.zip.ZipFile.getInputStream(ZipFile.java:286)
at org.jboss.virtual.plugins.context.zip.ZipFileWrapper.openStream(ZipFileWrapper.java:214)
at org.jboss.virtual.plugins.context.zip.ZipEntryContext.openStream(ZipEntryContext.java:1082)
at org.jboss.virtual.plugins.context.zip.ZipEntryHandler.openStream(ZipEntryHandler.java:153)
at org.jboss.virtual.VirtualFile.openStream(VirtualFile.java:230)
at org.jboss.classloading.spi.vfs.policy.VFSClassLoaderPolicy.getResourceAsStream(VFSClassLoaderPolicy.java:483)
at org.jboss.classloader.spi.base.BaseClassLoader$2.run(BaseClassLoader.java:534)
at org.jboss.classloader.spi.base.BaseClassLoader$2.run(BaseClassLoader.java:532)
at java.security.AccessController.doPrivileged(Native Method)
at org.jboss.classloader.spi.base.BaseClassLoader.loadClassLocally(BaseClassLoader.java:530)
at org.jboss.classloader.spi.base.BaseClassLoader.loadClassLocally(BaseClassLoader.java:507)
at org.jboss.classloader.spi.base.BaseDelegateLoader.loadClass(BaseDelegateLoader.java:134)
at org.jboss.classloader.spi.filter.FilteredDelegateLoader.loadClass(FilteredDelegateLoader.java:131)
at org.jboss.classloader.spi.base.ClassLoadingTask$ThreadTask.run(ClassLoadingTask.java:452)
at org.jboss.classloader.spi.base.ClassLoaderManager.nextTask(ClassLoaderManager.java:251)
at org.jboss.classloader.spi.base.ClassLoaderManager.process(ClassLoaderManager.java:150)
at org.jboss.classloader.spi.base.BaseClassLoaderDomain.loadClass(BaseClassLoaderDomain.java:265)
at org.jboss.classloader.spi.base.BaseClassLoaderDomain.loadClass(BaseClassLoaderDomain.java:1119)
at org.jboss.classloader.spi.base.BaseClassLoader.loadClassFromDomain(BaseClassLoader.java:798)
at org.jboss.classloader.spi.base.BaseClassLoader.loadClass(BaseClassLoader.java:441)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at org.jboss.classloader.spi.base.BaseClassLoader.access$200(BaseClassLoader.java:63)
at org.jboss.classloader.spi.base.BaseClassLoader$2.run(BaseClassLoader.java:572)
at org.jboss.classloader.spi.base.BaseClassLoader$2.run(BaseClassLoader.java:532)
at java.security.AccessController.doPrivileged(Native Method)
at org.jboss.classloader.spi.base.BaseClassLoader.loadClassLocally(BaseClassLoader.java:530)
at org.jboss.classloader.spi.base.BaseClassLoader.loadClassLocally(BaseClassLoader.java:507)
at org.jboss.classloader.spi.base.BaseDelegateLoader.loadClass(BaseDelegateLoader.java:134)
at org.jboss.classloader.spi.filter.FilteredDelegateLoader.loadClass(FilteredDelegateLoader.java:131)
at org.jboss.classloader.spi.base.ClassLoadingTask$ThreadTask.run(ClassLoadingTask.java:452)
at org.jboss.classloader.spi.base.ClassLoaderManager.nextTask(ClassLoaderManager.java:251)
at org.jboss.classloader.spi.base.ClassLoaderManager.process(ClassLoaderManager.java:150)
at org.jboss.classloader.spi.base.BaseClassLoaderDomain.loadClass(BaseClassLoaderDomain.java:265)
at org.jboss.classloader.spi.base.BaseClassLoaderDomain.loadClass(BaseClassLoaderDomain.java:1119)
at org.jboss.classloader.spi.base.BaseClassLoader.loadClassFromDomain(BaseClassLoader.java:798)
at org.jboss.classloader.spi.base.BaseClassLoader.loadClass(BaseClassLoader.java:441)
at java.lang.ClassLoader.loadClass(ClassLoader.java:299)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:242)
at org.apache.myfaces.shared_impl.util.ClassUtils.classForName(ClassUtils.java:132)
Если увеличиваю MaxPermSize, то OutOfMemoryError нет.
Re[13]: JVM использует больше памяти чем указано в JAVA_OPTS
Здравствуйте, Аноним, Вы писали:
А>Так вот почему я не могу задать под x86 Xmx=1,5Гб Винда пишет что не может выделить heap
Винда ничего не знает про хип JVM. Это вам сама JVM пишет.
Re[3]: JVM использует больше памяти чем указано в JAVA_OPTS
Здравствуйте, Аноним, Вы писали:
B>>под виндой можно выставить хип только 1.2Гб. А>Так вот почему я не могу задать под x86 Xmx=1,5Гб Винда пишет что не может выделить heap http://java.sun.com/docs/hotspot/HotSpotFAQ.html#gc_heap_32bit
Под виндой предел в районе 1.4, и если под пермген отдать 0.2, то сооствественно под хип останется 1.2.
Re[4]: JVM использует больше памяти чем указано в JAVA_OPTS
Здравствуйте, Blazkowicz, Вы писали:
B>Здравствуйте, Аноним, Вы писали:
B>>>под виндой можно выставить хип только 1.2Гб. А>>Так вот почему я не могу задать под x86 Xmx=1,5Гб Винда пишет что не может выделить heap B>http://java.sun.com/docs/hotspot/HotSpotFAQ.html#gc_heap_32bit B>Под виндой предел в районе 1.4, и если под пермген отдать 0.2, то сооствественно под хип останется 1.2.
Не совсем правда, есть ещё один фактор:
JVM для хипа требуется непрерывный кусок адресного пространства. Но к сожалению, в это адресное пространство влезают различные используемые DLL-ки и фрагментируют его.
Поэтому "на данной конкретной машине" можно выжать ещё где-то 200-300 мегабайт, воспользовавшись утилиткой rebase из микрософтовского SDK. В первую очередь имеет смысл подвинуть dll-ки самой JVM. Ссылка по теме.