Java:传输包含空值的双数据类型数组需要多少字节?

时间:2012-09-12 02:21:04

标签: java amf

如果我使用二进制传输(例如AMF protocol)将具有100个元素(例如)的数据类型double从应用程序服务器(Linux CentOS)Java(1.6)方法传递给客户端,那么有多少字节传输?

例如,如果它是双浮点数的数组,则每个数字占用8个字节。因此,如果数组长100个元素,并且每个元素都为null,那么是否会传输800字节的数组大小?也就是说,如果每个元素为空,它们是否仍然占用8个字节?

更新:

最终我对上述问题的看法是,我在服务器上有一个(x,y)数据集,代表一个情节。 y数据是唯一的,但x数据是等间隔的。因此,我可以避免将x数据从服务器传输到客户端(而是传输x-interval并让客户端重新创建可预测的x轴值)。但是,从服务器传递到客户端的数组显示为:

myArray[0].x = null
myArray[0].y = 1e-302
myArray[1].x = null
myArray[1].y = 1.42e-202
...
myArray[99].x = null
myArray[99].y = 2.3234e-3

我想知道这些null值是否每个都长8个字节,或者我是否会节省一些内存,因为它们是null

更新2:

PDF页面82这里的BlazeDS(例如LCDS)documentation描述了从Java到ActionScript AMF3的转换(由BlazeDS和LCDS使用)。在PDF页面83上,该表显示Java类型null映射到ActionScript AMF3类型null

2 个答案:

答案 0 :(得分:3)

在AMF0中,根据the Wikipedia article you linked to,“数字”(AMF0唯一的数字类型,但它对应于Java的double)将是9个字节(0x00以表示它是一个数字,加上数字的双精度浮点表示的八个字节),而null只是一个字节(0x05)。数组包含两个字节(初始0x08和最终0x09)及其内容,因此如果数组的长度为 n ,则其 k 元素是数字,那么它的总大小将是2 + 9× k +( n - k )= 2 + n < / em> + 8× k 。如您所见,null可能会显着降低传输负载。

AMF3的细节不同,但相似。

答案 1 :(得分:2)

Java SE中没有DOUBLE数据类型。由于它可以为空,我们讨论的是Double(而不是double)。包装器类型(Double)的实例使用的内存比基本类型(double)的内存大得多。

任何空引用都将使用 less 内存,而不是对类加上the memory used to store the instance itself实例的引用的内存消耗。您可能会天真地假设空引用使用4或8个字节(取决于您使用的是32位还是64位JVM),但有fancy-schmancy optimizatons that the JVM can use可能减小大小一个对象引用(更多关于herehere)。

无论哪种方式,如果你非常关心内存使用情况,为什么你要使用Double而不是double如果只是因为你需要一个“无价值”值,使用Double.NaN