Coldfusion Metaspace null

Работая с 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 все еще появляется.

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

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

А трассировка стека ... ну, трудно добраться до строки -1 в призрачном файле! xD

Coldfusion Metaspace null

Версия Java: 1.8.0_112

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

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

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 

1. Какая у вас версия Java? 2. А какой GC вы используете? 3. Я шел по тому пути, по которому идете вы. ColdFusion может создавать и уничтожать переменные быстрее, чем это может поддерживать JVM. В моем конкретном случае я использовал Query of Queries внутри циклов. На мой взгляд, вы должны найти код, который вызывает проблему, а не заставлять gc.

James A Mohler 17.04.2018 19:05

@JamesAMohler Проверьте обновление, пожалуйста. Что касается кода, да, я использую QoQ в некоторых частях, но эта ошибка возникает в любой момент или в любом процессе, а не в конкретном. После перезапуска процесс, вызвавший ошибку, работает правильно, через несколько часов или дней снова отказывает в любом другом процессе. Вот почему я не могу идентифицировать код.

Giancarlo Benítez 17.04.2018 19:45

Рассортируйте ответ, рассмотрите возможность использования G1GC. Подробный ответ можно увидеть здесь: stackoverflow.com/questions/20253684/…

James A Mohler 18.04.2018 00:59

@ GiancarloBenítez - Проверяли ли вы различные файлы журналов и содержат ли они ошибку?

SOS 18.04.2018 01:57

@Ageax Я прочитал файлы журнала (все), но мне не удалось найти ошибку. Может я не правильно читаю или что-то пропустил, какие-нибудь предложения?

Giancarlo Benítez 18.04.2018 16:18

(Edit) @ GiancarloBenítez - я думаю, возможно, он не был зарегистрирован, но что вы искали в файлах * .log - только слово "Metaspace"? Я знаю, что они заменили PermGen на Metaspace в jvm 1.8, поэтому мне было любопытно, есть ли где-нибудь в журналах какие-либо ошибки OOM. Его обнаружение в журналах не решит проблему, но подтвердит, что это проблема с памятью, и, возможно, предоставит более подробную информацию. Кстати, сколько памяти доступно? -Xms256m -Xmx1024m не большая сумма

SOS 18.04.2018 16:39

@Ageax С «метапространством» было единственное слово, которое я получил некоторые результаты из de «application.log», но просто показываю маршрут файла, который не удался, не более того. «ООМ» или «ПермГен» ничего не дали. По поводу памяти, это локальный экземпляр ноутбука для разработки. Производственный серв имеет около 6 ГБ и все еще имеет ошибки.

Giancarlo Benítez 19.04.2018 00:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
7
1 645
2

Ответы 2

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

-XX:MaxMetaspaceSize=512m

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

-XX:MetaspaceSize=192m

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

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

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

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

Другие вопросы по теме