• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 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

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>