閱讀804 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Adopt Open JDK官方文檔(十)

編譯過程性能優化的命令行參數

AdoptOpenJDK wiki的一個鏈接,提供了幾個怎麼提高編譯過程性能的例子。

編譯 jcov

項目首頁(項目信息, 編譯指南, 其他…)

https://wiki.openjdk.java.net/display/CodeTools/jcov

源代碼:

https://hg.openjdk.java.net/code-tools/jcov

Adopt OpenJDK持續集成網站下載。

 

快速編譯指南

$ hg clone https://hg.openjdk.java.net/code-tools/jcov
$ cd jcov/build
$ ant clean
$ ant -v -f build.xml -Dasmjar5=/path/to/asm-all-5.0.1.jar -Djavatestjar=/path/to/javatest.jar

當項目主頁有編譯指南時,請參考項目主頁,同時上麵的編譯編譯指導會被刪掉,避免重複。

請參考OpenJDK代碼覆蓋率.

編譯 sigtest

項目主頁(項目信息, 編譯指南, 其他…)

https://wiki.openjdk.java.net/display/CodeTools/sigtest

源代碼:

https://hg.openjdk.java.net/code-tools/sigtest

快速編譯指南

$ svn checkout https://svn.java.net/svn/sigtest~svn/trunk
$ cd code/build
$ ant build -Djdk5.home=/path/to/jdk1.5.latest \
-Djdk8.home=/path/to/jdk8.latest \
-Dmvn2.exe=/path/to/latest/bin/mvn

當項目主頁有編譯指南時,請參考項目主頁,同時上麵的編譯編譯指導會被刪掉,避免重複。

OpenJDK代碼覆蓋率

Adopt OpenJDK的代碼覆蓋率指南code-coverage.

現存代碼測試覆蓋率報告 (OpenJDK8 和 OpenJDK9)

我們最近為運行在Adopt OpenJDK 編譯集群上的 OpenJDK8和 OpenJDK9持續集成增加了代碼測試覆蓋率報告。自動為OpenJDK8 和OpenJDK9發布[jcov 報告].

運行OpenJDK9的代碼測試覆蓋率測試

提示:

  • 同樣的步驟也適用於’OpenJDK8′
  • 這些步驟僅用於生成’jdk’的測試覆蓋率報告
  • 我們沒有能夠成功的生成’langtools’的測試覆蓋率報告
  • 保證最新的jdk映像在OpenJDK9編譯生成目錄 (參見 編譯你自己的OpenJDK).
  • 安裝 jtreg with the jcov, 參見JTReg的使用.
  • 把這些exports添加到你的.bash_xxx配置文件中:
export SOURCE_CODE=/home/<username>/workspace/jdk9/
export JTREG_INSTALL=/home/<username>/workspace/jtreg
export JT_HOME=$JTREG_INSTALL
export JTREG_HOME=$JTREG_INSTALL
export PRODUCT_HOME=$SOURCE_CODE/build/linux-x86_64-normal-server-release/images/jdk
export JPRT_JTREG_HOME=${JT_HOME}
export JPRT_JAVA_HOME=${PRODUCT_HOME}
export JTREG_TIMEOUT_FACTOR=5
export CONCURRENCY=8
$ cd $SOURCES/jdk9/jdk/test
  • 編輯 Makefile 文件,在 # Make sure jtreg exists行之前增加如下行:
jdkroot=<你的jdk9代碼路徑, 參見上麵>

JTREG_TEST_OPTIONS += -jcov/classes:$(jdkroot)/build/linux-x86_64-normal-server-release/jdk/modules/java.base
JTREG_TEST_OPTIONS += -jcov/source:$(jdkroot)/jdk/src/java.base/share/classes
JTREG_TEST_OPTIONS += -jcov/include:*

debug 模式執行測試

$ cd ..
$ make test LOG=debug

打開生成的測試覆蓋率報告

一旦結束了, 進入如下路徑查看報告:

$ cd $SOURCES/jdk9/build/linux-x86_64-normal-server-release/testoutput/jdk_core/JTreport/jcov/
$ open index.html

這會花費幾個小時,具體時間取決於你的係統性能和可用資源。

請參考jcov的編譯。

深入 hotspot 的東西

hotspot 源碼目錄中的GC選項

../hotspot/src/share/vm/gcimplementation/g1/g1globals.hpp

../hotspot/src/share/vm/runtime/globals.hpp

HotSpot 命令行選項 – PrintAssembly

HotSpot 代碼片段 – 由於不同GC選項引起的各種分支選擇

GC類型 老年代 老年代
SerialGC (-XX:+UseSerialGC) 串行 串行
ParallGC (-XX:+UseParallelGC) 並行 串行
Parallel Compacting(-XX:+UseParallelOldGC) 並行 並行
Concurrent Mark Sweep GC (-XX:+UseConcMarkSweepGC) 並行 並發-標記-清除

參考

來自./hotspot/src/share/vm/memory/universe.cpp的代碼片段

