Coldfusion Metaspace null

时间:2018-04-17 16:17:46

标签: java coldfusion coldfusion-2016 metaspace

使用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可能是加载的类,也许它们不会被自动销毁。但是我无法找到一种方法来查看加载的那些。

到目前为止,&#34;解决方案&#34;是重启服务器,以便我可以正常运行。我能够降低错误的频率,将最大JVM堆大小增加到1024MB,但仍然是

堆栈跟踪......很难到达鬼文件中的第-1行!的xD

enter image description here

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 

2 个答案:

答案 0 :(得分:1)

我将提供不同的观点:对于大多数遇到上述元空间错误(或“内存不足错误:元空间”)的CF人士,几乎总是因为Adobe设置了默认显示的较低的默认192mb值。

虽然提高价值确实是一种解决方案,但我认为对大多数人来说最好的解决方案就是删除maxmetaspacesize参数。我将解释更多信息,包括Adobe为什么设置它(这是Java 7及更早版本中与maxpermsize相关的旧情况的遗留物):

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

答案 1 :(得分:0)

您的最大元容量大小设置为192MB - 通过更新以下JVM标志,我将此值设置为至少512MB:

-XX:MaxMetaspaceSize=512m

要保持最初的192MB并尝试保存(元)空间,还要添加:

-XX:MetaspaceSize=192m

这解决了我们遇到和你一样的问题。此外,您可以在计划任务中运行垃圾收集,如果您想确保它定期发生,可以每天运行一次。