JVM的幾點性能優化(2)

發表于:2014-05-27來源:不詳作者:不詳點擊數: 標簽:性能優化
方法內聯是編譯器一個常見的優化,編譯器將方法調用替換成實際調用的代碼,以避免一次調用的開銷。不過當碰到虛方法調用(動態分發)的話情況就需要

  方法內聯是編譯器一個常見的優化,編譯器將方法調用替換成實際調用的代碼,以避免一次調用的開銷。不過當碰到虛方法調用(動態分發)的話情況就需要點小技巧了。

  先看下這段代碼 :

  public class Main {

  public static void perform(Song s) {

  s.sing();

  }

  }

  public interface Song { void sing(); }

  public class GangnamStyle implements Song {

  @Override

  public void sing() {

  System.out.println("Oppan gangnam style!");

  }

  }

  public class Baby implements Song {

  @Override

  public void sing() {

  System.out.println("And I was like baby, baby, baby, oh");

  }

  }

  perform方法可能會被調用了無數次,每次都會調用sing方法。方法調用的開銷當然是很大的,尤其像這種,因為它需要根據運行時s的類型來動態選擇具體執行的代碼。在這里,方法內聯看真來像是遙不可及的夢想,對吧?

  當然不是了。在多次執行perform方法后,編譯器會根據它收集的數據發現,95%的調用對象都是GangnamStyle實例。這樣的話,JIT編譯器會很樂觀將虛方法的調用優化掉。也就是說,編譯器會直接生成本地代碼 ,對應的Java實現大概是這樣的:

  public static void perform(Song s) {

  if (s fastnativeinstanceof GangnamStyle) {

  System.out.println("Oppan gangnam style!");

  } else {

  s.sing();

  }

  }

  由于這個優化取決于運行時信息,它可以優化掉大部分的sing方法調用,盡管這個方法是多態的。

  JIT編譯器還有很多很有意思的技巧,這只是介紹了其中的幾點,讓你能感覺到我們代碼在執行的時候,JVM在底層都做了些什么優化。

  我能幫助JIT做些什么優化嗎

  JIT編譯器是針對一般人的編譯器;它是用來優化正常寫出的代碼的,它會去分析日常標準寫法中的一些模式。不要刻意寫代碼去幫助JIT編譯器進行優化就是對它最好的幫助 ——就正常寫你自己的代碼就好了。

  譯注:JIT還有許多很多意思的優化,這里只是列舉出了幾點。當然了,你也不用太在意它,就像文中最后說的,正常寫好自己的代碼就好了。

原文轉自:http://it.deepinmind.com/jvm/2014/03/28/jvm-performance-magic-tricks.html

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97