【发布时间】:2014-08-29 14:28:42
【问题描述】:
曾经我有一个理论,即在每个请求上实例化对象而不是让它们驻留在应用程序范围内是一个巨大的内存消耗。随着多年来我对 ColdFusion 的了解不断增长,我认为我并不真正了解 CF 是如何处理 CF 框架的“黑匣子”中的类的,所以我将向社区寻求纠正或确认。
我只是要扔掉我认为正在发生的事情:
- CFC 被编译成一个类,该 CFC 中的每个方法都被编译成一个类。
- 这些类将驻留在 (PermGen) 内存中,并且可以根据 CF 管理员设置写入磁盘。
- 创建新对象或请求模板时,会对源代码进行哈希处理,并与编译后的类中存储的哈希值进行比较。
- 如果有匹配,它将使用内存中的编译类
- 如果编译的类不存在,则从源代码编译
- 如果编译的类存在,但哈希不匹配,则会重新编译。
- 顺便说一句,每当您启用可信缓存时,ColdFusion 将不再对源进行哈希处理以检查差异,而是继续使用内存中的已编译类。
- 每当您创建一个新对象时,您都会获得一个指向已编译类及其方法类的新指针,并且任何运行时事件都会在伪构造函数中发生。 编辑:此时,我指的是使用 createObject 并运行函数之外的任何“松散”代码。当我说指针时,我指的是对分配给对象范围(this、变量、函数变量)的内存的引用。
- 如果您请求初始化,则构造函数运行。此时消耗的内存只是您的新引用以及伪构造函数和构造函数中设置的任何变量。您实际上并没有为整个班级的副本占用内存。 编辑:对于这一步,我指的是使用 new 运算符或链接您的 createObject().init() 老派。
这消除了我个人多年来可能听说过的一个巨大谬误,即在每个请求中实例化大对象是一个巨大的内存消耗(由于拥有类的副本而不仅仅是参考)。请注意,我不赞成这样做,单例模式很神奇。我只是想确认幕后发生的事情,以防止在遗留代码中追逐红鲱鱼。
编辑:感谢大家的意见,这对我来说真的很有帮助。
【问题讨论】:
-
我不知道,但 2 号看起来不太可能。
-
@Dan,我以为他们只是加载到 PermGen 中。
-
好问题!!!我有一个项目需要正确回答这个问题。谢谢你问得这么准确。
标签: coldfusion