2014年8月30日土曜日

Octaveで行列の各要素に対する計算をしたら warning: product: automatic broadcasting operation applied が出る

Octaveでは、行列の各要素に対して処理を行う場合、以下の用に 「.」を使って表現出来る。

すべての要素に3をかける

> A .* 3

でもこれやると、warning: product: automatic broadcasting operation applied と出るのだ。

以下の、bsxfun を使うと良い。

bsxfun(fun,A,B)

http://www.mathworks.co.jp/jp/help/matlab/ref/bsxfun.html

たとえば A .* 3 を書き直すと


> bsxfun(@times, A, 3)

となる。

2014年8月29日金曜日

Appleのアプリ審査で新しく増えた項目 Unrestricted Web Access

Unrestricted Web Accessは何を意味しているか

登録ページのinformationには、以下の様に記述があります。


Select Yes if your app allows users to
navigate and view web pages, such as
 with an embedded browser.

日本語の navigate と意味合いが異なるらしい(英語レベルの高い方談)。

navigate の主語はあくまで user であって、app では無い。

そのため、ユーザが自主的にWebページを見ることを許可しているか?例えばブラウザーとかね。と聞かれていることになり、WebViewを使っているだけで on にしなければならない項目とは言えない、とのこと。

それでもrejectされるかもしれないけどあしからず。

グラフの可視化 Jung

Jungによるグラフの可視化


グラフ構造を分析・可視化するJavaライブラリ。

実装したAIのアルゴルズムのグラフを可視化するのが目的。

最新版の更新はちょっと古いですが、2.0.1が最新のようです。

Jung は Swingを使います。
Swingコンポーネントは以下の3階層です

トップレベルコンテナ

JFrameなど。メインウィンドウ。

中間コンテナ

JPanelなど。コンポーネントを配置するためのコンテナ、枠組み。

コントロール

コンテナに入れ込む部品


Jungは上記のSwingクラスを継承する形で作られています。

例えば、VisualizationViewer は、JPanel の ContentPane に追加して、コンテナとして使用出来ます。
VisualizationViewer には、Graph を入れた FRLayout を登録して描画します。

Graph にはいろいろなクラスが使えるようですが、SparseMultigraph が手っ取り早く使えます。

play framework for java の環境構築

play framework 2.3.3 for Java の環境を構築する


参考:http://mpon.hatenablog.com/entry/2014/07/20/012053

ハマったので先に書いておくと、windows環境で環境変数USERPROFILEに日本語が入っている場合、コンパイルエラーが発生する。

activator でセットアップしたライブラリは UESRPFORILE 配下 .activator、.ivy2、.sbt に展開され、
template も UESRPFORILE 配下を使うように固定設定されているから、日本語が含まれるとうまくpathが通らないのだ。
template を使わずコマンドラインで動作するminimal プロジェクトならうまく動作するが、素早くWEB開発をしたいなら template を使用したい。

ということでもし USERPROFILE が日本語(2byte文字含む)だった場合は別のアカウントを作るか、playのソースを UESRPFORILE 配下を使用しないように修正してビルドする必要がある。


ここでは、USERPROFILE について問題なかった場合の開発環境手順を追っていく。



ダウンロードしたファイルは展開してから、展開した場所をPATHに追加する。
activator コマンドのある場所が、play の home となり、プロジェクトごとのフォルダなどはここに出来る。


その後、activator.bat を実行する。PATHを追加しなかった場合、activator コマンドを実行した場所にプロジェクトが作成される。


Scalaをはじめとするライブラリやパッケージは、frameworkに含まれているようだが、UESRPFORILEに最新版のライブラリが展開される。



その後、playはコンソールによるプロジェクトの初期化とuiによる初期化が選べる。
以下を実行すると、ローカルにサーバが起動し、ブラウザからUIによってプロジェクトを操作するページが配置される。

※JAVA_HOMEがJava8に設定されていないと、JVMオプションエラーになるので注意。



> activator ui


