重いっていわれた


昔おいらがつくって一応引き継いだとある機能が劇重っていわれた(´・ω・`)
いろんなシステムから呼ばれるんだけどたまたま今回新規作成したシステムだけ遅かったようだ。
話を聞いてみると、

  • JMaterでスレッド二つにして叩いたら急に重くなる
  • 片方の処理が終わるのを待ってるかのような挙動をする

など。


ログを追ってみる。
どうもこいつが呼ばれると重くなるっぽかった...ん〜よくわかんないなぁ。

/**
 * メモリをチェックする
 * TODO: リリース前には消す
 *
 * @return チェックした結果
 */
private String checkMemory() {
	if (logger.isDebugEnabled()) {
		Runtime runtime = Runtime.getRuntime();
		StringBuffer sb = new StringBuffer();
		sb.append("TotalMemory: " + runtime.totalMemory() + " bytes. ");
		runtime = Runtime.getRuntime();
		sb.append("FreeMemory: " + runtime.freeMemory() + " bytes. ");
		runtime = Runtime.getRuntime();
		long usedmemory = runtime.totalMemory() - runtime.freeMemory();
		sb.append("Used Memory: " + usedmemory + " bytes.");
		return sb.toString();
	} else {
		return null;
	}
}

改めて見るとなんか微妙だなぁ(汗
よくわからないことしてる...なにこれ? (´・ω・`)
っていうかとど...


信じられなかったんだけどログレベルをINFOに変更してもらう。
...30秒くらいの処理が5〜6秒で終わるようになったwww
こいつが値返すのに大体1秒くらいかかってたっぽい。


というわけで犯人はこいつだったらしい。
他のシステムはログレベルをINFOで動かしてたから問題なかったということなのか...


なんでこれが重いんだろう...マルチスレッドな状態だと急に重くなるっていうと...

Java アプリケーションはすべて、Runtime クラスの単一のインスタンスを持ち
ます。このクラスは、アプリケーションとアプリケーション実行環境とのイン
タフェースになります。現在の実行時オブジェクトは、getRuntime メソッドに
より取得できます。

Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle


単一のインスタンスってことはそいつのとりあいでコストがかかるってこと???
わっかんないなぁ...