ColdFusion jvm 垃圾收集不

2023-12-24

我有一个 cfc 方法,它循环遍历列表并通过 cfhttp 进行一系列 SOAP 调用。然后将结果插入数据库。

该过程本身工作得很好,问题是java内存慢慢填满,最终(取决于返回的记录中的元素数量)停止工作。没有错误或任何可见的东西它就停止了。如果我通过 Coldfusion 管理查看应用程序日志文件,我会看到以下一个或两个错误:

GC overhead limit exceeded The specific sequence of files included or processed is:

or

Java heap space The specific sequence of files included or processed is:

下面是我正在运行的代码的简化版本:

<cfsetting requesttimeout="3600">
<cfloop condition="thisPass lt 10">
    <cfscript>
        runtime = CreateObject("java","java.lang.Runtime").getRuntime();
        objSystem = CreateObject( "java", "java.lang.System" );
        soapBody = '';
        soapResponse = '';
        thisStruct = '';
        lock scope='application' type='exclusive' timeout='60' {


//This is where I am trying to manage the memory and call garbage collection


        try {
            freeMemory = runtime.freeMemory()/1024/1024;
            writeOutput("- fm = "&freeMemory);
            if (freeMemory < 200){
                objSystem.gc();
                sleep(1000);
                writeDump(' - dumping freeMemory');
             }
         }
         catch(any error) {
            writeDump(' - trying to dump GC as '&now()& ' freeMemory = '&freeMemory);
         }
         }
        </cfscript>
        <cfsavecontent variable="soapBody">
            <?xml version="1.0" encoding="utf-8"?>
            [ BUILD SOAP ENVELOP ]
        </cfsavecontent>

        <cfhttp url="[URL]" method="post" result="httpResponse" 
                        timeout="600" resolveurl="false">
                <cfhttpparam type="header" name="SOAPAction" value="[URL2]" />
                <cfhttpparam type="xml" value="#trim( soapBody )#"/>
            </cfhttp>


            <cfscript>
                soapBody = "";
                soapResponse = httpResponse.fileContent;
                soapResponse = xmlParse( soapResponse );
                thisStruct = xmlSearch(soapResponse,'/soap:Envelope/soap:Body/')[1].xmlChildren[1].xmlChildren[1].xmlChildren;
                writeOutput("-"&arrayLen(thisStruct)&' records');
                getPageContext().getOut().flush();
                if(arrayLen(thisStruct) == 2500){
                    thisPass = thisPass+1;
                } else {
                    writeOutput("- total records = "&(2500*(thisPass-1))+arrayLen(thisStruct));
                    thisPass = 100; // since looping while thisPass lt 10 this should prevent the next iteration
                }
            </cfscript>

            <cfloop from="1" to="#arrayLen(thisStruct)#" index="i">
                [RUN PROC TO INSERT RECORDS]
            </cfloop>
        </cfloop>

GC 似乎有时释放一点内存,但没有任何可靠性。我明白 GC() 只是一个推荐让java释放一些未使用的内存,但我不确定如何让它强制释放内存。可能某个地方有泄漏,但我没有看到它。我希望这是我忽略的显而易见的事情,并且我承认我的 java 知识极其有限。

有没有java大师可以看到我的错误?

UPDATE :这是输出示例,这有助于查看内存的下降情况。

