Red5のメモリー利用状況を確認してみる。オブジェクトの消失条件その1

Red5がメモリーをout of memoryで落ちてしまう、そんな状況におちいる人は結構いると思います。
そこで、正月休みを利用して、ちょっと調査してみようとおもいます。

とりあえず、オブジェクトがきちんと消えるのか、確認してみました。

以下のようのコードを書いて実行してみた。
  1. package com.taktod.red5test;
  2.  
  3. import java.lang.ref.WeakReference;
  4. import java.util.HashMap;
  5. import java.util.Iterator;
  6. import java.util.Map;
  7.  
  8. import org.red5.server.Client;
  9. import org.red5.server.Scope;
  10. import org.red5.server.api.IClient;
  11. import org.red5.server.api.IConnection;
  12. import org.red5.server.api.IScope;
  13. import org.red5.server.net.rtmp.RTMPMinaConnection;
  14.  
  15. /**
  16.  * すべてのAttributeをもつクラスがきえうるかチェックする。
  17.  * @author taktod
  18.  */
  19. public class App {
  20. /**
  21. * エントリー
  22. * @param args
  23. */
  24. public static void main(String[] args) {
  25. new App();
  26. }
  27. /**
  28. * コンストラクタ
  29. */
  30. public App() {
  31. Map<String, WeakReference<Object>> map = new HashMap<String, WeakReference<Object>>();
  32. Object obj = null;
  33. IClient client = new Client();
  34. obj = new HoldData("client");
  35. client.setAttribute("attachObj", obj);
  36. map.put("client", new WeakReference<Object>(obj));
  37. IScope scope = new Scope();
  38. obj = new HoldData("scope");
  39. scope.setAttribute("attachObj", obj);
  40. map.put("scope", new WeakReference<Object>(obj));
  41. IConnection conn = new RTMPMinaConnection();
  42. obj = new HoldData("conn");
  43. conn.setAttribute("attachObj", obj);
  44. map.put("conn", new WeakReference<Object>(obj));
  45. obj = null;
  46.  
  47. System.out.println(map.keySet());
  48. clearMap(map);
  49. System.out.println(map.keySet());
  50. client = null;
  51. scope = null;
  52. conn = null;
  53. System.out.println(map.keySet());
  54. clearMap(map);
  55. System.out.println(map.keySet());
  56. }
  57. /**
  58. * マップデータを消去する。
  59. * @param map
  60. */
  61. private void clearMap(Map<String, WeakReference<Object>> map) {
  62. System.gc();
  63. Iterator<String> iter = map.keySet().iterator();
  64. while(iter.hasNext()) {
  65. String key = iter.next();
  66. if(map.get(key).get() == null) {
  67. iter.remove();
  68. }
  69. }
  70. }
  71. /**
  72. * ダミー用のデータクラス
  73. */
  74. private class HoldData {
  75. public String str;
  76. public HoldData(String str) {
  77. this.str = str;
  78. }
  79. @Override
  80. public String toString() {
  81. // TODO Auto-generated method stub
  82. return("HoldData:" + str);
  83. }
  84. }
  85. }
  86.  

内容は、各オブジェクトを作成し、属性情報を設置、同じ情報を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
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。