1. 程式人生 > 實用技巧 >JVM-JVM是如何執行方法呼叫的

JVM-JVM是如何執行方法呼叫的

例子:

 1 package javap.method;
 2 
 3 
 4 // Run with: java -XX:CompileCommand='dontinline,*.passThroughImmigration' Passenger
 5 public abstract class Passenger {
 6     abstract void passThroughImmigration();
 7 
 8     public static void main(String[] args) {
 9         Passenger a = new ChinesePassenger();
10 Passenger b = new ForeignerPassenger(); 11 long current = System.currentTimeMillis(); 12 for (int i = 1; i <= 2000000000; i++) { // 20億 13 if (i % 100000000 == 0) { // 1億 14 long temp = System.currentTimeMillis(); 15 System.out.println(temp - current);
16 current = temp; 17 } 18 Passenger c = (i < 1000000000) ? a : b; // 10億 19 c.passThroughImmigration(); 20 } 21 } 22 } 23 class ChinesePassenger extends Passenger { 24 @Override void passThroughImmigration() {} 25 } 26 class ForeignerPassenger extends
Passenger { 27 @Override void passThroughImmigration() {} 28 }

java -XX:CompileCommand='dontinline,*.passThroughImmigration' javap.method.Passenger,執行4次,每次結果為1列

 1 263 272 256 260  // a開始
 2 258 277 269 263
 3 247 257 248 294
 4 247 242 249 312
 5 250 241 249 404
 6 242 263 248 468
 7 258 255 242 364
 8 262 243 242 263
 9 252 271 252 279
10 246 258 246 249
11 328 316 296 320  // b開始
12 315 339 293 369
13 345 323 286 761
14 287 314 279 398
15 294 311 290 349
16 303 341 289 367
17 289 345 283 346
18 282 315 278 363
19 288 401 277 416
20 293 388 284 331

java javap.method.Passenger,執行4次,每次結果為1列

 1 116 83  82  115  // a開始
 2 143 134 128 149
 3 122 141 117 141
 4 131 173 124 128
 5 124 149 131 116
 6 120 153 117 117
 7 115 141 114 114
 8 115 125 116 114
 9 114 116 114 135
10 113 112 119 132
11 158 143 144 168 // b開始
12 140 141 142 156
13 148 146 145 142
14 156 153 144 144
15 142 140 141 144
16 145 198 307 147
17 191 216 236 156
18 157 206 163 144
19 150 199 152 145
20 147 191 162 144