заставить jvm вернуть собственную память [duplicate]

This question already has an answer here:

JVM sending back memory to OS [duplicate] 3 answers

Время от времени я выполняю задачи по затмению, которые требуют очень большого объема памяти. Итак, jvm во время выполнения задачи проглатывает около 2-3 ГБ ОЗУ, это нормально. Но как только jvm занял эту память, он не освобождает ее, и у меня возникает ситуация, когда используемая память в куче составляет около 200 МБ с общим размером кучи около 3 ГБ, и это действительно нежелательно, поскольку другие программы испытывают недостаток памяти.

Я старалсяMax/MinHeapFreeRatio параметры, чтобы заставить jvm уменьшить потребление неиспользуемой памяти. Это мое затмениеconfig.ini файл:

-startup
plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.100.v20110502
-vm
c:/Program Files/Java/jdk1.6.0_26/bin/javaw.exe
-showlocation
-product
org.eclipse.epp.package.jee.product
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
256M
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
--launcher.defaultAction
openFile
-vmargs
-Duser.name=Michael Nesterenko
-Dosgi.requiredJavaVersion=1.5
-Xms512m
-Xmx4096m
-XX:MinHeapFreeRatio=10
-XX:MaxHeapFreeRatio=30

Но это не помогает, у меня все еще есть ситуации, когда много неиспользуемой памяти.

 matt freake21 июн. 2012 г., 15:08
Целесообразно ли иметь два разных ярлыка / сценария оболочки для запуска Eclipse с разными наборами параметров для случаев, когда вам приходится выполнять задачи, требующие большого объема памяти?

Ответы на вопрос(1)

Java выделяет максимальный размер кучи при запуске в качестве виртуальной памяти. Поскольку он использует память, он выделяется как реальная основная память. Это никогда не сжимает этот размер. Единственный способ освободить эту память - выйти из программы.

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

 22 июн. 2012 г., 09:35
@ alain.janinm Это коробка Windows 7 с 8 ядрами и 32 ГБ памяти (около 23 ГБ свободного места). Я полагаю, что при высоком свободном объеме памяти ОС может не забирать память, поскольку она не требуется.
 21 июн. 2012 г., 15:24
Используемая куча будет уменьшаться, а размер резидентного приложения - нет.I don't know what the bug reviewer is talking about either. I've NEVER seen the Virtual Memory footprint shrink.
 michael nesterenko21 июн. 2012 г., 15:30
На самом деле виртуальная память не является проблемой, она может быть любого размера, поскольку она является приватной. Мне нужно сократить рабочий набор процессов - это физическое использование оперативной памяти.
 21 июн. 2012 г., 15:36
Я нахожу, что между оптимизациями, которые должна делать JVM, и тем, что вы действительно находите, существует определенная зависимость. Примером является анализ побега. В теории это может удалить много создания объекта, но в действительности очень трудно найти пример, где это происходит.
 21 июн. 2012 г., 15:13
Я не согласен. Память может сжиматься. Из этого документа (oracle.com/technetwork/java/javase/tech/…): -XX:MaxHeapFreeRatio=70 Maximum percentage of heap free after GC to avoid shrinking. Это означает, что если освободится более 70% кучи, куча будет уменьшаться. Также в соответствии с этим сообщением об ошибке (bugs.sun.com/bugdatabase/view_bug.do?bug_id=6498735) : The HotSpot JVM already will release memory back to the operating system if it is not needed for live Java objects.

Ваш ответ на вопрос