有 236 个列表可供循环

  1. 88185 - fm = 293.564407349 -6 条记录 - 总记录 = 6
  2. 88389 - FM = 290.86995697 -116 条记录 - 总记录 = 116
  3. 88390 - FM = 308.382568359 -262 条记录 - 总记录 = 262
  4. 88839 - FM = 292.707099915 -2032 条记录 - 总记录 = 2032
  5. 91088 - fm = 290.711753845 -6 条记录 - 总记录 = 6
  6. 92998 - FM = 287.754066467 -5 条记录 - 总记录 = 5
  7. 95510 - fm = 309.919425964 -91 条记录 - 总记录 = 91
  8. 96478 - FM = 292.035064697 -1180 条记录 - 总记录 = 1180
  9. 96479 - FM = 259.001213074 -1113 条记录 - 总记录 = 1113
  10. 96480 - FM = 261.121406555 -110 条记录 - 总记录 = 110
  11. 96796 - fm = 267.235244751 -2 条记录 - 总记录 = 2
  12. 96799 - fm = 265.037582397 -0 条记录 - 总记录 = 0
  13. 97435 - fm = 263.589103699 -2500 条记录 - fm = 227.629760742 -2500 条记录 - fm = 200.85987854 -2500 条记录 - fm = 202.156776428 -2500 条记录 - fm = 166.366210938 - 转储freeMemory -656 条记录 - 总记录 = 10656
  14. 98173 - fm = 160.579734802 - 转储空闲内存-35条记录-总记录= 35
  15. 99111 - fm = 176.218482971 - 转储 freeMemory -0 条记录 - 总记录 = 0
  16. 100998 - fm = 194.708694458 - 转储空闲内存-185条记录-总记录= 185
  17. 101811 - fm = 160.61415863 - 转储freeMemory -2500条记录 - fm = 112.862670898 - 转储freeMemory -2500条记录 - fm = 86.2071380615 - 转储freeMemory -2500条记录 - fm = 52.9639358521 - 转储freeMe莫里 -1064 条记录 - 总记录 = 8564
  18. 105014 - fm = 56.1721343994 - 转储freeMemory -14条记录 - 总记录= 14
  19. 105992 - fm = 73.0022964478 - 转储freeMemory -14条记录 - 总记录= 14
  20. 107539 - fm = 75.9522399902 - 转储空闲内存-93条记录-总记录= 93
  21. 107580 - fm = 58.345199585 - 转储空闲内存-2500条记录

这并不是 Java 不能很好地管理 GC,而是你没有管理你放入(以及从内存中取出)的内容,以便垃圾收集器可以清理它们。 。你正在(试图~)治疗症状而不是问题。

查看内存中的内容以及为什么您希望进行 GC 处理的内容isn't正在接受GC教育。可能是您引用了共享范围内的内容(意外地),或者类似的内容。不过,在 Java 之上使用 ColdFusion 解决此类问题有点黑暗艺术。

但是,当您强制执行 GC 时,不要尝试“修复”事物未被 GC 的“问题”,而是解决导致内存 a) 填满的问题; b) 当您认为应该可以进行 GC 时,却不能进行 GC。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ColdFusion jvm 垃圾收集不 的相关文章