以下のwarnが表示されるけど、問題無く動作した。

[warn] e.m.m.MimeDetectorRegistry - MimeDetector [eu.medsea.mimeutil.detector.MagicMimeMimeDetector] will not be registered as a MimeDetector with this name is already registered.


UIがまだ操作しやすいとは言えない状況なので、一度停止して、コマンドラインから実行してみよう。


コマンドラインの場合は、以下の様にサンプルプロジェクトを作成出来る。



> activator new [プロジェクト名] [タイプ play-javaでjava、play-scalaでscala]


または



> activator new

だけ入力すると、対話形式でアプリケーションの名前やタイプを決定できる。


コマンドが終わったら、以下で実行が可能。



> cd [作成したアプリケーション名]
> activator run


この後、「Getting org.scala-sbt sbt 0.13.5 ...」からダウンロードが始まる。
依存関係を解決している、とのこと。
参考サイトにも長いと書いてあったが、想像以上に長かった。知らなければ途中でやめるレベルで長い。


以下が出ると完了。



[info] play - Listening for HTTP on /0:0:0:0:0:0:0:0:9000
(Server started, use Ctrl+D to stop and go back to the console...)


ブラウザでlocalhost:9000 にアクセスすると、以下の画面が表示されれば環境構築成功。






コンパイルエラーが発生したら、メッセージに合わせて手順を見直すと良い。


次は scalar for eclipse でIDE設定を行う。

2014年8月25日月曜日

JMeter の リクエスト/seq のコントロールについて

JMeterのテスト回数とRPSのコントロール、こんがらがることがあるのでメモ


  • テストの総回数:「スレッド数」×「ループ回数」
  • 1秒あたりのテスト回数:「テストの総回数」÷「Ramp-Up期間(秒)」

たとえば スレッド数 10 、Ramp-Up期間 10、ループ回数 5 と設定すると、総リクエスト数は 10 * 5 = 50
RPSは 50 / 10 = 5 である。

JMeter で大量のリクエストを投げるときに出る NoHttpRequestResponseException

JMeterで大量のリクエストを投げようとすると、以下の例外が出ることがあります。

Non HTTP response code: org.apache.http.NoHttpResponseException,Non HTTP response message: The target server failed to respond

サーバ側でエラーが出力されないので、おやっと思ったら HttpClient4 のエラーだそうです。HttpClient3 を選択しましょう。

2014年8月24日日曜日

iPhoneアプリ リリース個人的なメモ

iPhoneアプリリリースの個人的なメモです。

結構手順が多いので初めてだと大変な印象でした。

以下のサイトがきれいにまとまっています。

参考サイト:http://dev.classmethod.jp/smartphone/iphone/ios-app-how-to-release/


■iPhoneアプリのリリース


iOS開発ガイド:https://developer.apple.com/jp/devcenter/ios/library/documentation/DevPortalGuide.pdf

○AppleのDeveloperとして必要な手続き


Apple Developerサイト
https://developer.apple.com/jp/

右上にある、MemberCenterリンクからMemberCenterへ移動


目的:リリース用のProvisioningProfileを作成する


ProvisioningProfileとは?
→ アプリケーションがiOSデバイス上で動作可能にする為に必要なリソース。
必要なのは、AppID、証明書、テスト端末のUDIDの3つの情報を関連付けます。
これらが揃ってはじめて、


①Certficateの作成


新しいアプリをリリースするときは、Certificate(証明書)を作成する。

Certificates-All を開くと、いままで作成したCertificateが表示される。
初めてなら、空でしょう。
追加するには右上の「+」ボタンをクリックする。

Certificateにも種類がある。
新しくつくる必要があれば、アプリのリリース用なので、「App Store and Ad Hoc」を選択する。
iOSDistribusionが2つあると選択出来ない。有効期限が切れることを考えて2つまで許可されているのか。


②iOS App IDの作成

アプリケーション固有のIDを作成する。

Description Name は識別しやすいものならなんでもOK

