2014年7月16日 星期三

Ubuntu gnome-panel設定方式與注意事項

Ubuntu從11.10後續的新版的UI都改用Unity。如果不喜歡Unity,可以自行安裝gnome-panel與gnome-session來調整。但是後來新版的gnome-panel的設定方式與原本有些差異:
  • 設定:新版gnome-panel要設定的話,是不能直接在上頭按右鍵叫出選單的。必須按住鍵盤的Windows鍵+Alt,再按右鍵
  • 如果在增加與設定gnome-applet時,發生問題,可以用:
    dconf reset -f /org/gnome/gnome-panel/    
    來重設整個gnome-panel,不過此方法似乎只適用於Ubuntu 13.04之後
建議設定完畢後重新登入或是使用killall gnome-panel來重啟gnome-panel

2014年7月8日 星期二

JVM參數調教

官方的JDK裡的JVM已經越來越成熟,效能也越來越好,但是還是有可調教的空間。可調教的參數也跟著JDK演進而有所不同。根據網路上一些文章,大概比較普遍的調教參數有以下幾個:
  • -XX:+AggressiveOpts
  • -XX:+UseCompressedOops
  • -XX:+DoEscapeAnalysis
  • -XX:+UseBiasedLocking
  • -XX:+EliminateLocks
其中,第一個參數是用來調整一些預設的效能參數,啟用之後相當於調整了AutoBoxCacheMax, BiasedLockingStartupDelay, EliminateAutoBox, OptimizeFill, OptimizeStringComcat這幾個參數。第二個參數則是使用在64bit環境中,可以降低JVM在64-bit環境裡的記憶體使用量,並提升效能。後三個參數則是用來減少lock的使用情況,以提升效能。

另外還有一些參數也可能可以改善效能,但是因為沒有太多實務案例,所以無法100%肯定。
  • -XX:MaxGCPauseMillis:設定GC的暫停時間目標值,此數值可限制JVM的GC造成的暫停時間,但是無法精準限制。降低此數值可以減少JVM的延遲,但是可能會造成過多的GC與Throughput下降。
  • -XX:+UseG1GC:啟用JDK7以後新增加的G1GC功能,據說效果比原本的CMS好
  • -XX:+UseStringCache:就名稱來看應該是跟String有關的,但是實際效果不明,有人提過可搭配-XX:+PrintStringTableStatistics 和 -XX:StringTableSize=來調整StringCache大小
  • -XX:CompileThreshold=n:設定method在多少次呼叫後,轉換為機械碼。此數值越大,代表有越多profile資訊來轉換,可轉換出越高效率的機械碼。越低的話,代表越快進行轉換。JVM預設如果是client模式為1000,server模式為10000
  • -XX:+TieredCompilation:使用多層式的機械碼轉換方式。啟用此設定,可改設原本一次性轉換後的機械碼效率。在server模式預設啟用。
  • -XX:+UseLargePages:啟用Large Page的記憶體存取能力,需要OS支援。
  • -XX:MaxInlineSize=n:設定在n byte內的method會被用inline方式編譯,此數值越大,越能改善執行效率。但過大的數值會造成JVM的記憶體佔用過大。
  • -XX:ReservedCodeCacheSize=n:設定預設保留的CodeCache大小。當設定-XX:MaxInlineSize=n較大,或是-XX:CompileThreshold=n較小時,最好可以將此數值加大,否則可能會發生問題。
  • -XX:+UseCodeCacheFlushing:會將CodeCache進行清理,但實際上怎麼清理並不清楚。
  • -XX:+UseFastAccessorMethods, -XX:+UseFastEmptyMethods, -XX:+UseFastJNIAccessors:加速這些method的呼叫與執行
  • -Dawt.nativeDoubleBuffering=true:在GUI模式下,使用Double buffering來改善繪製效能
  • -Djava.net.preferIPv4Stack=true:讓JVM優先使用IPv4。可避免部分因IPv6造成的問題,以及改善連線效能。
  • -Djdk.map.althashing.threshold=n:啟用JDk7u6的新Hash function演算法,可改進效能。n值是指當Set或Map的大小達到時,才使用新演算法。若n=0,則表示強制使用新演算法。注意:新演算法可能造成在iterator順序上的改變(對LinkedHashSet與LinkedHashMap不造成影響)。
  • -XX:SoftRefLRUPolicyMSPerMB=n:指Soft Reference物件的生命週期。預設為1000ms,此數值設定越小,可加快Soft Reference物件被回收的速度。
以上是目前大略整理出的一些參數。上述參數的預設值可能因版本不同而有所不同。可以下列命令列出目前JVM支援的參數與預設值:
java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version
或是
java -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+PrintFlagsFinal -version (包含實驗性功能)
可另用pipeline將結果輸出至檔案。

以下是一些參考資料: