在Scala中Array [Byte]占用了多少内存?

时间:2015-07-17 11:19:34

标签: scala memory bytearray

Scala 2.10中,我创建了一个流,在其中写入一些文本并获取其字节数组:

val stream = new ByteArrayOutputStream()
// write into a stream
val ba: Array[Byte] = stream.toByteArray

我可以使用ba.lengthstream.toString().length()获取字符数。现在,我如何估计数据占用的内存量?是4 (array reference) + ba.length (each array cell occupies exactly 1 byte) - and this is in bytes吗?

1 个答案:

答案 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机器上)