gpt4 book ai didi

coldfusion - 从 CFC 返回查询的内存影响

转载 作者:行者123 更新时间:2023-12-04 13:55:36 27 4
gpt4 key购买 nike

我已经在 ColdFusion 中编写了一个数据库加载脚本,但我遇到了脚本缓慢耗尽内存的问题。我已经使用 将每个表负载拆分到它自己的线程中,并且当内存低于 50% 时我正在调用垃圾收集器(确保在 gc() 调用之间有 30 秒以防止垃圾收集器占用内存) .

我创建了一个 CFC 来保存脚本所需的所有查询。该脚本调用适当的 CFC 函数,然后返回查询,其中一些的大小超过 2 MB。当我在事件线程的内存页面的详细信息 View 中查看服务器监视器时,看起来我的 CFC 正在内存中保留查询的副本,即使我对查询变量进行了 varscoped 并且变量在最后超出了范围的功能。此外,我在我的线程中的内存中有一个查询的副本。所以我只剩下内存中查询的两个副本。这真的是正在发生的事情吗?如果是,如何从内存中删除一份查询副本?

最佳答案

这里有很多潜在的问题,但我会尽量强调一些最重要的事情,供您考虑:

  • 为什么是线程?你需要线程吗?在某些时候,您可能会为了自己的利益而进行过多的修补。
  • 手动强制垃圾收集不一定是一个好主意。调整 JVM 以自动执行其垃圾收集,但也不要过度。垃圾收集往往很昂贵,如果运行太频繁,可能会影响应用程序的性能。
  • 你如何实例化你的 CFC?如果您在每次查询请求时实例化 CFC,随着时间的推移,您将遇到 RAM 问题,缓慢的内存泄漏,因为 CFC 加载到 RAM 的速度太快,垃圾收集无法跟上。你最好的办法是让它成为一个单例。 (即,将其设置为应用程序范围)。
  • 请注意,变量范围内的变量不会(据我所知)在变量停止使用后立即自动释放内存。内存仍然保留,尽管它可能以某种方式标记为短暂生成的一部分,以便(可能?)更快地清理。但这并不能保证任何事情。
  • 如果您正在查看事件线程,则查询也有可能在请求结束之前不会被清除 - 不一定是函数调用结束。似乎不耐烦会促使您期望查询在函数调用完成后立即终止。
  • ColdFusion queries are passed by reference ,不是按值。应该不可能在内存中获得 2 个查询副本,除非您以某种方式使用 duplicate() 或类似的函数来显式复制查询。

  • 该查询可能会从您的 cfreturn 语句返回指向该查询的指针。在所有进程都完成引用它之前,不会清除该查询。因此,如果它将查询传递给其他某个进程,您将不会将该查询清除出内存。例如,如果您将该查询设置为 session 变量,则该指针不会在该 session 变量消失之前指向任何地方,无论您尝试强制垃圾收集的频率如何。

    只需考虑几件事。

    关于coldfusion - 从 CFC 返回查询的内存影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2364682/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com