App IDのサフィックスは、ユニークなIDである Bundle ID を設定する。
リリース用にはExplicit App ID を選択し、任意のBundle IDを入力する。
オススメは、ドメインを逆の順番に並べたもの。jp.sprix...


App Serviceは、アプリ内で使用するサービスを選択。GameCenterは必須。
後は、In-App Purchase は未来も考えてつけておいたほうが良い?


③Distribution用のProvisioningProfileの作成

MemberCenterのProvisioningProfilesを選択したら、右上の「+」ボタンをクリックする。

Typeは App Store にする。

App ID が必要。②で作成したアプリ固有のIDを選択する。

Certificateも必要。①で作成(もしくはもともとあったiOS Distribution のCertificateを選択)

最後にProfile Nameを入力して作成完了。


④iTunesコネクトでアプリの詳細情報を登録する。

https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa

左上のAdd New Appボタンをクリックして追加する。

項目内容を列挙する事前に用意したり、考えておくことが必要なものもある。

・Default Language:Japanese
・App Name:<アプリ名>(AppStoreSeoの改善 http://www.slideshare.net/searchmanseo/appstore-seo-13848208 も確認)
 ↑ただし、説明を含めると、リジェクトになる可能性あり。
 説明は Application Description フィールドに入れる。
・SKUNumber:アプリのユニークな番号。AppIDを作成した時に決めた、BundleIDと同一を入れておく。
・BundleID:アプリのユニークなID。通常、パッケージ名と同様の形式。AppIDから選択する。

ここまででcontinue

⑤リリース日、価格の設定


・AvailabilityDate:アプリが利用可能となる日。リリース日を入れる。
・Price Tier:無料 or 有料アプリ
・Discount for Educational Insitutions:教育用に割引するかどうか

ここまででcontinue

⑥紹介ページ情報の設定


・VersionInformation:バージョン
・Copyright:アプリ開発者のコピーライト。企業名入れとく。
・Category:最も近いカテゴリを2つ設定する。
・Rating:アプリのレーティング。Apple Content Descriptions の各項目に該当するかチェックする。
・Made for Kids(Optional):子供向けアプリかどうか?
・Metadata
 Description:アプリの説明文・紹介文。シンプル、わかりやすく。4000文字
 Keywords:キーワードをカンマ区切りで設定
 SupportURL:アプリの紹介ページに表示されるサポートURL。必須。
 MarketingURL:アプリの紹介ページのURL。アプリのMarketing用。(Optional)
 PrivavyPolicyURL:プライバシーポリシーのURL。(Optional)
・ContactInfomation
 App Review Contact Information:レビュー中のやりとりに使用する連絡先
 ReviewNotes:レビュー時の注意時点などを各スペース。アプリテストの注意点。optional(4000文字)
 DemoAccountInformation:デモ用のアカウントとパスワード。アプリにアカウント登録が必要なとき入れる
 AppStoreContactInformation:AppStoreに表示する連絡先情報。
・EULA
 通常適用されるEULA:http://www.apple.com/legal/internet-services/itunes/appstore/dev/stdeula/
・Uploads
 LargeAppIcon:1024x1024pxサイズのアプリアイコン
 3.5-Inch Retina Discplay ScreenShots:3.5インチRetina用スクリーンショット 1~5枚
 4-Inch Retina Discplay ScreenShots:4インチRetina用スクリーンショット 1~5枚
 iPad Screenshots:iPadアプリの場合
 RoutingAppCoverageFile:ナビアプリの場合にカバーするエリアを表示する

ここまでで Save すると登録作業完了。

⑦アップロード準備状態にする

アプリの詳細画面の右上に「Ready to Upload Binary」というボタンがあるのでクリックする。

コンプライアンス系の問い合わせがあるので回答する。

・Export Compliance:SSL通信に関する米国輸出規則EAR の準拠を問われる。
 iOSの暗号を使っている場合は YES と答える。
 http://tmurakam.hatenablog.com/entry/20111009/1318137457
 
・ContentRights:アプリ内で使用するコンテンツに関するもの。権利を持っている場合は
「Does your app contain, display, or access third-party content?」に Yes と回答し、
「Do you have all necessary rights to that content or are you otherwise permitted to use it under the laws of each App Store territory in which your app is available?」に Yes と答える。

・Advertising Identifier(IDFA):広告の識別子に関する確認事項。アプリ内で広告の識別子を使っていないのでNoと答える。
 以下が参考サイト。
 http://jp.techcrunch.com/2014/04/12/20140411apple-developers-must-now-agree-to-ad-identifier-rules-or-risk-app-store-rejection/
 http://ios-dev.seesaa.net/article/394327576.html
 http://kojisatoapp.blogspot.jp/2014/04/iosidfa.html
 
ここまででSaveする。

アプリの説明に、Waiting for Upload となっていることを確認する。
↑アプリをXcodeからアップロードするのを待っている状態である。

⑧アプリをXcodeからアップロードする


TargetのIdentityを確認する。
・Bundle identifier:App ID の Bundle IDと外得る。
 最後のサフィックスはプロジェクト名がそのまま入るので入力しない。

・Version:はユーザーに見えるバージョン番号
・Build:アプリがインストールされた OS 内でアップデートを確認するためのバージョン番号
・Team:リリースビルドに関連付けるiOSDeveloperProgramのチーム名
 選択したチームにBundle IdenfitierにマッチするProvisioningProfileが無い場合はエラーになる。
・Code Signings Identity の Release:事前に登録しておいた Distribution 用の Certificate に変更する。
・Provitioning Profile:事前に登録しておいた Distribution 用の Provisioning Profileを設定。


⑨Xcodeでアプリのアーカイブ

Product - Scheme - Edit Scheme を選択。

・Archiveを選択し、BuildConfigraionをReleaseにして、ArchiveNameにアプリ名を入れる。

Product - Archive でアーカイブジック。

⑩検証


Validate ボタンをクリックして検証する。iTunes ConnectアカウントのIDとパスワードを入力。
検証する Provisioning Profile を選択し「Validate」ボタンをクリック。

Validateに成功したら、最後にDistributeボタンをクリック。これでファイルをアップロードする。
本番用では、Submit to the iOS App Store を選択する。

Distribute に使用する Provisioning Profile を選択し「Submit」ボタンをクリックする。

SubmissionSucceeded.となり、No issues~と出ればOK。

iTunes Connectを見て、Wating for Review の確認をしましょう。


⑪レビュー日数の確認

レビュー待ち状況。レビュー開始のProbalityを表示。
https://developer.apple.com/news/

Average App Store Review Times
http://reviewtimes.shinydevelopment.com/
自己申告されたレビューまでの日数を元に算出するサービス。


ふう、長い。

2014年8月15日金曜日

S3でstaticサイトを構築する


S3で static web site を構築したのでメモ。

S3には画像や動画を保存する場所としてよく利用するが、静的なWEBサイトを構築するサーバとしても使い勝手が良い。

以下の様なメリットがある。
  • サーバのリソースの管理不要
  • 基本バックアップが不要
  • 割りと安い(安くなっていくことのほうが多い)
  • S3上でバージョン管理出来る

ベンチャーで人が足りない場合、このメリットは大きい。

デメリットも挙げておく。

  • 動的なサイトは構築出来ない
  • SSL接続には別途CloudFrontの料金が必要(月6万くらい)

WEBサイトを公開するなら、ドメインを自由に変更したいことが多いが、S3 の endpoint は Route53 から直接紐付けることが可能なので、便利。

もちろんモバイルアプリから呼び出すだけ、などURLを気にしない場合はS3のendpointを直に指定してアクセスすることも可能だ。

手順はとても簡単。

  1. S3にバケットを作成
  2. バケットに対して、Static Website Hosting の設定を行う。通常、Index Documentにはindex.html、Error Documentには error.html で良いだろう。
  3. Permisiionsにbucket policyを設定する。S3をファイルサーバとして使う場合は、それぞれにPermissionを設定した方が良いが、Webサーバとして使うなら一括で設定したほうが使い勝手が良い。→ bucke tpolicyのサンプル

Tips
  • バケットにフォルダを作ると、そのままURLのパスになるから便利
  • Route53 では、S3のEndpointをそのまま紐付ける機能がある。Amazonの公式に詳しい説明がある。

以上。超便利でコスト節約になります。

JenkinsでCIをまわす

久しぶりに Jenkins を使ったのでメモ。

数年前よりだいぶ便利になってた。

ここでは、以下を実現するために入れたプラグインをメモしておく。


  • gitリポジトリはbitbucketにあり、Java-Servlcetアプリケーションを管理している。
  • Jenkinsでwarをビルドする。
  • Jenkinsでwarをtomcatにデプロイする。


Jenkinsには、以下のプラグインを追加すれば十分。


  • Ant Plugin (Maven または Gradle でも良い)
  • Bitbucket Pull Request Plugin
  • Git Client Plugin
  • Git Parameter Plugin
  • Git Plugin
  • Publish Over SSH Plugin
後は、AntHome 、 JavaHome を設定すればOK。

デプロイ先のサーバへは、パス無し鍵認証できるようにしとくほうが便利だけど、Publish Over SSH Plugin があればそれもしなくてOK、進歩しとる。

PermGenの増加について

アプリケーションの負荷テスト実行中、PermGenが現象しない場合、OutOfMemory の可能性がある。以下のように、PermGenが減るかどうか確認が必要。

 S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
 19.81   0.00  90.04   4.83 100.00     66    2.889     4    1.306    4.195
 19.81   0.00  90.92   4.83 100.00     66    2.889     4    1.306    4.195
 19.81   0.00  90.92   4.83 100.00     66    2.889     4    1.306    4.195
 19.81   0.00  91.81   4.83 100.00     66    2.889     4    1.306    4.195
 19.81   0.00  92.05   4.83 100.00     66    2.889     4    1.306    4.195
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
 19.81   0.00  92.05   4.83 100.00     66    2.889     4    1.306    4.195
 19.81   0.00  92.92   4.83 100.00     66    2.889     4    1.306    4.195
 19.81   0.00  92.92   4.83 100.00     66    2.889     4    1.306    4.195
 19.81   0.00  94.82   4.83  99.27     66    2.889     4    1.306    4.195
 19.81   0.00  95.01   4.83  99.27     66    2.889     4    1.306    4.195
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
 19.81   0.00  95.01   4.83  99.27     66    2.889     4    1.306    4.195
 19.81   0.00  95.55   4.83  99.27     66    2.889     4    1.306    4.195
 19.81   0.00  95.55   4.83  99.27     66    2.889     4    1.306    4.195

上記は、PermGenが 100 になってから、99.27に減少している。その間、FullGCは発生していない。

consoleでjavaアプリケーションのJVMメモリ領域を確認する

jstatコマンドを使う。

$JAVA_HOME/bin に 標準で付属する jstatコマンドは以下のオプションを指定する。

jstat -出力オプション(-h[ヘッダーを出力する行間隔]) [プロセス番号] [出力間隔(ミリ秒)]
ex) >sudo ./jstat -gcutil -h5 1905 3000














