hyd*_*yde 5 java memory stringbuilder
我正在写很多东西来登录突发,并优化数据路径.我用它构建日志文本StringBuilder
.什么是最有效的初始容量,内存管理明智,所以无论JVM如何都能很好地工作?目标是避免重新分配几乎总是,应该由初始容量约80-100覆盖.但是我也希望浪费尽可能少的字节,因为StringBuilder实例可能会在缓冲区中出现并且会浪费掉浪费的字节.
我意识到这取决于JVM,但是应该有一些值,这会浪费最少的字节,无论JVM,还是"最小公分母".我目前正在使用128-16
,其中128是一个很好的整数,减法用于分配开销.此外,这可能被认为是"过早优化"的情况,但由于我所追求的答案是一个"经验法则"数字,因此知道它在将来也会有用.
我不期待"我最好的猜测"答案(上面我自己的答案已经是这样),我希望有人已经研究过这个并且可以分享基于知识的答案.
好吧,我最终自己对此进行了简短的测试,然后在评论后进行了更多测试,以获得这个经过编辑的答案。
使用 JDK 1.7.0_07 并测试应用程序报告 VM 名称“Java HotSpot(TM) 64-Bit Server VM”,StringBuilder
内存使用的粒度为 4 个字符,甚至以 4 个字符增加。
答案:从内存分配的角度来看,4 的任何倍数对于 StringBuilder 来说都是同样好的容量,至少在这个 64 位 JVM 上是这样。
通过在不同的测试程序执行中创建 1000000 个具有不同初始容量的 StringBuilder 对象(具有相同的初始堆状态)并在ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getUsed()
之前和之后打印出来进行测试。
打印出堆大小也证实了,从堆中实际为每个缓冲区分配的数量StringBuilder
是 8 字节的偶数倍,正如预期的那样,因为 Java char 的长度是 2 字节。换句话说,与分配相同数量的初始容量为 5...8 的实例相比,分配初始容量为 1..4 的 1000000 个实例大约需要 8 MB 的内存(每个实例 8 字节)。
归档时间: |
|
查看次数: |
9683 次 |
最近记录: |