Adopt Open JDK官方文檔(十)
編譯過程性能優化的命令行參數
AdoptOpenJDK wiki的一個鏈接,提供了幾個怎麼提高編譯過程性能的例子。
編譯 jcov
項目首頁(項目信息, 編譯指南, 其他…)
源代碼:
https://hg.openjdk.java.net/code-tools/jcov
快速編譯指南
$ 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
-
asm
可以從https://download.forge.ow2.org/asm/asm-5.0.1-bin.zip下載 -
jtharness
可以從https://adopt-openjdk.ci.cloudbees.com/job/jtharness/lastSuccessfulBuild/artifact/下載
當項目主頁有編譯指南時,請參考項目主頁,同時上麵的編譯編譯指導會被刪掉,避免重複。
請參考OpenJDK代碼覆蓋率.
編譯 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