上記の出力を得ることが出来る。各値の意味は、以下。


  • S0 Survivor領域0(From)の使用率(現在の容量に対するパーセンテージ)
  • S1 Survivor領域1(To)の使用率(現在の容量に対するパーセンテージ)
  • E Eden領域の使用率(現在の容量に対するパーセンテージ)
  • O Old領域の使用率(現在の容量に対するパーセンテージ)
  • P Permanent領域の使用率(現在の容量に対するパーセンテージ)
  • YGC New領域のカベージ・コレクションの回数
  • YGCT New領域のガベージ・コレクション時間(ミリ秒)
  • FGC 完全カベージ・コレクションの回数
  • FGCT 完全ガベージ・コレクション時間
  • GCT ガベージ・コレクション総時間(ミリ秒)




tomcatアプリケーションの負荷テスト

tomcatアプリケーションを負荷テストするにあたって必要なことをまとめる。

負荷テストクライアント


負荷テストツールには、JMeter を使う。
メーカーにいた8年くらい前からずっとスタンダードなツール。

pluginは入れておいたほうが良い。

http://jmeter-plugins.org/downloads/all/


リスナーとしては、以下を表示しておくと良い。

  • jp@gc – Response Times Over Time
  • jp@gc – Transactions per Second
  • jp@gc – Active Threads Over Time
  • jp@gc – Composite Graph (上記の選択表示)


