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

Kir*_*han 4 java garbage-collection jvm

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

class Test{

public void fn(){
    String METHOD_NAME = "fn";
    ...
    sysout("In " + METHOD_NAME);
}
}
Run Code Online (Sandbox Code Playgroud)

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

  1. 每次调用fn()时,是否会创建变量METHOD_NAME?
  2. JVM是否会进行一些优化,以便变量METHOD_NAME不被垃圾收集并在下次调用fn()时重用?
  3. 如果我将变量设为公共静态最终结果会有性能提升吗?
    (实际上有很多这样的功能我想知道它是否值得改变所有这些功能)

(我猜字符串池在这里扮演一些角色)

谢谢,Kiran Mohan

Joa*_*uer 6

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

(即String对象)"fn"不会被重建,但将来自字符串常量池.

但是,表达式"In " + METHOD_NAME将重新计算并导致String每次都创建一个新对象,因为它不是编译时常量表达式.

如果METHOD_NAME在哪里static final,则该表达式也将是编译时常量,因此将来自常量池.