Предполагая, что jvm идентифицирует метод b.foo () как горячий, он попытается встроить его?Потому что, если это так, инструкция вызова B.bar () будет встроена в метод A.main, что запрещено, потому что bar является приватным.Что делает jvm в этих ситуациях?
Также приветствуется любая документация с более подробной информацией.Спасибо
public class A {
public static void main(String[] args)
{
B b = new B();
for (int i=0; i<99999; i++)
b.foo();
}
}
class B {
public void foo() {
bar();
}
private void bar() { // do something. (is small method)
}
}
РЕДАКТИРОВАТЬ: я спрашиваю, потому что, когда я пытаюсь выполнить эту оптимизацию самостоятельно (в байт-код), я получаю ошибку проверки, которая имеет смысл:
java.lang.VerifyError:Неверная специальная инструкция: текущий класс не может быть назначен ссылочному классу
EDIT2:
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=5, args_size=1
0: new #13 // class B
3: dup
4: invokespecial #14 // Method B."<init>":()V
7: astore_1
8: iconst_0
9: istore_2
10: iload_2
11: ldc #15 // int 99999
13: if_icmpge 30
16: aload_1
17: astore 4
19: aload 4
21: invokespecial #18 // Method B.bar:()V // VERIFY ERROR HERE
24: iinc 2, 1
27: goto 10
30: return
StackMapTable: number_of_entries = 2
frame_type = 253 /* append */
offset_delta = 10
locals = [ class B, int ]
frame_type = 19 /* same */
LineNumberTable:
line 5: 0
line 6: 8
line 7: 16
line 14: 19
line 15: 24
line 6: 24
line 8: 30