スループットを制御するには jp@gc - Throughput Shaping Timer を使う。

RPS(Requests Per Second) とその継続秒数を指定して、スケジューリングすることが可能だ。


JMeterでハマった点は、PUT Method で Body パラメータをPOSTと同様には送信出来ないことだ。
Body Dataに直接 {key}={value}&... と記述すると送信出来た。変な仕様。


監視ツール

VisualVM と JConsole を使う。

VisualVM
http://visualvm.java.net/ja/gettingstarted.html
http://itpro.nikkeibp.co.jp/article/COLUMN/20090902/336270/?ST=develop&P=1

JConsole
JDKに標準で付属する監視ツール。


負荷テスト中監視したいのは、リクエストに成功しているかどうか、とメモリ領域に異常が無いかどうかである。

リクエストに成功しているかは、以下で確認出来る。


  • JMeter:レスポンスを確認
  • VisualVM :ヒープサイズに異常が無いか
  • VisualVM:待機スレッドが不必要に増加していないか


メモリ領域は、OutOfMemoryの原因が潜んでいないかどうかを確認する。


  • PermSize
  • CodeCache

CodeCacheについて


Hotspot VM は 動的コンパイラ(Just in Time) の1つであり、よく使われるプログラム(Hotspot)の
メモリ上のバイトコードをメモリ上のネイティブコードに変換するキャッシュの仕組みである。

