Red5がメモリーをout of memoryで落ちてしまう、そんな状況におちいる人は結構いると思います。
そこで、正月休みを利用して、ちょっと調査してみようとおもいます。
とりあえず、オブジェクトがきちんと消えるのか、確認してみました。
以下のようのコードを書いて実行してみた。
package com.taktod.red5test;
import java.lang.ref.WeakReference;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.red5.server.Client;
import org.red5.server.Scope;
import org.red5.server.api.IClient;
import org.red5.server.api.IConnection;
import org.red5.server.api.IScope;
import org.red5.server.net.rtmp.RTMPMinaConnection;
/**
* すべてのAttributeをもつクラスがきえうるかチェックする。
* @author taktod
*/
public class App {
/**
* エントリー
* @param args
*/
public static void main
(String[] args
) { new App();
}
/**
* コンストラクタ
*/
public App() {
Map
<String, WeakReference
<Object
>> map
= new HashMap
<String, WeakReference
<Object
>>(); IClient client = new Client();
obj = new HoldData("client");
client.setAttribute("attachObj", obj);
map.put("client", new WeakReference<Object>(obj));
IScope scope = new Scope();
obj = new HoldData("scope");
scope.setAttribute("attachObj", obj);
map.put("scope", new WeakReference<Object>(obj));
IConnection conn = new RTMPMinaConnection();
obj = new HoldData("conn");
conn.setAttribute("attachObj", obj);
map.put("conn", new WeakReference<Object>(obj));
obj = null;
System.
out.
println(map.
keySet()); clearMap(map);
System.
out.
println(map.
keySet()); client = null;
scope = null;
conn = null;
System.
out.
println(map.
keySet()); clearMap(map);
System.
out.
println(map.
keySet()); }
/**
* マップデータを消去する。
* @param map
*/
private void clearMap
(Map
<String, WeakReference
<Object
>> map
) { Iterator<String> iter = map.keySet().iterator();
while(iter.hasNext()) {
if(map.get(key).get() == null) {
iter.remove();
}
}
}
/**
* ダミー用のデータクラス
*/
private class HoldData {
this.str = str;
}
@Override
// TODO Auto-generated method stub
return("HoldData:" + str);
}
}
}
内容は、各オブジェクトを作成し、属性情報を設置、同じ情報をWeakReferenceに設置することで、GCによりデータが回収されたら消えるとする。
21:22:36.636 [main] DEBUG org.red5.server.BaseConnection - New BaseConnection - type: persistent host: null remoteAddress: null remotePort: 0 path: null sessionId: null
21:22:36.640 [main] DEBUG org.red5.server.BaseConnection - Params: null
21:22:36.640 [main] DEBUG o.r.s.net.rtmp.RTMPMinaConnection - RTMPMinaConnection created
[conn, scope, client]
[conn, scope, client]
[conn, scope, client]
[]
結果はそれぞれのオブジェクトにnullを代入したら、データが消失する。
ConnectionもScopeもClientもきれいさっぱりなくなったというわけです。
当たり前の動作です。
とりあえず、この当たり前の動作をRed5の内部のデータについてもやってみようと思います。
最終更新:2010年12月28日 21:30