Java 使用更少内存的String.format或+/StringBuilder?

Java 使用更少内存的String.format或+/StringBuilder?,java,string,performance,Java,String,Performance,我已经搜索了一段时间了,我所能找到的只是字符串的速度和一两次错误的内存基准测试 我的情况是,我们的应用程序中有大量日志消息,我们想知道使用String.format与+与StringBuilder相比,是否有任何可测量的内存优势 我有一个坚实的掌握测量时间,每一个这些是有很多这样的帖子 谁能告诉我哪一个更能降低内存消耗 示例: if(LOG.isDebugEnabled()) LOG.debug(String.format("Invoice id = %s is waiting for proc

我已经搜索了一段时间了,我所能找到的只是字符串的速度和一两次错误的内存基准测试

我的情况是,我们的应用程序中有大量日志消息,我们想知道使用String.format与
+
与StringBuilder相比,是否有任何可测量的内存优势

我有一个坚实的掌握测量时间,每一个这些是有很多这样的帖子

谁能告诉我哪一个更能降低内存消耗

示例:

if(LOG.isDebugEnabled()) LOG.debug(String.format("Invoice id = %s is waiting for processing", invoice.getId()));

由于
String.format()
更为复杂,因为它支持格式序列和数据类型(%s,%d等),因此预计性能会更高,内存也会更昂贵。不过,我认为这可能只对非常长的字符串有意义。

我认为String.format将使用更少的内存。 使用StringBuilder时,需要创建一个新的生成器对象,然后将字符串附加到该对象。在我看来,对象的创建和对它的常量引用(通过append或类似方法)似乎比使用string.format返回直接字符串更占用内存

StringBuilder在创建最终字符串之前使用临时对象。 String.format似乎是一种更直接的方式,因此内存占用更少。 此外,StringBuilder在初始化时要求特定的大小(否则它将默认为某个值)。 您可以比较StringBuilder对象与普通旧字符串对象的默认分配内存值

您可以使用要构建的大量字符串数据集测试这两个选项,并评估每种方法所需的时间


希望这有帮助。

查看
String.format
的源代码,了解它是如何在内部注入对象的。您确定内存是您的问题吗?请看一看SLF4J,它没有为未标记的级别消息构建日志字符串。对于日志记录,您不希望使用的内存会立即被垃圾回收吗?@ArneBurmeister我们拥有的每一条日志行都以.isDebugEnabled()开头。您只是在连接普通字符串吗?或者是否存在任何格式/转换问题?