よく使われる部分について、ネイティブと同程度の性能を得られる。


PermSizeが不足したOutOfMemoryError


perm領域を食いつぶしていた話



運用しておいた方が良いパラメータ

以下のブログにまとめられている。


こちらも参考になる。
http://kohago.blogspot.jp/2013/09/jvm-memory-system-jconsole.html


負荷テストの時だけ有効にしておきたい設定


2014年8月14日木曜日

JavaServletサーバ設定

JavaのServletサーバを構築することがあったので、ついでに設定についてまとめておきます。

サーバの構成はレガシーです。


  • tomcat:Webアプリケーションサーバ
  • Jersey:JAX-RSの実装
  • Doma:ORM、DAO
  • DBCP:DB接続プール
  • MySQL:RDB


裏側、DBとアプリケーションの接続からまとめます。

DBCPを使ってDB接続プールを保持する場合の設定です。

ここでは、WEBアプリケーション直下にMETA-INFディレクトリを作成し、context.xmlを格納する方法を使い、以下のように記述します。


設定値は以下の意味を持ちます。
  • factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory" #dbcpのコネクションプーリングを使用する
  • initialSize="5" #プールの初期状態に確保するコネクション数
  • minIdle="1" #未使用の接続を保持する最小数
  • maxIdle="10" #未使用の接続を保持する最大数
  • maxActive="50" #最大接続数
  • maxWait="5000" #接続が取得出来るまでwaitする秒数
  • validationQuery="SELECT 1" #コネクションの有効性検証用クエリ
  • validationQueryTimeout="5" #検証クエリが失敗した場合に、再接続するまでの秒数
  • testOnBorrow="true" #trueの場合、プールからコネクションを取得する際に検証を行う
  • testWhileIdle="true" #trueに設定すると、監視スレッドがアイドル状態のコネクションの生存確認を行う際に、有効性確認も行う。検証に失敗した場合、プールから削除する。
  • timeBetweenEvictionRunsMillis="1800000" #指定した間隔で監視スレッドを起動する。監視スレッドはコネクションの生存確認を行う。デフォルトは 30 分以上アイドル状態のコネクションをプールから削除する。(設定値は30分)
  • numTestsPerEvictionRun="5" #プール無いで生存を確認するアイドル接続数
  • minEvictableIdleTimeMillis="86400000" #アイドル接続するミリ秒数 (設定値は24時間)
  • removeAbandoned="true" #クローズ漏れコネクションの自動切断
  • removeAbandonedTimeout="600" #クローズ漏れとみなすまでの秒数 (設定値は10分)