Universe::initialize_heap()
if (UseParallelGC) {
    #ifndef SERIALGC
    Universe::_collectedHeap = new ParallelScavengeHeap();
    #else // SERIALGC
        fatal("UseParallelGC not supported in this VM.");
    #endif // SERIALGC
} else if (UseG1GC) {
    #ifndef SERIALGC
    G1CollectorPolicy* g1p = new G1CollectorPolicy();
    G1CollectedHeap* g1h = new G1CollectedHeap(g1p);
    Universe::_collectedHeap = g1h;
    #else // SERIALGC
        fatal("UseG1GC not supported in java kernel vm.");
    #endif // SERIALGC
} else {
    GenCollectorPolicy* gc_policy;
    if (UseSerialGC) {
        gc_policy = new MarkSweepPolicy();
    } else if (UseConcMarkSweepGC) {
        #ifndef SERIALGC
        if (UseAdaptiveSizePolicy) {
            gc_policy = new ASConcurrentMarkSweepPolicy();
        } else {
            gc_policy = new ConcurrentMarkSweepPolicy();
        }
        #else // SERIALGC
            fatal("UseConcMarkSweepGC not supported in this VM.");
        #endif // SERIALGC
    } else { // default old generation
        gc_policy = new MarkSweepPolicy();
    }
    Universe::_collectedHeap = new GenCollectedHeap(gc_policy);
}

打開串行GC – 隻支持串行GC的平台?

.
.
.
Universe::initialize_heap()
if (UseParallelGC) {
        fatal("UseParallelGC not supported in this VM.");
} else if (UseG1GC) {
        fatal("UseG1GC not supported in java kernel vm.");
} else {
    GenCollectorPolicy* gc_policy;
    if (UseSerialGC) {
        gc_policy = new MarkSweepPolicy();
    } else if (UseConcMarkSweepGC) {
            fatal("UseConcMarkSweepGC not supported in this VM.");
    } else { // default old generation
        gc_policy = new MarkSweepPolicy();
    }
    Universe::_collectedHeap = new GenCollectedHeap(gc_policy);
}
.
.
.

關閉串行GC – 支持並行和串行兩種GC方式的平台?

.
.
.
Universe::initialize_heap()

if (UseParallelGC) {
    Universe::_collectedHeap = new ParallelScavengeHeap();
} else if (UseG1GC) {
    G1CollectorPolicy* g1p = new G1CollectorPolicy();
    G1CollectedHeap* g1h = new G1CollectedHeap(g1p);
    Universe::_collectedHeap = g1h;
} else {
    GenCollectorPolicy* gc_policy;

    if (UseSerialGC) {
        gc_policy = new MarkSweepPolicy();
    } else if (UseConcMarkSweepGC) {
        if (UseAdaptiveSizePolicy) {
            gc_policy = new ASConcurrentMarkSweepPolicy();
        } else {
            gc_policy = new ConcurrentMarkSweepPolicy();
        }
    } else { // default old generation
        gc_policy = new MarkSweepPolicy();
    }

    Universe::_collectedHeap = new GenCollectedHeap(gc_policy);
}
.

編譯器相關

OptViewer工具,參考這個郵件

修改 java.c,使用 Eclipse運行 hotspot

[可選,但很有意思的一個挑戰] 請參考這些指南。

修改 java.c,使用命令行運行 hotspot

[可選,但很有意思的一個挑戰]

和修改java.c並在 Eclipse運行的挑戰類似,但是使用需要使用命令行和一個簡單的編輯器來完成這一挑戰。

敬請期待

  • Nashorn的一些好東西
  • Lambda進階
  • OpenJDK(JDK)代碼測試覆蓋率工具(兩個)
  • OpenJDK build warnings tool (which are currently suppressed in the build process)…
  • OpenJDK 編譯警告工具(當前在編譯過程中被禁用)
  • 使用 jitWatch觀察 HotSpot JVM JIT編譯過程
  • 運行在 JVM 上的Smalltalk
  • 運行在 JVM 上的Lisp

Hotspot JVM 任務: 附加任務 (中級和高級)

  • 向 java.c 中增加 debug 級別的 log信息,重新編譯 gamma,運行示例程序或者任何其他基於 java 的程序。
  • 重構 java.c,插入 debug 級別的 Log細膩,重新編譯 gamma,運行示例程序或者任何其他基於 java 的程序。
  • 完成以上兩步後,加載一個低延遲,GC 調優過的 java 程序,開啟 gc log,檢查 gc log,看性能是否有變化(性能調優相關的東西)。
  • 在 javac 中實現 ?:運算符(學習怎麼修改 javac 的好方法),編譯一個java 程序。
  • 體味GC 的樂趣:使用自定義的垃圾收集器替換已有的。重新激活代碼庫中的 PermGen 或者 iCMS 。在現在 HotSpot 版本中增加任意你想做的修改。
  • 修改 javac 使他能夠解析和編譯新的語言特性,或者讓它能夠兼容其他基於 JVM 的方言、甚至於更老的程序語言,例如 C、匯編、Scheme 或Smalltalk
  • 使用自定義類加載器替換內置內加載器。
  • 轉載自 並發編程網 - ifeve.com

最後更新:2017-05-22 13:31:45

  上一篇:go  《Java並發編程從入門到精通》顯示鎖Lock和ReentrantLock
  下一篇:go  Java8簡明指南