当前位置: 首页 > 面试题库 >

最有效的StringBuilder初始容量大小?

林绪
2023-03-14
问题内容

我正在写很多东西来登录突发,并优化数据路径。我用建立日志文本StringBuilder。从内存管理角度来看,最有效的初始容量是什么,因此不管使用JVM,它都能正常工作吗?目标是几乎总是避免重新分配,这应该由大约80-100的初始容量覆盖。但是我也想浪费尽可能少的字节,因为StringBuilder实例可能会在缓冲区中徘徊,浪费的字节会大量出现。

我意识到这取决于JVM,但是应该有一些值,这将浪费最少的字节数,而与JVM无关,这是“最小公分母”。我目前正在使用128-16,其中128是一个不错的整数,而减法是分配开销。同样,这可能被认为是“过早优化”的情况,但是由于我要回答的是一个“经验法则”数字,因此知道将来也会有用。

我不期望“我的最佳猜测”答案(上面我自己的答案已经是),我希望有人已经对此进行了研究并且可以共享基于知识的答案。


问题答案:

好吧,我最终自己做了简短的测试,然后在评论后进行了更多测试,以获得经过编辑的答案。

使用JDK 1.7.0_07并测试报告VM名称为“ Java
HotSpot(TM)64位服务器VM”的应用程序,StringBuilder内存使用的粒度为4个 字符 ,甚至增加了4个字符。

答:从内存分配的角度来看,至少在此64位JVM上 ,4的任意倍数 对于StringBuilder来说都是同样好的容量。

通过在不同的测试程序执行(具有相同的初始堆状态)中创建1000000个具有不同初始容量的StringBuilder对象进行测试,并在打印ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getUsed()之前和之后进行打印。

打印出堆大小也得到了确认,StringBuilder由于Java
char为2个字节长,实际上为每个缓冲区的堆实际分配的数量是8字节的偶数倍。换句话说,分配1000000个初始容量为1..4的实例所花费的内存要比分配相同数量的初始容量为5
… 8的相等数量的内存少8兆字节(每个实例8个字节)。



 类似资料:
  • 请给我建议如何增加ByteBuf的初始容量。 在以下情况下: 如果收入消息超过了ByteBuf的最大容量-我得到剪切数据。对于这个项目来说,获得完整的、非分块的消息是至关重要的。

  • 问题内容: 当我运行具有NLP库的Java类时出现此错误。 任何想法,我怎么可以解决这个错误:) 问题答案: 您应注意,如果将初始堆大小设置为大于最大堆大小,则应用程序将产生此类错误 表示 初始堆大小 表示特定JVM 允许的最大堆大小 错,因为默认的最大堆大小可能小于128m 更好,因为初始大小等于或大于最大值 在此处阅读更多信息http://javahowto.blogspot.com/2006

  • 本文向大家介绍在C#中如何找到StringBuilder的MaxCapacity(最大容量)?,包括了在C#中如何找到StringBuilder的MaxCapacity(最大容量)?的使用技巧和注意事项,需要的朋友参考一下 要找到StringBuilder的MaxCapacity,代码如下- 示例 输出结果 这将产生以下输出- 示例 让我们看另一个例子- 输出结果 这将产生以下输出-

  • 问题内容: 我应该传递什么值来为N个项目创建有效的/ 基于结构的结构? 在中,有效数字为N(N已假定未来增长)。a的参数应该是什么?((int)(N * 0.75d),0.75d)?更多?减?更改负载系数有什么影响? 问题答案: 关于负载因子,我将简单引用HashMap javadoc : 通常,默认负载因子(.75)在时间和空间成本之间提供了很好的折衷。较高的值会减少空间开销,但会增加查找成本(

  • 问题内容: 考虑以下示例代码: 初始化时的初始容量为7,然后下一行尝试将字符串“ Hello”添加到位置5。这将引发IndexOutOfBoundsException: 线程“主”中的异常java.lang.IndexOutOfBoundsException:索引:5,大小:0 我查看了有关ArrayList的“初始容量”的含义的问题。我知道这个特定的构造函数正在为7个String元素分配空间,如

  • 我想了解各种情况下类实例的初始化 在JLS-7第12.5节中,没有提到如何以及何时初始化最终实例变量?如果实例变量被声明为final,是否有人能给我一点参考来理解其行为? 给出的输出如下 在哪里作为 是否将输出作为