これら以外に設定することを悩んだパラメータがあります。


  • preparedStatementのキャッシュ(非採用)
poolPreparedStatements="false"がデフォルトです。設定しませんでした。理由は、統計情報によりキャッシュクエリを保持するため、有効になるかどうかは博打を打つようなもので、緊急の手段として用いるものです。

これで、DBCPによるコネクションプーリングが出来ました。最大接続数はアプリケーションの特性に合わせて決定すべきです。


続けて、表側のtomcatの設定をします。

その前に、JVMのメモリ領域について整理しましょう。

JVMのメモリ領域の種類

○ヒープ
New領域:インスタンス化されたオブジェクトの情報
Old領域:寿命の長いオブジェクトの情報

○非ヒープ
Permanent領域:JVMにロードされたクラスやメソッドの情報(基本GC対象外だが、ユーザ定義のクラスローダーが存在する場合は、ロード情報はGCされる。)

□New領域
Eden領域:オブジェクトがインスタンス化されてはじめて配置される領域
From領域:Scavenge GC時のオブジェクト退避領域1
To領域:Scavenge GC時のオブジェクト退避領域2

FromとToを合わせてSurvivor領域と呼ぶことがあります。

□GC
Scavenge GC:New領域のみを対象とするGC。比較的短時間。
 トリガーはEden領域が一杯になった時。
 Scavenge GCが実行されたら、不要なオブジェクトは破棄、必要なオブジェクトはTo領域へ。
 既にToに入っているオブジェクトはFrom領域へ、FromからはToへ移動する。
 To、From間の移動がMaxTenuringThreashold(default 32)を超えると、Old領域へ移動。

Full GC:Old領域及びPermanent領域を対象とするGC。処理時間は長い。
 トリガーはOldまたはPermanent領域が不足した時。実施中はシステムがほぼ停止状態になる。

OldとPermanetが肥大化しないように注意する。
  • オブジェクトをあまり使いまわさないことや、新しいオブジェクトを大量に使用するな、Newを大きくして、Oldに移動しにくくなるようにする。
  • Permanent領域については、staticメソッドを多用しないこと。

サーバーモード

○起動サーバモード
起動時に -server オプションを指定する。:サーバモードを有効化する。
 サーバーモード:プログラム実行速度が最大化するように調整される。
 クライアントモード:起動時間を退縮し、メモリサイズを縮小するように調整される。

○Permanent領域
-XX:MaxPermSize:Permanent領域の最大値。
-XX:PermSize:Permanent領域の初期値、MaxPermSizeと同じ値を設定。

Permanentサイズの設定は、OutOfMemoryエラー対策になる。デフォルトは64MBと小さいので、
必ず設定すること。

○New、Old領域
-XX:NewRatio:New領域とOld領域の比を設定する、サーバVMの場合、デフォルトが 2 である。つまり、New:Old = 1:2 となる。

-XX:SurvivorRatio:EdenとSurvivorの比。デフォルトはEden:8、From:1、To:1 である。


初期設定は以下。負荷試験によって変更すると良い。

-Xms2048m -Xmx2048m -XX:NewRatio=2 -XX:SurvivorRatio=8 -XX:PermSize=512m -XX:MaxPermSize=512m -server