torutkのブログ

ソフトウェア・エンジニアのブログ

Planet JDK

Java.netの中にあるJava SE開発キットのコミュニティです。Mustangの話題ほか開発メンバーらの情報発信もあります。
http://planetjdk.org/

今月のメモ

JNIにおけるC/C++コードのコンパイル条件(使用すべきコンパイルオプション)

http://weblogs.java.net/blog/kellyohair/archive/2006/01/compilation_of.html

  • xarch=pentiumPentium命令セットを使用する
  • KPIC :再配置可能なコードを生成する(共有オブジェクト形式)
  • mt :マルチスレッド使用
  • xregs=no%frameptr:(デフォルト)EBPレジスタを未割当呼出先保存に使用しない
  • features=no%except:C++例外を使用しないならこれを適用
  • DCC_NOEX :C++例外を使用しないならこれを適用
  • errwarn=%all :クリーンなコードを書くならこのオプションはお薦め

C++ランタイムライブラリ(libCrun,libCstd)を静的にリンクしないこと

/Op :浮動小数点演算を精度よく行う
/O1または/O2 :最適化するなら/O1が安全、/O2はやや安全
/WX :クリーンなコードのために警告は最大限に出す
/opt:REF /incremental:no :
/MD :

どうして1つの万能GCに統一しないのか

http://www.city.kawasaki.jp/88/88bunka/home/top/stop/zukan/z0036.htm
現在JDKには3種類のGCがある(訳はいい加減)

  1. 並列(parallel)コレクタ
  2. 低停止時間(low pause)コレクタ
  3. 直列(serial)コレクタ

CPUが1個の計算機では、1.のコレクタはオーバーヘッドとなり、3.より低速となる。
CPUが2個でヒープが少ないときは、1.と3.はほぼ等速、CPUが2個でヒープが大きければ1.の方が効率がよい。

1.&3.と2.とは若い世代のコレクタは同じ方式だが古い世代のコレクタ方式が異なる。
2.は、生きているオブジェクトは移動(compaction)しない。代わりに空きメモリリストでヒープを管理している。そのため、アプリケーションを実行しながらかなりのコレクタ処理ができるため、GCによる停止時間は短くなるが、性能は劣化する。
小さなヒープ(10MB程度)では2.と3.とではほとんど変わらない(2.が10%遅い)。
2.はヒープの断片化が進むという問題がある。