JVM использует больше памяти чем указано в JAVA_OPTS
От: Аноним  
Дата: 20.04.10 11:27
Оценка:
Выставил параметр JAVA_OPTS=-Xms128M -Xmx512M -XX:MaxPermSize=128M
Стартую джавовское приложение и вижу в Windows Task Manager-е, что приложение потребляет около гига.
Как такое может быть? Я же указал , что максимум — 512M.
Re: JVM использует больше памяти чем указано в JAVA_OPTS
От: Blazkowicz Россия  
Дата: 20.04.10 11:31
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Выставил параметр JAVA_OPTS=-Xms128M -Xmx512M -XX:MaxPermSize=128M

А>Стартую джавовское приложение и вижу в Windows Task Manager-е, что приложение потребляет около гига.
А>Как такое может быть? Я же указал , что максимум — 512M.
mx это максимум хипа, а не используемого объема ОЗУ. Хип + Пермген + нужды самой JVM. Например, в итоге, при ограничении 2Гб на процесс, под виндой можно выставить хип только 1.2Гб.
Re: JVM использует больше памяти чем указано в JAVA_OPTS
От: RomikT Германия  
Дата: 20.04.10 11:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Выставил параметр 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
От: Blazkowicz Россия  
Дата: 20.04.10 12:01
Оценка:
Здравствуйте, Аноним, Вы писали:

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
От: Blazkowicz Россия  
Дата: 20.04.10 12:31
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как результат — приложение падает с 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
От: Blazkowicz Россия  
Дата: 20.04.10 13:59
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В 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
От: Blazkowicz Россия  
Дата: 20.04.10 14:16
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А что кроме классов хранится в 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
От: Blazkowicz Россия  
Дата: 20.04.10 14:50
Оценка:
Здравствуйте, Аноним, Вы писали:

B>>Например Hibernate CGLIB прокси генерит новые классы.


А>Один раз генерит?

А>Или при каждом обращении к определенной функциональности?

Так у вас OOME:PermGen?
Re[9]: JVM использует больше памяти чем указано в JAVA_OPTS
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 20.04.10 14:57
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А что кроме классов хранится в Perm Gen Space?


Interned Strings
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
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
От: Blazkowicz Россия  
Дата: 20.04.10 15:08
Оценка: 2 (1)
Здравствуйте, Аноним, Вы писали:

А>В трейсах джейбосса я вижу такое

А>
А>Exception in thread "CompilerThread0" java.lang.OutOfMemoryError: requested 32776 bytes for Chunk::new. Out of swap space?
А>


Google says:

This is bug in JVM JIT compilation and the fix is not confirmed yet. The work around is to use below configuration:
-XX:+UseDefaultStackSize -Xss256K


А>и вот такое

А>
А>java.lang.OutOfMemoryError
А>        at java.util.zip.Inflater.init(Native Method)
А>        at java.util.zip.Inflater.<init>(Inflater.java:75)
А>



http://bugs.sun.com/view_bug.do?bug_id=4797189
Re[2]: JVM использует больше памяти чем указано в JAVA_OPTS
От: Аноним  
Дата: 21.04.10 11:06
Оценка:
Здравствуйте, Blazkowicz, Вы писали:


B>под виндой можно выставить хип только 1.2Гб.


Так вот почему я не могу задать под x86 Xmx=1,5Гб Винда пишет что не может выделить heap
Re[3]: JVM использует больше памяти чем указано в JAVA_OPTS
От: Blazkowicz Россия  
Дата: 21.04.10 11:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Так вот почему я не могу задать под x86 Xmx=1,5Гб Винда пишет что не может выделить heap

Винда ничего не знает про хип JVM. Это вам сама JVM пишет.
Re[3]: JVM использует больше памяти чем указано в JAVA_OPTS
От: Blazkowicz Россия  
Дата: 21.04.10 11:20
Оценка:
Здравствуйте, Аноним, Вы писали:

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
От: dfdk  
Дата: 22.04.10 14:47
Оценка: 10 (2)
Здравствуйте, 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.
Ссылка по теме.
... << RSDN@Home 1.2.0 alpha 4 rev. 1238>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.