java - Coldfusion 元空间 null

标签 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仍然出现。

另一个方法可能是加载的类,也许它们不会被自动销毁。但我找不到查看加载的方法。

到目前为止,“解决方案”是重新启动服务器,以便我可以正常操作。我能够通过将最大 JVM 堆大小增加到 1024MB 来降低错误的频率,但仍然发生

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

enter image description here

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 

最佳答案

您的最大元空间大小设置为 192MB - 我通过更新以下 JVM 标志将其增加到至少 512MB:

-XX:MaxMetaspaceSize=512m

要最初保留 192MB 并尝试节省(元)空间,还需添加:

-XX:MetaspaceSize=192m

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

关于java - Coldfusion 元空间 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49882984/

相关文章:

java - Spring 3 Java 配置 : Imported @Configuration not enhanced?

java - 用于存储数据库数据的 ResultSet 替代方案

coldfusion - 是否可以将 ODBC 服务添加到现有的 CF 2016 安装中?

coldfusion - cfwebsocket 入门

java - 要求用户仅重试三个答案之一? (java)

java - 已使用不兼容格式定义的属性

image-processing - 如何使用 ColdFusion 缩放图像而不损失分辨率?

mysql - 拍卖结束时间触发其他 Action

coldfusion - CF 在数据库查询中获取列的总和

structAppend 与重复