首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有任何方法来缩小JVM堆运行Coldfusion 9后的分配吗?

有任何方法来缩小JVM堆运行Coldfusion 9后的分配吗?
EN

Stack Overflow用户
提问于 2012-07-18 15:39:12
回答 2查看 1.5K关注 0票数 1

我们已经为CF9服务器设置了JVM,以便分配最大2GB的堆空间。通常,它只分配750 we到1GB左右,我们实际上只使用大约500 we。

一个流氓脚本刚刚被触发,它最终占用了堆空间,因此JVM已经分配了2GB的全部限制。现在,我们恢复了正常的运行速度,仅使用分配的2GB的500 2GB,我们的服务器现在的内存使用率为90%。

当JVM不再需要那么多的分配时,我们可以使用哪些设置来缩小JVM的最大堆空间?还是会一直这样直到下一次重新启动?只是想知道因为我们只有10%的内存在服务器上“摆动”空间.

谢谢!

编辑:

只是想澄清一点。通过设置JVM参数"-Xms750m“,我们将初始堆大小设置为750 We。我们的最大堆大小由JVM参数"-Xmx2048M“设置。在脚本运行之前,我们分配的堆大小约为1GB。在这1GB的内存中,我们平均只使用了500 we。脚本运行后,堆被推到了极限,所以现在有2GB的预分配堆空间,我们平均只使用500 on。

因此,这使得Windows记录了90%或更多的内存使用量。JVM可能至少有一个GB或更多的版本,因为它从未被使用过,但是,我们不知道如何强制这样做,或者如果有某种JVM设置来自动这样做。

EN

回答 2

Stack Overflow用户

发布于 2012-07-18 16:20:16

您可以运行一个完整的GC,它将缩小堆。只要至少750 megs,操作系统就可以“回收”内存(而且您真的不需要做任何事情)。但是,如果内存受限,将来可能会出现争用问题,因此您可能会考虑更好地进行调优。我通常将最小值和最大值设置为相同,这样我就不必仔细考虑这个问题了。不管怎么说-这里有个脚本可以帮你:

代码语言:javascript
复制
<Cfset runtime = CreateObject("java","java.lang.Runtime").getRuntime()>

<cfset fm = runtime.freememory()/>

<Cfset fm = int((fm/1024)/1024)/>

<cfset usedmem = 1270-fm/>
<cfoutput><br>
<br>
Free: #fm# megs<br>
Used: #usedmem# megs<br>
</cfoutput>

<cfset obj = createObject("java","java.lang.System")/>

    <cfset obj.gc()/>

    <cfset obj.runFinalization()/>

脚本的第一部分显示了空闲内存,第二部分运行了一个完整的垃圾回收(也是一个完全的暂停,因此根据您的流量和硬件,这一点可能是显而易见的)。

祝你好运:)

票数 1
EN

Stack Overflow用户

发布于 2012-07-18 16:19:31

如果堆再次回到500 meg的报告,那么对于发生了什么,有几种可能性:

内存在PermGen中使用。Perm不会以同样的方式被垃圾收集器清除(如果有的话)。如果您可以在服务器上的JDK上运行JPS或JVisualVM,那么您就可以获得内存使用位置的句柄,因为它们报告了Perm的使用情况。

另一种可能是,您使用的OS度量是反映进程使用的最大内存,而不是当前内存。我不是这里的专家,但如果您能够准确地发布用于显示内存使用情况的度量标准,则可能会很有用。

我想JVM可能不会释放内存--它是垃圾回收回操作系统,尽管我自己还没有看到这种情况。

当你的流氓脚本运行时,你说它在崩溃之前花了整整一堆时间。它和OutOfMemoryException一起死了吗?如果扫描异常日志,是否有任何关于哪些线程崩溃的内容?通常,一旦您的JVM经历了OOM,您可能应该重新启动,因为您无法判断是否有任何应用程序状态已损坏。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11545110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档