随机推荐

  • 我的 JBoss 服务器在 Linux 上达到 100% SYS CPU;什么会导致这种情况?

    我们已经调试这个 JBoss 服务器问题很长时间了 大约工作 10 小时后 服务器陷入 100 CPU 恐慌攻击并停止运行 在此期间您无法运行任何新程序 因此您甚至无法kill quit获取堆栈跟踪 这些 100 SYS CPU 负载持续
  • 在 Spring Boot WebSocket 中向特定用户发送通知

    我想向特定客户发送通知 例如用户名 user Configuration EnableWebSocketMessageBroker public class WebSocketConfiguration extends AbstractWe
  • 使用 IO monad 的 Haskell 单元测试

    我正在尝试为返回 IO monad 的 haskell 函数编写 HUnit 测试 因为它们执行文件 I O 有什么办法可以做到这一点吗 现在我正在尝试编写一个仅返回 Bool 的方法 这可以作为我的测试 combine FilePath
  • OSCAR_SEARCH_FACETS 用于过滤产品列表

    我正在使用 django oscar 开发一个电子商务网站 产品已列出 我必须应用过滤器 例如年份 价格等 我们可以使用 oscar facet 来实现此过滤功能吗 我尝试添加以下内容奥斯卡文档 http django oscar read
  • Django 带过滤器的左外连接

    我正在使用 Django 的内置用户模型 并有一个自定义 Foo 对象 其中包含 User 的外键 我希望选择符合某些约束的所有 User 对象和所有 Foo 对象 如下所示 SELECT from auth user LEFT OUTER
  • 如何理解 Haskell 中的“$”用法[重复]

    这个问题在这里已经有答案了 当您想要将一堆函数应用于同一个变量时 就会发生这种情况 它可能如下所示 map f gt f 4 odd even 但从LYAH http learnyouahaskell com higher order fu
  • 在 MSBuild 中使用 Studio 的“自定义工具”

    我有一个 Visual Studio 的 自定义工具 可以将一些模板文件合并到代码中 为了一致性和可移植性 我希望在 Visual Studio 之外构建时能够从 MSBuild 运行此模板处理器 Visual Studio 为文件创建以下
  • Spring security Remember me 不适用于 Spring MVC 应用程序。

    身份验证和授权工作正常 但记住我在应用程序中无法正常工作 我使用了 Spring Security 的数据库身份验证和 LDAP 身份验证 一次仅一个 以及大量 Spring Security 自定义 下面是我的 spring 安全上下文文
  • Docker 使用哪种算法来使缓存无效?

    为了减少动态配置的 EC2 机器上的 Docker 镜像构建时间 我决定使用以下方法 每晚在主主机上运行 docker compose build 将整个 var lib docker 目录从主主机克隆到新盒子 在新盒子上运行 docker
  • Autohotkey 和 Windows 10:如何获取当前资源管理器路径

    我使用 autohotkey 版本 1 0 48 05 因为我坚 持使用 activeaid 读取当前路径的脚本如下 一直有效到Win 7 Get full path from open Explorer window WinGetText
  • 滚动到 UICollectionView 中的下一个单元格

    我在容器视图中有一个 UICollectionView 它的大小使得我一次只能看到一个单元格 我已禁用垂直滚动 因此仅发生水平滚动 当我在单元格之间水平滚动时 一切都很顺利 这种滚动的缺点是我可以滚动并到达一个位置 在该位置我可以看到两个单
  • 如何在java程序中禁用堆栈跟踪生成?

    我想禁用抛出异常时生成的堆栈跟踪 我用过了 Runtime getRuntime traceInstructions false Runtime getRuntime traceMethodCalls false 但我仍然可以看到生成的跟踪
  • Protractor:在不知道文件名的情况下测试下载文件

    我跟着这个答案 https stackoverflow com a 27031924 858913它看起来几乎就是我需要的东西 问题是他已经知道文件名 而我正在执行下载文件的 e2e 测试 但文件名取决于当前时间 即使是毫秒 所以我真的不知
  • maven jasperreports-functions-6.1.1 的存储库

    明显地
  • 如何在r中绘制KNN簇边界

    我正在使用 K 最近邻居的虹膜数据 我已将物种类型替换为数据中的数值 即 setosa 1 versicolor 2 virginica 3 现在我正在将数据放入训练和测试集中 并在物种colmum的基础上训练这个模型 Clustering
  • 长度示例中“List a”中的“a”是什么?

    我想知道在哪里可以找到有关 a 用在长度示例 http elm lang org examples length 似乎是某种类型 1 2 3 is a List Int 只能与整数列表一起使用的函数必须具有List Int在他们的类型签名中
  • __init__ 的目的

    我读了一些书 但无法像我想的那样完全理解这一点 我正在从 LPTHW 教程中制作一个 选择你自己的冒险 小游戏 这是完整的脚本 http codepad org YWVUlHnU http codepad org YWVUlHnU 我不明白
  • 在Python中计算modbus的CRC16

    首先 抱歉 我是初学者 我在 modbus 上得到以下字节序列 01 04 08 00 00 00 09 00 00 00 00f8 0c 该字节序列上粗体的 CRC 是正确的 但是 要检查 创建 CRC 我必须遵循设备规范 其中规定 错误
  • 什么是段以及如何在 8086 模式下寻址它们?

    自从我开始使用 8086 汇编语言编程以来 我一直在思考这些段和段寄存器 我面临的问题是 我无法对脑海中的片段有一个直观的图像 因此我不清楚这些概念 谁能帮我理解这个概念将其与现实世界场景联系起来 我还有以下问题 问题一 据我了解 在启用2
  • ColdFusion jvm 垃圾收集不

    我有一个 cfc 方法 它循环遍历列表并通过 cfhttp 进行一系列 SOAP 调用 然后将结果插入数据库 该过程本身工作得很好 问题是java内存慢慢填满 最终 取决于返回的记录中的元素数量 停止工作 没有错误或任何可见的东西它就停止了