首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方法中字符串变量的jvm优化

方法中字符串变量的jvm优化
EN

Stack Overflow用户
提问于 2011-04-07 08:01:47
回答 7查看 350关注 0票数 4

在我正在维护的项目中,我发现了一个java类,它的方法"fn“类似于下面所示的方法。

代码语言:javascript
复制
class Test{

public void fn(){
    String METHOD_NAME = "fn";
    ...
    sysout("In " + METHOD_NAME);
}
}

该程序无限期运行,方法'fn‘被称为连续和非常高的频率。问题是

  1. 会在每次调用fn()时创建变量METHOD_NAME吗? JVM是否会进行一些优化,以便在下次调用fn()时不会垃圾收集和重用变量METHOD_NAME ?如果我将变量设置为公共静态终结,那么
  2. 会提高性能吗?

(实际上有这么多这样的函数,我想知道是否值得全部修改)

(我想字符串池在这里起到了一定的作用)

谢谢,Kiran Mohan

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-04-07 08:11:31

是的,每次输入方法时都会创建变量 METHOD_NAME,但是这是一个非常非常便宜的操作(实际上,创建2个变量与创建1一样昂贵)。

(即String对象) "fn"将重新创建而不是,但将来自常量字符串池。

但是,表达式"In " + METHOD_NAME将被重新计算,并导致每次创建一个新的String对象,因为它不是compile time constant expression

如果METHOD_NAME在其中使用static final,那么该表达式也将是一个编译时间常数,因此将来自常量池。

票数 6
EN

Stack Overflow用户

发布于 2011-04-07 08:08:41

变量不是垃圾收集的-对象是垃圾。

"fn“是一个字符串文本,因此它将被嵌入。它不会被垃圾收集(至少在ClassLoader还活着的时候是这样;不确定每个CL有一个实习生池,还是整个JVM有一个实习生池,但这可能无关紧要),而且每次调用都会使用相同的字符串对象。

如果您将其设置为公共静态最终版本,则肯定会有改进,因为连接可以由编译器完成,而不是在执行时完成。

如果在方法中(即仍然作为局部变量)将其确定为最终值,则可能会产生相同的效果--我不确定。

票数 3
EN

Stack Overflow用户

发布于 2011-04-07 08:06:43

“新军”将被拘留。因此,同一个对象将被一次又一次地使用。

在最坏的情况下,您可以将其替换为:

代码语言:javascript
复制
String METHOD_NAME = "fn".intern();

虽然我觉得没必要。

公开的静态决赛是好的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5577790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档