gpt4 book ai didi

java 垃圾回收和临时对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:25:42 24 4
gpt4 key购买 nike

我的职业是 C++ 开发人员,但最近我一直在做一些 Java。我正在从事的这个项目是由一位早已离开的开发人员完成的,我一直在他通过做奇怪的事情来解决垃圾收集的地方找到一些东西。

案例和要点他实现了自己的字符串类以避免 GC 减慢

应用程序的这一部分采用大型二进制文件格式并将其导出为 csv。这意味着为文件中的每一行构建一个字符串(百万)。为了避免那些临时的字符串对象,他制作了一个字符串类,其中只有一个他重用的大字节数组。

/**
HACK
A Quick and Dirty string builder implementation optimized for GC.
Using String.format causes the application grind to a halt when
more than a couple of string operations are performed due to the number of
temporary objects allocated while formatting strings for drawing or logging.
*/

这真的有用吗?这真的需要吗?这比在循环外声明一个 String 对象并在循环内设置它更好吗?

该应用程序还有一个包含 double 值的 HashMap 。映射中的键是相当静态的,但值经常变化。由于害怕 GC on doubles,他创建了一个 myDouble 类作为 hashmap 的值

/**
* This is a Mutable Double Wrapper class created to avoid GC issues
*
*/
public class MyDouble implements Serializable {
/**
*
*/
private static final long serialVersionUID = C.SERIAL_VERSION_UID;
public double d;

public MyDouble(double d) {
this.d = d;
}
}

这太疯狂了,完全没有必要……对吧?

最佳答案

的确,字符串连接可能是 Java 中的瓶颈,因为 String 是不可变的。这意味着每次连接都会创建一个新的 String,除非匹配的 String 之前已创建并因此位于字符串池中(请参阅 string interning )。无论哪种方式,它肯定会导致问题。

然而,您的前任并不是第一个遇到这种情况的人,处理在 Java 中连接多个 String 的需要的标准方法是使用 StringBuilder .

double(或任何与此相关的原语)用作局部变量时,它会保留在堆栈中,并且它占用的内存会随堆栈帧一起释放(不确定它们是否重新受制于 GC 或在运行时由 JVM 处理)。但是,如果 double 是对象上的字段,则它存储在堆中,并且将在收集包含它的对象时被收集。

在没有看到如何使用 double 值的情况下,很难确定,但很可能是 Map 的使用增加了 GC 负载。

总而言之,是的,恕我直言,这肯定是,正如您所说的“疯狂且完全没有必要”。这些过早的优化只会使代码库复杂化,使其更容易出现错误,并使 future 的维护更加困难。黄金法则实际上应该始终是,构建最简单有效的东西,对其进行分析,然后进行优化。

关于java 垃圾回收和临时对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21044194/

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