Staff’s Blog

開発実績

Staff's Blog

採用情報

  • 日本ベンチャーシステム株式会社
  • 〒541-0051
    大阪市中央区備後町1丁目4番5号
    堺筋東野村ビル5階
  • TEL:06-6266-8755
  • お問い合わせ
2012/01/24/(火)14:51

会社までの通勤時間、ただボ~としているのはもったいないと思い、始めたのが読書。
家のリビングの本棚にはズラズラズラと本が並んでいます。「売れっ子作家にハズレなし(by嫁)」の格言を信じ、有名作家ばかりの本が並んでいます。ミーハーです。


そして最近読んだのが伊坂幸太郎の「モダンタイムス」という物語です。


同著者で「魔王」という作品があり、これが昔読んでなかなか面白かった。そしてその続編にあたるのが「モダンタイムス」になるのですが、最近ようやく文庫本になったと聞いて購入しました。上下巻でなかなかのボリュームになりますが、とても読みやすく面白い内容でした。主人公がシステムエンジニアであったり、インターネットの検索に絡んだ物語だったりで、システムに携わる者として馴染みやすくもありました。


興味のある方は是非一度読んでみてください。


次に読もうと思っているのは、同僚に借りた貴志祐介の「新世界」という物語です。学生の頃に同著の「黒い家」を読んでゾッとした記憶があります。映画にもなったのですが、大竹しのぶが華麗にアレするシーンにもゾッとした記憶があります。「新世界」の内容はまだわかりませんが、頭に浮かぶのはイルミネーション光る塔や足がすり減った像といったコテコテしたイメージばかり......楽しみです。

2012/01/11/(水) 9:03
こんにちは!

当社のブログですが、今年から社員が持ち回りで書くことになりました。
技術的なことや社内での出来事、世間話など・・
当ブログから当社や社員の雰囲気が伝わればいいなぁと思います。

さて、今年も仕事始めから一週間が過ぎましたが私の作業している
ユーザー先では新年早々席替えがありました。

1フロアで数百人の移動なので席替えに関係なくても仕事などできません。
で、いろいろ人間ウォッチングしてると、なんと「毛布と枕」を担いで
席移動してる人がいるじゃありませんか!
この業界ですから、徹夜等はよくあることですが席替えで「毛布と枕」を
もって移動する人は見たことがなかったので驚きと同時に笑ってしまいました。

徹夜の作業って、続くと効率落ちるし体調不良にもなりやすいしあまりしたくないですよね。
ま、この業界、納期が迫るとそうは言ってられないのですが・・・

私も、もう若くはない?!ので体調管理にはしっかり気をつけて
今年も元気ですごしたいと思ってます。
(最近はMH3Gで夜更かししてますが・・・笑)

まだ冬はこれからなので、みなさんも体調に気をつけて仕事もプライベートも
がんばりましょう!
2012/01/06/(金)15:18

遅くなりましたが...新年あけましておめでとうございます。
本年もよろしくお願い致します。


さて昨年は「天の蔵 販売管理」を無事にリリースし、ご利用者数も増え、それに伴って課題点も見つかり、そしてバージョンアップを行い...と、リリース初年度としてはまずまずの結果を残せたと思います。これもひとえに天の蔵をご支援いただいている皆さまのおかげであり、大変感謝しています。

しかし、まだまだ合格点にはほど遠いと感じています。今年も皆様からいただいたご意見を参考に、より良いシステムにしていけるよう精進して参ります。どうぞよろしくお願い致します。


...と、あとブログの更新が滞っていることを大いに反省し、
今年はもっと頻繁に更新していこうと心に強く誓っております。

2011/07/29/(金)14:04

天の蔵をさわっていると、唐突にプチフリーズする現象が発生しました。


最初は、Flexの問題かとおもったのですが、調査をすすめるうちに、どうやらサーバで動いているJavaのガーベージコレクションに原因がある事が見えてきました。


