GAE/Jの実行環境

「今明らかにされるGoogle AppEngine for Javaの実行環境」を読んで自分でも作ってみました。


http://gae-env.appspot.com/show


ソースコードは以下です。java.lang.Runtimeとorg.apache.commons.lang.SystemUtilsを利用しました。

public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException {

	resp.setContentType("text/plain");

	PrintWriter writer = resp.getWriter();
	try {
		Runtime env = Runtime.getRuntime();

		writer.println("processors: " + env.availableProcessors());
		writer.println("freeMemory: " + env.freeMemory());
		writer.println("totalMemory: " + env.totalMemory());
		writer.println("maxMemory: " + env.maxMemory());

		Field[] fields = SystemUtils.class.getFields();
		for (Field f : fields) {
			writer.println(f.getName() + ": " + f.get(null));
		}
			
		writer.println("\n=================================================================");
		writer.println("source code is here : http://d.hatena.ne.jp/mtoyoshi/20090830/1251600442");
	} catch (Exception e) {
		throw new RuntimeException(e);
	} finally {
		writer.close();
	}
}


確かにプロセッサ数は1,337になってる。でもって、やっぱり空きメモリは6MB程度なんだ。
大丈夫なんか?と思って、ちょっと負荷をかけるプログラムを作りました。


http://gae-env.appspot.com/show2


ソースは以下。Effective Java 第2版の負荷がかかるプログラム例(項目5 不必要なオブジェクトの生成を避ける)に少し手を加えたもの。ロジック前後は先ほどのプログラムとほぼ同じなので略します。

・・・略・・・
List<Long> list = new ArrayList<Long>();
for (long i = 1; i < LOOP_MAX; i++) {
	list.add(i);

	if (i % 1000000 == 0) {
		writer.printf("%d : free: %d, total: %d\n", i, 
			Runtime.getRuntime().freeMemory(), 
			Runtime.getRuntime().totalMemory());
	}
}

writer.println("======================================");
			
Long sum = 0L;
for (long i : list) {
	sum += i;
	if (i % 1000000 == 0) {
		writer.printf("%d : free: %d, total: %d\n", i, 
				Runtime.getRuntime().freeMemory(), 
				Runtime.getRuntime().totalMemory());
	}
}
・・・略・・・

ちなみにループの最大値のところにある「500」を「400」にした途端、GAE上ではプログラムは正しく実行されなくなります。おそらくOutOfMemory的なことになっていると思われます。なので、このプログラムはそのギリギリのところをついたプログラムになっているはずなんですが、途中経過を表すfreeMemoryやtotalMemoryの出力値はずっと変わりません。さすがにおかしいと思うので、このメモリについてはちょっと信用ならないかもしれません。

なお、ローカルでこのプログラムを実行すると、以下のようになります。

freeMemory: 3023488
totalMemory: 5177344
maxMemory: 532742144
======================================
1000000 : free: 2045032, total: 25632768
2000000 : free: 7760152, total: 55730176
3000000 : free: 11103400, total: 82698240
4000000 : free: 24291032, total: 123215872
======================================
1000000 : free: 12426064, total: 123215872
2000000 : free: 19527312, total: 123215872
3000000 : free: 19043136, total: 123215872
4000000 : free: 18558960, total: 123215872
======================================
freeMemory: 13717200
totalMemory: 123215872
maxMemory: 532742144
======================================
1 + 2 + 3 + ... + 4294967 = 9223368618061