作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
scala 编译器是否通过删除对 val
的引用来优化内存使用? s 在一个块内只使用一次?
想象一个对象聚集了一些巨大的数据 - 达到克隆数据或其派生数据的大小可能会为 JVM/机器带来最大的内存量。
一个最小的代码示例,但想象一下更长的数据转换链:
val huge: HugeObjectType
val derivative1 = huge.map(_.x)
val derivative2 = derivative1.groupBy(....)
huge
在
derivative1
之后标记为符合垃圾收集条件已计算?或者在退出包装块之前它会保持事件状态吗?
最佳答案
首先:只要JVM GC认为有必要,就会实际释放未使用的内存。所以scalac对此无能为力。
scalac 唯一能做的就是将引用设置为 null,不仅在它们超出范围时,而且在它们不再使用时立即设置。
基本上
val huge: HugeObjectType
val derivative1 = huge.map(_.x)
huge = null // inserted by scalac
val derivative2 = derivative1.groupBy(....)
derivative1 = null // inserted by scalac
def huge: HugeObjectType
def derivative1 = huge.map(_.x)
def derivative2 = derivative1.groupBy(....)
val result = derivative2.<some other transform>
map
和
filter
通过迭代器逐项处理它们,导致没有中间集合被物化......这非常适合场景!这对
groupBy
之类的函数没有帮助但可能会显着减少前一个函数和类似函数的内存分配。以上内容归功于 Simon Schafer。
关于Scala 编译器优化以实现不变性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33853321/
我是一名优秀的程序员,十分优秀!