プログラムの不可思議
学生が夏休みを満喫している中、蒸し暑い室内で青い顔して実装している秀雄です。
エアコン28℃って結局汗かくからつける意味ないよな。IT企業なら1か0、暑いか寒いかでもの考えろよ。
あと、学生諸君に言っておく。
夏休みは死ぬ気で遊ぶべし。とにかく、自分が好きな事にとことん時間をかけたほうがいい。
ゲーム好きな奴はぶっ倒れるまでやるとかね。
社会人になったらこの先50年は3日ぐらいしか休みとれないんだぞ・・・。
夏らしいことなんて何らできないまま、気付くと季節が変わっているんだ。恐ろしい・・・恐ろしすぎる。
俺みたいに後悔しないために、色々やっておくべし。
前置きが長くなったが、ここからが本題。
最近不思議でしょうがないことがあったので、備忘録としてここに残しておく。

まずはこれ。
1~100までのランダムな数字を1000回データベースに登録するプログラム。
for文の中でgetConnection...つまり、コネクションを1000個つくるっていうやばそうな書き方。
が、これくらいのプログラムは問題なく完走する。処理時間もサーバのマシンスペックを考えればそこまで遅くはない。

でも、コネクション1000個作るとか小学生までだよね~
とか先輩に注意されそうなので以下のように書いたところ・・・

なんとOutOfMemoryで落ちる・・・。

どどどどういうことだ??
なんで明らかにやばそうなコネクション1000個取得が完走して、ひとつのコネクションで登録を繰り返す方が落ちるんだろう。
試しにメモリ使用率とかを計測してみた結果、
コネクション1000個 CPU使用率:12% メモリ使用率:2% (i=800までループした時点)

コネクション1個 CPU使用率:93% メモリ使用率:27% (i=800までループした時点)

わからん。なぜここまで負荷に違いが出るのか。
もしかして1つめのソースはコネクション1000個作ってるように見えて、実はJVMがひとつしか参照していないとか・・・?
でもそうだとしたら2つ目のソースも問題なく動くはず・・・。
結局、色々ぐぐったけど明確な答えもなく、仕方なくコネクション1000個つくるっている気持ち悪い書き方しかできていない。
現場ではフレームワークを使って実装しているので、コネクションクローズとか特に意識する必要はないが、なんか特殊な処理をするために素のJavaで書きますってなると、この原因がわかってないのは怖い。
「秀雄くんの実装が糞でサーバが落ちました。明日からもう来なくていいです。」
とかやばすぎる。
でも1つ目のソースはちゃんと動くしリソース全然くってないし、別によくね?とか悪魔が囁くんだよな。
やばいわかんない・・・でも動くからいいやいやいやそこはちゃんとしないとダメでしょえ?え?うみゃぁ~
BENになっちゃうよぉおぉお~~~。
結論:動きゃいいや
-完-
エアコン28℃って結局汗かくからつける意味ないよな。IT企業なら1か0、暑いか寒いかでもの考えろよ。
あと、学生諸君に言っておく。
夏休みは死ぬ気で遊ぶべし。とにかく、自分が好きな事にとことん時間をかけたほうがいい。
ゲーム好きな奴はぶっ倒れるまでやるとかね。
社会人になったらこの先50年は3日ぐらいしか休みとれないんだぞ・・・。
夏らしいことなんて何らできないまま、気付くと季節が変わっているんだ。恐ろしい・・・恐ろしすぎる。
俺みたいに後悔しないために、色々やっておくべし。
前置きが長くなったが、ここからが本題。
最近不思議でしょうがないことがあったので、備忘録としてここに残しておく。

まずはこれ。
1~100までのランダムな数字を1000回データベースに登録するプログラム。
for文の中でgetConnection...つまり、コネクションを1000個つくるっていうやばそうな書き方。
が、これくらいのプログラムは問題なく完走する。処理時間もサーバのマシンスペックを考えればそこまで遅くはない。

でも、コネクション1000個作るとか小学生までだよね~
とか先輩に注意されそうなので以下のように書いたところ・・・

なんとOutOfMemoryで落ちる・・・。

どどどどういうことだ??
なんで明らかにやばそうなコネクション1000個取得が完走して、ひとつのコネクションで登録を繰り返す方が落ちるんだろう。
試しにメモリ使用率とかを計測してみた結果、
コネクション1000個 CPU使用率:12% メモリ使用率:2% (i=800までループした時点)

コネクション1個 CPU使用率:93% メモリ使用率:27% (i=800までループした時点)

わからん。なぜここまで負荷に違いが出るのか。
もしかして1つめのソースはコネクション1000個作ってるように見えて、実はJVMがひとつしか参照していないとか・・・?
でもそうだとしたら2つ目のソースも問題なく動くはず・・・。
結局、色々ぐぐったけど明確な答えもなく、仕方なくコネクション1000個つくるっている気持ち悪い書き方しかできていない。
現場ではフレームワークを使って実装しているので、コネクションクローズとか特に意識する必要はないが、なんか特殊な処理をするために素のJavaで書きますってなると、この原因がわかってないのは怖い。
「秀雄くんの実装が糞でサーバが落ちました。明日からもう来なくていいです。」
とかやばすぎる。
でも1つ目のソースはちゃんと動くしリソース全然くってないし、別によくね?とか悪魔が囁くんだよな。
やばいわかんない・・・でも動くからいいやいやいやそこはちゃんとしないとダメでしょえ?え?うみゃぁ~
BENになっちゃうよぉおぉお~~~。
結論:動きゃいいや
-完-
スポンサーサイト
コメントの投稿
そうそう動きゃいいのさ
負荷?可読性?知らんわボケ
No title
マユさんお久しぶりです。
コメントありがとうございます。
「動くものを作る」まずはそれからですよね。
コメントありがとうございます。
「動くものを作る」まずはそれからですよね。