Вы скомпилировали свой Java-класс с JDK 7, и вы пытаетесь запустить тот же класс на JDK 6.
Max memory = [-Xmx] + [-XX:MaxPermSize] + number_of_threads * [-Xss]
здесь максимальная память кучи как -Xmx, минимальная память кучи как -Xms, стек памяти как -Xss и -XX maxPermSize
Следующий пример иллюстрирует эту ситуацию. Я запустил свой tomcat со следующими параметрами запуска:
-Xmx168m -Xms168m -XX:PermSize=32m -XX:MaxPermSize=32m -Xss1m
Вы пытались использовать JVisualVM?
http://docs.oracle.com/javase/6/docs/technotes/tools/share/jvisualvm.html
Я часто находил, что это помогает мне отслеживать этот материал. Он покажет вам, сколько из каждого типа памяти используется, даже позволяя вам разобраться и узнать.
Команда Top отражает общий объем памяти, используемой приложением Java. Это включает в себя, среди прочего:
С -Xmx
вы настраиваете размер кучи. Для настройки размера стека используйте параметр -Xss
. Сумма этих двух параметров должна быть примерно такой, какой вы хотите:
-Xmx150m -Xss50m
например.
Кроме того, имеется также параметр -XX:MaxPermSize
, который управляет. Этот параметр для -client
имеет значение по умолчанию 32 МБ и для -server
64 МБ. В соответствии с вашей конфигурацией вычислите его также. Пространство PermGen:
Постоянное поколение используется для отображения отражающей самой виртуальной машины, такой как объекты класса и объекты метода.
blockquote>Таким образом, в основном он хранит внутренние данные JVM, такие как определения классов и встроенные строки.
В конце я должен сказать, что есть одна часть, которую вы не можете контролировать, то есть память, используемая собственным процессом Java. Java - это программа, как и любая другая, поэтому она также использует память. Если вы просматриваете использование памяти в диспетчере задач, вы также увидите эту память вместе с потреблением вашей программной памяти.
Важно отметить, что «используемая общая память» (RSS на территории Linux) включает кучу JDK (+ другие области JDK), а также выделенную «родную память».
Например, эти люди обнаружил, что выделение слишком большого количества jaxbcontexts (которые связаны с родной памятью) между GC может заставить его использовать много дополнительной ОЗУ. Другой распространенный, по-видимому, ZipInflater, если вы не вызываете его близко (или GZipStream и т. Д.)
http://sleeplessinslc.blogspot.com/2014/08/jvm-native- memory-leak.html
. Его последнее решение об обходе / исправлении было более «GC» чаще всего (с помощью сборщика мусора GC1 или указав меньший [иронически] -Xmx) или путем кэширования объектов JaxBContext (поскольку у них нет метода close, поэтому вы не можете контролировать утечку).
Также обратите внимание, что иногда вы можете найти виновников памяти, просто изучив jstack: http://javaeesupportpatterns.blogspot.com/2011/09/jaxbcontext-performance-problem-case.html
Иногда также возможно «пропустить» закрытие, например, GZipStreams случайно http://kohsuke.org/2011/11/03/quiz-time-memory-leak-in-java