在Scala 2.10
中,我创建了一个流,在其中写入一些文本并获取其字节数组:
val stream = new ByteArrayOutputStream()
// write into a stream
val ba: Array[Byte] = stream.toByteArray
我可以使用ba.length
或stream.toString().length()
获取字符数。现在,我如何估计数据占用的内存量?是4 (array reference) + ba.length (each array cell occupies exactly 1 byte) - and this is in bytes
吗?
答案 0 :(得分:10)
它占用的内存与java中一样多。 Scala数组是 java数组。
scala> Array[Byte](1,2,3).getClass
res1: java.lang.Class[_ <: Array[Byte]] = class [B
因此,内存使用量是数组的大小加上一些小的开销,这取决于机器的体系结构(32或64位)和JVM。
要精确测量JVM上字节数组的内存使用情况,您必须使用java代理库,例如JAMM。
这是一个将JAMM设置为java代理的scala项目:https://github.com/rklaehn/scalamuc_20150707。构建sbt显示了如何将JAMM配置为sbt项目的代理,并且有一些示例测试here。
以下是一些示例代码和输出:
val mm = new MemoryMeter()
val test = Array.ofDim[Byte](100)
println(s"A byte array of size ${test.length} uses "+ mm.measure(test) + "bytes");
> A byte array of size 100 uses 120 bytes
(这是在使用oracle java 7的64位linux机器上)