【发布时间】:2015-02-11 10:43:12
【问题描述】:
在我的一门课程中说SimpleDate,我需要一些像DateFormat 这样的对象,这些对象可能会在各种情况下大量使用。出于这个原因,我想让它们成为静态的。
但是,当我们没有任何 SimpleDate 对象的实例时,我还希望在需要时对这些对象进行垃圾回收。静态声明不会允许这种情况发生。
所以基本上我想要类似的东西
private weakstatic DateFormat df = DateFormat.getInstance();
如果声明类的对象不再存在,则此DateFormat 实例应该有资格进行垃圾回收。此外,每当创建声明类的任何新实例时,都应重新初始化它。这样我们可以避免重复使用的对象的重新创建,但也可以在不再需要它们时释放内存。
我知道使用 WeakReferences 应该是可能的。但是,我想不出办法。
编辑: DateFormat 在这里可能是错误的候选者,因为它不是线程安全的。但它应该像声明它们一样是线程安全的。
我们的想法是,我们经常将变量设置为静态变量,以便跨实例使用。这些变量永远存在,直到应用程序终止。因此,如果您只是触摸一个类,它的静态变量将永远保留在内存中。
【问题讨论】:
-
这是一个坏主意,原因有很多,尤其是因为
SimpleDateFormat不是线程安全的,因此如果没有某种形式的同步,就无法在线程之间安全地共享。其次,这不是弱引用的工作原理,第三,您是否有数据证明您的DateFormat实例导致了内存问题? -
添加到 biziclop 写的关于线程(非)安全的内容,如果您使用的是
SImpleDateFormat,请查看ThreadLocal。 -
谢谢。也许 DateFormat 是一个错误的候选人。但它应该和声明它们一样安全。这个想法是我们经常将变量设置为静态变量,以便跨实例使用。这些变量会一直存在,直到应用程序终止。
-
@vikingsteve ThreadLocal 看起来像我正在寻找的东西。将调查并通知您。
-
整个问题听起来像是一场毫无意义的微优化的大规模练习。保留哪些对象如此昂贵以至于您会注意到开销?