【发布时间】:2019-06-30 22:47:26
【问题描述】:
我正在尝试减少一个巨大的数据表(数组)在执行期间占用的内存量。
为此,我使用 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 个 Float 实例,它占用的总 RAM 为 454559296 字节。如果它划分字节/实例,我将得到每个浮点数 16 个字节......!这意味着每个浮点数占用 128 位!?
我错过了什么?
如何进一步减少这些浮点数(以及整数——我不能使用 Short)占用的内存?
或者更好的是,如何强制 Kotlin 使用原语(我只发现了如何在 IntArray、FloatArray 等数组中使用)?
谢谢!
【问题讨论】:
标签: java kotlin jvm jvm-hotspot jvm-crash