在我正在维护的项目中,我发现了一个java类,它的方法"fn“类似于下面所示的方法。
class Test{
public void fn(){
String METHOD_NAME = "fn";
...
sysout("In " + METHOD_NAME);
}
}该程序无限期运行,方法'fn‘被称为连续和非常高的频率。问题是
(实际上有这么多这样的函数,我想知道是否值得全部修改)
(我想字符串池在这里起到了一定的作用)
谢谢,Kiran Mohan
发布于 2011-04-07 08:11:31
是的,每次输入方法时都会创建变量 METHOD_NAME,但是这是一个非常非常便宜的操作(实际上,创建2个变量与创建1一样昂贵)。
值(即String对象) "fn"将重新创建而不是,但将来自常量字符串池。
但是,表达式"In " + METHOD_NAME将被重新计算,并导致每次创建一个新的String对象,因为它不是compile time constant expression。
如果METHOD_NAME在其中使用static final,那么该表达式也将是一个编译时间常数,因此将来自常量池。
发布于 2011-04-07 08:08:41
变量不是垃圾收集的-对象是垃圾。
"fn“是一个字符串文本,因此它将被嵌入。它不会被垃圾收集(至少在ClassLoader还活着的时候是这样;不确定每个CL有一个实习生池,还是整个JVM有一个实习生池,但这可能无关紧要),而且每次调用都会使用相同的字符串对象。
如果您将其设置为公共静态最终版本,则肯定会有改进,因为连接可以由编译器完成,而不是在执行时完成。
如果在方法中(即仍然作为局部变量)将其确定为最终值,则可能会产生相同的效果--我不确定。
发布于 2011-04-07 08:06:43
“新军”将被拘留。因此,同一个对象将被一次又一次地使用。
在最坏的情况下,您可以将其替换为:
String METHOD_NAME = "fn".intern();虽然我觉得没必要。
公开的静态决赛是好的。
https://stackoverflow.com/questions/5577790
复制相似问题