今回は、その調査と対策を行う中で、Javaのガーベージコレクションについて勉強しましたので、その成果をご報告したいと思います。

※Sun(Oralce?)のJavaをつかっています。


■ ガーベージコレクションとは


JavaプログラムはJVMと呼ばれる仮想マシン上で動作します。
(私的には、JVM=ゲーム機のエミュレータ,
Javaプログラム=ROMカセットのデータ、と捉えています (^^; )


Javaプログラムを実行すると、このJVMはメモリ上に「ヒープ」とよばれる領域を作成し、Javaプログラムを実行する上で必要となる様々な情報を格納します。例えばプログラムでオブジェクトを作成(new)すると、JVMはヒープ領域を消費し、各プログラムへメモリ領域として割り当てをおこないます。


※ヒープ領域はメモリ上に無限に取られるのではなく、初期サイズと最大サイズが 決められています。たとえばJVMの起動オプションに「-Xms64M -Xmx128M」と指定さ れていると、プログラム起動時にまず64MBの領域を確保し、足りなくなると最大で128MBまで自動的に拡張されるという動作をとります。当たり前ですが、 プログラムが128MB以上のメモリを利用しようとすると、「OutOfMemory」の エラーが発生してしまうので、この場合は最大サイズを変更してあげる必要があります。


Javaプログラムでは、C言語のように不要となったメモリ領域を解放する必要がありません。JVMでヒープ領域を監視し、不要となった領域を解放する仕組みをもっている為です。ガーベージコレクションとは、このJVMが行うヒープの解放処理の事を指します。


■ 2つのガーベージコレクション


 一度に全ヒープ領域のガーベージコレクションを行うと負荷が高くなるため、Javaプログラムの実行に影響を与えてしまいます。そこで、通常はヒープの全領域ではなく一部分だけを対象とするガーベージコレクションを行い、そして、ヒープの空き容量が少なくなった場合にだけ全領域をガーベージコレクションするようにしています。こうすることで、ネックとなる全領域ガーベージコレクションが実行される感覚を延ばし、Javaプログラムへの影響を少なくしようとしています。


この、一部分だけを対象とする物を、「マイナー ガーベージコレクション」全領域を対象とする物を、「メジャー ガーベージコレクション」と呼んでいます。


※以降 ガーベージコレクションを GC と略します。


■ ヒープ領域について


 では、マイナーGCの対象となるヒープの一部領域とは、どのような物なのでしょうか?JVMはヒープ領域を大きく「NEW領域」と「OLD領域」に分けて管理されています。「NEW領域」は、マイナーGCとメジャーGCの両方からGCの対象とされ、新規のメモリの割り当てはこの領域から行われます。一方「OLD領域」は、「NEW領域」内にある割り当て済み領域のうち、一定回数以上GC実施が実行されたが回収されなかった(生き残った)領域が、「OLD領域」で管理されることとなります。「OLD領域」にある割り当て領域は、スタティックか生存期間が長いオブジェクトと考えられるため、マイナーGCでは対象外とし、メジャーGCでのみGCが実行されることとなります。


 「NEW」領域は 「EDEN」と「Survivor(FROM)」「Survivor(TO)」という3つの領域に分けられています。新規メモリ割り当ては、この「EDEN」から行われ、GCが行われるタイミングで、空きとして回収されるか、Survivor領域へと移されます。なお、「EDEN領域」より大きいメモリ割り当てが発生すると、「OLD領域」から確保されることになります。


Survivor(FROM)とSurvivor(TO)は同じサイズで、GCが発生するたび、FROMからTOへ割り当て済み領域の移動が行われます。(不要となった領域はこの際に回収されます。)FROMとTOは、常にどちらか一方にのみ領域が格納されることになるため、NEW領域全体の実質の空き容量は EDEN容量 + Survivor容量÷2 になります。


■ チューニングについて


 今回のチューニングの目標は、メジャーGCが実行されないようにする事、マイナーGCの実行時間を短縮する事の2点となります。


※ メジャーGCが起こると、その実行中はJavaプログラムが停止します。


 極論を言いますと、メジャーGCの実行回数を0とするためには、OLD領域にはStaticな情報だけが格納され(メジャーGCが実行されても、回収される領域が存在しない状態)、一時的な情報は全てNEW領域内にだけ存在する状態とする事、つまり一時的な情報に対するマイナーGCの回収率を100%にする事になります。これは、NEW領域を増やしたり、OLD領域へ移動するための条件を厳しくし、一時的な情報がNEW領域内に長くとどまるように設定すれば、マイナーGCの回収率を高くすることができます。


 しかし、NEW領域を増やしたり、OLD領域へ移動するための条件を厳しくすると、NEW領域内に格納される情報が多くなるため、マイナーGCの実行時間が長くなってしまいます。マイナーGCの回収率を上げると、それに比例して実行時間が長くなってしまうという微妙な関係がうまれます...(表現が..


ここにチューニングの余地が存在します。


いかに少ないNEW/OLD領域で、マイナーGCの回収率を上げるかがチューニングの内容となります。
※ OLD領域も含まれるのは、メジャーGCの実行時間に影響があるためです。


簡単にまとめますと、


GCの実行時間に影響がある
・NEW領域のサイズ (小さいほど早い)
・NEW領域内の情報 (少ないほど早い)
・OLD領域のサイズ (小さいほど早い)
・OLD領域内の情報 (少ないほど早い)


マイナーGCの回収効率に影響がある
・NEW領域のサイズ (大きいほど回収率がよい)
・NEW領域内の情報 (多いほど回収率がよい)


チューニングに関係のありそうなオプションは以下のとおりです。


ヒープ領域のサイズに関するオプション
-Xmx512M 最大ヒープサイズ
-Xms512M 初期ヒープサイズ
-XX:MaxNewSize=256m 最大NEW領域のサイズ
-XX:NewSize=256m 初期NEW領域のサイズ
-XX:SurvivorRatio=8 New領域とSurvivor領域の比率


OLD領域への割り当て済み領域の移動に関するオプション
-XX:MaxTenuringThreshold=31
 長期生存オブジェクトと判断する閾値を設定します。
 指定された回数分のGC実行でも回収されなかった
 割り当て済み領域は、OLD領域への移動対象となります。
-XX:TargetSurvivorRatio=70
 survivor領域の利用率を設定します。
 この率を超えないように、割り当て済み領域がOLD領域に
 移されます。


※また、GCの事態の動作を変えることも有効です。
 以下に代表的なオプションを記載します。


  -XX:+UseParNewGC
  -XX:ParallelGCThreads=4
  マイナーGCをマルチスレッドで動作させます。ParallelGCThreadsは、スレッド数を
  指定します。マルチCPUの環境下で、マイナーGC時間の短縮が期待できます。


  -XX:+UseConcMarkSweepGC
  メジャーGCの一部処理を、Javaプログラムの実行と並行しておこないます。
  そのため、Javaプログラム自体のスループットは低下しますが、メジャーGC発生時
  のプログラム停止時間を短縮することができます。


  -XX:+CMSParallelRemarkEnabled
  メジャーGCをマルチスレッドで動作させます。


■ チューニング方法

 プログラムによって、Staticな情報や一時的な情報の量、発生度合いが異なるため、一様にこれが鉄板というチューニングの値はありません。値を変更しては、具合を調べる という根気のいる作業が要求されます。

 具体的には、上記チューニングオプションを変更し実際にプログラムを動作させ、マイナーGCの実施間隔・時間、およびメジャーGCの実施間隔・時間を計測し、妥当値を見つけることになるとおもいます。


 実施間隔・時間の計測には、ガーベージコレクションのログが役に立ちます。JVMの起動オプションに -Xloggc:/var/log/tomcat6/gc.log のように記載すると、そのディレクトリにGC実行ログが出力されます。


ログには、マイナーGC/メジャーGCがいつ実行され、メモリがどのくらい解放されたかがリアルタイムに出力されます。


 現在のNEW領域、OLD領域の利用状況を把握するには、-XX:+PrintClassHistogramオプションが有効です。 これは、SIGQUIT発行時のJVMのクラスの状況を出力するオプションですが、ヒープ領域の利用状況も出力されるためチューニング時に役に立ちます。


■ 次回予告


 次回がいつになるのか?そもそもあるのか?という感じですが...
次は実際にチューニングしながら、ポイント・ポイントの説明を行いたいと思います。

2010/12/14/(火)10:38

 

文字コードについて調べてみました。
符号化文字集合とかいろいろと概念がありますが、おいおい、
説明していけたらと思います。
あくまで、私がこう理解した ということですので、
誤りがあるかもしれません(^^; 見つけましたら、ご指摘よろしくお願いします。
まず、コンピュータが文字を扱うには、以下の事柄を決める必要があります。
・コンピュータで扱う文字の範囲
・文字をどのようにコンピュータで扱うか
コンピュータで扱う文字の範囲は「文字集合」と呼ばれ、代表的なものとしては、
ラテン文字(英語、西ヨーロッパ言語)を中心として集めたASCIIや、日本語表記、
地名、人名などで用いられる代表的な文字を集めた JIS X 0208、それを拡張した
 JIS X 0212 / 0213 があり、これらは各国や言語毎に策定されています。
しかし、これらの文字集合はコンピュータでそのまま扱う事はできません。
その実態が、単なる自然文字の集合情報にすぎないからです。そこで、各文字
に文字コードと呼ばれるコードを割り当て、そのコードで文字を管理しています。
文字コードにはいくつかの種類が存在し、それぞれで表現できる文字集合体が
きめられています。たとえば、Shift_jis であれば JIS X 0208, EUCであれば
JIS X 0208 / JIS X 0212 といった具合にです。
まずは、文字コードを考えるうえで文字集合と文字コードという2つの概念が
あり、文字コードには対応する文字集合が決められていることを理解して
おきましょう。
※中には、ASCIIの様に文字集合と文字コードの区別をせずに、
単に文字と文字コードの組み合わせを規定した物もあります。

文字コードについて調べてみました。

符号化文字集合とか抜けてる概念がありますが、

おいおい、説明していけたらと思います。

 

また、あくまで私がこう理解した ということですので、誤りがあるかもしれません(^^;

見つけましたら、ご指摘よろしくお願いします。

 

-------------------------

まず、コンピュータが文字を扱うには、以下の事柄を決める必要があります。

 

・コンピュータで扱う文字の範囲

・文字をどのようにコンピュータで扱うか

 

コンピュータで扱う文字の範囲は「文字集合」と呼ばれ、代表的なものとしては、

ラテン文字(英語、西ヨーロッパ言語)を中心として集めたASCIIや、日本語表記、

地名、人名などで用いられる代表的な文字を集めた JIS X 0208、それを拡張した

 JIS X 0212 / 0213 があり、これらは各国や言語毎に策定されています。

 

しかし、これらの文字集合はコンピュータでそのまま扱う事はできません。

その実態が、単なる自然文字の集合情報にすぎないからです。そこで、各文字

に文字コードと呼ばれるコードを割り当て、そのコードで文字を管理しています。

文字コードにはいくつかの種類が存在し、それぞれで表現できる文字集合体が

きめられています。たとえば、Shift_jis であれば JIS X 0208, EUCであれば

JIS X 0208 / JIS X 0212 といった具合にです。

 

まずは、考えるうえで文字集合と文字コードという2つの概念があり、

文字コードには対応する文字集合が決められていることを覚えておきましょう。

 

※中には、ASCIIの様に文字集合と文字コードの区別をせずに、

単に文字と文字コードの組み合わせを規定した物もあります。

 

前の5件 1  2  3  4  5  6
カテゴリー
  • その他
  • イベントキャンペーン
  • インフォメーション
  • 最新情報
カレンダー
2013年4月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        
アーカイブ