Пустое метапространство Coldfusion

Работая с CF2016, я встречал эту ошибку в среде разработки, а также в производственной среде, но реже.

Metaspace null. The error ocurred on line -1.

Читая некоторые форумы, вы поняли идею сборщика мусора и сумели реализовать этот код, чтобы заставить сборщик:

<cfset runtime = CreateObject("java","java.lang.Runtime").getRuntime()>
<cfset freeMemory = runtime.freeMemory() / 1024 / 1024>
<cfset totalMemory = runtime.totalMemory() / 1024 / 1024>
<cfset maxMemory = runtime.maxMemory() / 1024 / 1024>
<cfset usedMemory =  (runtime.totalMemory() - runtime.freeMemory()) / 1024 / 1024>

<cfoutput>
    Used Memory: #Round(usedMemory)#mb<br>
    Free Allocated Memory: #Round(freeMemory)#mb<br>
    Total Memory Allocated: #Round(totalMemory)#mb<br>
    Max Memory Available to JVM: #Round(maxMemory)#mb<br>
</cfoutput>

<cfset clear = runtime.gc()> 

Любопытно, что в оперативной памяти много места (обычно половина места свободна), но Metaspace Null все еще появляется.

Другим подходом могут быть загруженные классы, возможно, они не уничтожаются автоматически. Но я не могу найти способ увидеть загруженные.

Пока «решение» состоит в том, чтобы перезапустить сервер, чтобы я мог нормально работать. Мне удалось уменьшить частоту возникновения ошибки, увеличив максимальный размер кучи JVM до 1024 МБ, но все еще возникающей

И трассировка стека... трудно добраться до строки -1 в файле-призраке! хD

введите здесь описание изображения

Версия Java: 1.8.0_112

Сборщик мусора: -XX:+UseParallelGC (по умолчанию)

Аргументы для VM (переходы между строками для удобства чтения)

java.args=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 -server 
-Xms256m 
-Xmx1024m 
-XX:MaxMetaspaceSize=192m 
-XX:+UseParallelGC 
-Xbatch 
-Dcoldfusion.home={application.home} 
-Djava.awt.headless=true 
-Duser.language=en 
-Dcoldfusion.rootDir={application.home} 
-Djava.security.policy={application.home}/lib/coldfusion.policy 
-Djava.security.auth.policy={application.home}/lib/neo_jaas.policy 
-Dcoldfusion.classPath={application.home}/lib/updates,{application.home}/lib,{application.home}/lib/axis2,{application.home}/gateway/lib/,{application.home}/wwwroot/WEB-INF/cfform/jars,{application.home}/wwwroot/WEB-INF/flex/jars,{application.home}/lib/oosdk/lib,{application.home}/lib/oosdk/classes 
-Dcoldfusion.libPath={application.home}/lib 
-Dorg.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER=true 
-Dcoldfusion.jsafe.defaultalgo=FIPS186Random 
-Dorg.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.JavaUtilLog 
-Djava.util.logging.config.file={application.home}/lib/logging.properties 

person Giancarlo Benítez    schedule 17.04.2018    source источник
comment
1. Какая у вас версия Java? 2. А какой GC вы используете? 3. Я был на той дороге, по которой вы идете. ColdFusion может создавать и уничтожать переменные быстрее, чем JVM. В моем конкретном случае я использовал Query of Queries внутри циклов. На мой взгляд, вы должны найти код, который вызывает проблему, а не заставлять gc.   -  person James A Mohler    schedule 17.04.2018
comment
@JamesAMohler Проверьте обновление, пожалуйста. Что касается кода, да, я использую QoQ в некоторых частях, но эта ошибка возникает в любой момент или в любом процессе, а не в конкретном. После перезапуска процесс, вызвавший ошибку, работает нормально, через несколько часов или дней снова происходит сбой в любом другом процессе. Вот почему я не могу идентифицировать код.   -  person Giancarlo Benítez    schedule 17.04.2018
comment
Отсортируйте ответ, рассмотрите возможность использования G1GC. Длинный ответ можно увидеть здесь: stackoverflow.com/questions/20253684/   -  person James A Mohler    schedule 18.04.2018
comment
@GiancarloBenítez - Вы проверяли различные файлы журналов и содержали ли они ошибку?   -  person SOS    schedule 18.04.2018
comment
@Ageax Я прочитал файлы журнала (все), но не нашел ошибку. Может быть, я не то читаю или что-то пропустил, есть предложения?   -  person Giancarlo Benítez    schedule 18.04.2018
comment
(Редактировать) @GiancarloBenítez - Я думаю, возможно, это не было зарегистрировано, но что вы искали в файлах * .log - только слово Metaspace? Я знаю, что они заменили PermGen на Metaspace в jvm 1.8, поэтому мне было любопытно, есть ли где-нибудь в журналах какие-либо ошибки OOM. Нахождение его в журналах не решит проблему, но подтвердит, что это проблема с памятью, и, возможно, предоставит более подробную информацию. Кстати, сколько памяти доступно? -Xms256m -Xmx1024m не так уж и много   -  person SOS    schedule 18.04.2018
comment
@Ageax С метапространством было единственным словом, я получил некоторые результаты из файла application.log, но просто показываю маршрут файла, в котором произошел сбой, не более того. OOM или PermGen ничего не дали. Что касается памяти, это локальный экземпляр ноутбука для разработки. Рабочий сервер имеет около 6 ГБ и все еще имеет ошибки.   -  person Giancarlo Benítez    schedule 19.04.2018


Ответы (2)


Ваш максимальный размер метапространства установлен на 192 МБ — я бы увеличил его как минимум до 512 МБ, обновив следующий флаг JVM:

-XX:MaxMetaspaceSize=512m

Чтобы изначально сохранить свои 192 МБ и попытаться сэкономить (мета) пространство, также добавьте:

-XX:MetaspaceSize=192m

Это исправило нашу проблему, когда мы сталкивались с тем же, что и вы. Кроме того, вы можете запускать сборку мусора внутри запланированной задачи, которая может запускаться один раз в день, если вы хотите убедиться, что она происходит регулярно.

person James Cushing    schedule 08.05.2018

Я предложу другую точку зрения: для большинства людей, занимающихся CF, которые столкнулись с такой ошибкой метапространства, как указано выше (или «outofmemoryerror: metaspace»), это почти всегда происходит потому, что Adobe по умолчанию устанавливает относительно низкое значение по умолчанию 192 МБ.

И хотя увеличение значения действительно является одним из решений, я утверждаю, что лучшее решение для большинства людей — это просто удалить аргумент maxmetaspacesize. Я объясню больше, в том числе почему Adobe устанавливает его (остаток старой ситуации, связанной с maxpermsize из Java 7 и более ранних версий) здесь:

https://www.carehart.org/blog/client/index.cfm/2020/2/24/solving_metaspace_errors/

person charlie arehart    schedule 27.02.2020