을하는 방법을 변경
public class a
{
public static void main(String[] args)
{
for (int i = 0; i < 100000; i++)
f(i);
}
public static void f(Integer i)
{
System.out.println(i);
}
}
을하고 모양이 어떻게되는지 확인 javac a.java && javap -c a
를 호출 한 후, 당신은
Compiled from "a.java"
public class a {
public a();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iload_1
3: ldc #2 // int 100000
5: if_icmpge 21
8: iload_1
9: invokestatic #3 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
12: invokestatic #4 // Method f:(Ljava/lang/Integer;)V
15: iinc 1, 1
18: goto 2
21: return
public static void f(java.lang.Integer);
Code:
0: getstatic #5 // Field java/lang/System.out:Ljava/io/PrintStream;
3: aload_0
4: invokevirtual #6 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
7: return
}
거야이 바이트 코드는 Integer.valueOf()
이 (main 9:
)라고되고 있음, 따라서 더 최적화 탁을 우리에게 보여줍니다 이 경우에는 컴파일 레벨에 배치됩니다. 그러나 @Tim B가 지적한 것처럼 JVM
내부에서 일어나는 일은 예측할 수없는 또 다른 문제입니다. 최악의 시나리오를 가정하는 것이 가장 좋습니다. JVM은이를 최적화하지 않습니다.
글쎄, 내 기술 인터뷰 중 하나에 질문이 있는데 그 질문을받은 사람이 오히려 구체적인 대답을 기대하고 있었다. 우리는 HotSpot JVM에 대해 이야기하고있었습니다. 나는 당신의 요점을 이해하고 그것에 동의합니다. – Sebastian