在科特林,为什么我的每一个浮标占据128位而不是16位? [重复]

问题描述 投票:1回答:1

这个问题已经在这里有一个答案:

我想,以减少内存占用量巨大的数据表(阵列)的执行过程中占用。

对于我使用JCMD打印直方图。

不过,我发现了一些有趣的位置:

 num     #instances         #bytes  class name
----------------------------------------------
   1:      28409956      454559296  java.lang.Float
   2:       3156662      227280584  [Ljava.lang.Integer;
   3:       3156660      227279520  [Ljava.io.Serializable;
   4:        526110       21044400  [[Ljava.io.Serializable;
   5:        233936       17436808  [C
   6:        241719        5801256  java.lang.String
   7:         54517        3684696  [Ljava.util.HashMap$Node;
   8:         93867        3003744  java.util.HashMap$Node
   9:         74535        2981400  java.util.LinkedHashMap$Entry
  10:         38269        2143064  java.util.LinkedHashMap
  11:           190        2108240  [[[Ljava.io.Serializable;
  12:         29416        1411968  java.util.HashMap
  13:          5345        1400312  [B

你看,我有浮动的28409956个实例,它需要的总内存为454559296个字节。如果划分字节/情况下,我会得到每浮子16个字节...!这意味着每个浮点占据128位!?

我在想什么?

我怎样才能进一步降低这些花车内存(及整数 - 我不能使用短)走?

或者更好的,我怎么能强迫科特林使用原语(我只发现了如何与IntArray,FloatArray等做它在阵列中)?

谢谢!

java kotlin jvm jvm-hotspot jvm-crash
1个回答
1
投票

java.lang.Float中是一个包装型不原语。它确实需要更多的内存。

这里是科特林代码及其Java相当于:

    fun m1(f: Float) = f

    fun m2(f: Float?) = f
   public final float m1(float f) {
      return f;
   }

   @Nullable
   public final Float m2(@Nullable Float f) {
      return f;
   }
© www.soinside.com 2019 - 2024. All rights reserved.