gpt4 book ai didi

java - 字符串连接和内存泄漏

转载 作者:行者123 更新时间:2023-12-01 08:06:52 26 4
gpt4 key购买 nike

我们几乎在所有地方都使用连接字符串来进行日志记录。
例如:catch (Exception e) {
logger.error("setUserSession()"+ e.getMessage());
}
但我们怀疑这些语句是否会因为字符串突变而导致内存泄漏。有些人建议使用字符串生成器。但我从像StringBuilder vs String concatenation in toString() in Java这样的讨论中了解到的Java 编译器将使用字符串生成器转换字符串连接。

为了测试这一点,我尝试反编译以下java代码(使用JD-GUI);

    logger.error("string1" + "string2");
logger.error("setUserSession()" + e.getMessage());

反编译器生成以下代码;

    logger.error("string1string2");
logger.error("setUserSession()" + e.getMessage());

但我期待第二个语句中的字符串构建器,例如;

logger.error(new StringBuilder().append("setUserSession()").append(e.getMessage());

所以我这里有两个疑问:

  1. 字符串连接实际上会造成这么多内存泄漏吗?
  2. 或者我是否需要显式使用字符串生成器 -> 将字符串附加到字符串生成器 -> 然后使用字符串生成器删除函数删除字符串生成器?
  3. Java 编译器使用字符串生成器转换简单的字符串连接。 (我们可以使用反编译工具来检查吗?)

最佳答案

  1. 它不会造成内存泄漏。它会产生内存使用量,但垃圾收集器会对其进行整理。
  2. 除非您的字符串连接分布在多个语句中,否则无需显式使用 StringBuilder
  3. 是的。

我认为你对Java有误解。这些对象是 StringObjectMyObject 还是其他对象并不重要。一旦对它的所有强引用都超出了范围,该对象就有资格进行垃圾回收,并且在适当的时候,所使用的内存将被回收。

Java 中泄漏内存的唯一方法是泄漏资源(例如打开流、创建线程等)或意外保留对某些内容的引用(例如将其添加到列表中并且从不将其从列表中删除) )。

关于java - 字符串连接和内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20838998/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com