Работая с 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
Версия 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
@JamesAMohler Проверьте обновление, пожалуйста. Что касается кода, да, я использую QoQ в некоторых частях, но эта ошибка возникает в любой момент или в любом процессе, а не в конкретном. После перезапуска процесс, вызвавший ошибку, работает правильно, через несколько часов или дней снова отказывает в любом другом процессе. Вот почему я не могу идентифицировать код.
Рассортируйте ответ, рассмотрите возможность использования G1GC. Подробный ответ можно увидеть здесь: stackoverflow.com/questions/20253684/…
@ GiancarloBenítez - Проверяли ли вы различные файлы журналов и содержат ли они ошибку?
@Ageax Я прочитал файлы журнала (все), но мне не удалось найти ошибку. Может я не правильно читаю или что-то пропустил, какие-нибудь предложения?
(Edit) @ GiancarloBenítez - я думаю, возможно, он не был зарегистрирован, но что вы искали в файлах * .log - только слово "Metaspace"? Я знаю, что они заменили PermGen на Metaspace в jvm 1.8, поэтому мне было любопытно, есть ли где-нибудь в журналах какие-либо ошибки OOM. Его обнаружение в журналах не решит проблему, но подтвердит, что это проблема с памятью, и, возможно, предоставит более подробную информацию. Кстати, сколько памяти доступно? -Xms256m -Xmx1024m не большая сумма
@Ageax С «метапространством» было единственное слово, которое я получил некоторые результаты из de «application.log», но просто показываю маршрут файла, который не удался, не более того. «ООМ» или «ПермГен» ничего не дали. По поводу памяти, это локальный экземпляр ноутбука для разработки. Производственный серв имеет около 6 ГБ и все еще имеет ошибки.




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