【发布时间】:2015-11-22 09:25:54
【问题描述】:
scala 编译器是否通过删除对vals 的引用来优化内存使用,在一个块中只使用一次?
想象一个对象聚合了一些巨大的数据 - 达到克隆数据或其衍生数据的大小可能会划伤 JVM/机器的最大内存量。
一个最小的代码示例,但想象一个更长的数据转换链:
val huge: HugeObjectType
val derivative1 = huge.map(_.x)
val derivative2 = derivative1.groupBy(....)
将编译器例如在计算出derivative1 之后将huge 标记为符合垃圾收集条件?还是在退出包装块之前它会保持活动状态?
理论上,不变性很好,我个人觉得它很容易上瘾。但是要适合在当前操作系统上无法逐项进行流处理的大数据对象 - 我会声称它本质上是阻抗与合理的内存利用率不匹配的,因为 JVM 上的大数据应用程序是不是吗,除非编译器针对这种情况进行优化..
【问题讨论】:
-
我不认为编译器可以对 GC(即运行时)做很多事情。检查stackoverflow.com/questions/6275397/…
-
在答案中解决整体问题而不是(仅)GC限制将非常有帮助......
-
编译器不会将任何东西标记为“符合垃圾回收条件”。当没有更多对它们的引用时,事物被垃圾收集,而不是编译器指示它。这就是为什么正确答案是关于 GC 及其局限性的原因。
-
那么,以上面一般表达的不可变模式编写的 scala 程序本质上不足以以任何(内存)有效方式处理大数据。您确定取消引用不能以任何方式被字节码暗示吗?如果示例中的代码链是例如拆分成函数?
标签: scala scalac scala-compiler