2009-08-25 10 views
1

ここにMono Continuationsのcontinuation_store(...)があります。Mono Continuations - store()の後にメモリが増加し続ける

  1. cont->saved_stack && num_bytes <= cont->stack_alloc_size
    • が直接他の
    • gcが空きメモリを使用します。以下のコードを見てから、店が()これらの二つの枝をたどるかのように表示されますメモリを使用し、いくつかの新しいメモリを作成します。

私は繰り返し巨大なラグGC操作が行われた後のステップまでcontinuation_store()、メモリ使用量が増加を使用している場合しかし、奇妙なことがあります。なぜこれが起こるのか誰も説明できますか?

おかげ

static int 
continuation_store (MonoContinuation *cont, int state, MonoException **e) 
{ 
    MonoLMF *lmf = mono_get_lmf(); 
    gsize num_bytes; 

    if (!cont->domain) 
     *e = mono_get_exception_argument ("cont", "Continuation not initialized"); 
    if (cont->domain != mono_domain_get() || cont->thread_id != GetCurrentThreadId()) 
     *e = mono_get_exception_argument ("cont", "Continuation from another thread or domain"); 

    cont->lmf = lmf; 
    cont->return_ip = __builtin_return_address (0); 
    cont->return_sp = __builtin_frame_address (0); 

    num_bytes = (char*)cont->top_sp - (char*)cont->return_sp; 

    /*g_print ("store: %d bytes, sp: %p, ip: %p, lmf: %p\n", num_bytes, cont->return_sp, cont->return_ip, lmf);*/ 

    if (cont->saved_stack && num_bytes <= cont->stack_alloc_size) 
    { 
     /* clear to avoid GC retention */ 
     if (num_bytes < cont->stack_used_size) 
      memset ((char*)cont->saved_stack + num_bytes, 0, cont->stack_used_size - num_bytes); 
    } 
    else 
    { 
     tasklets_lock(); 
     internal_init(); 
     if (cont->saved_stack) { 
      mono_g_hash_table_remove (keepalive_stacks, cont->saved_stack); 
      mono_gc_free_fixed (cont->saved_stack); 
     } 
     cont->stack_used_size = num_bytes; 
     cont->stack_alloc_size = num_bytes * 1.1; 
     cont->saved_stack = mono_gc_alloc_fixed (cont->stack_alloc_size, NULL); 
     mono_g_hash_table_insert (keepalive_stacks, cont->saved_stack, cont->saved_stack); 
     tasklets_unlock(); 
    } 
    memcpy (cont->saved_stack, cont->return_sp, num_bytes); 

    return state; 
} 

答えて

1

注mono_gc_free_fixedへの呼び出しは、デフォルトのベームのコレクタに何もしません:https://github.com/mono/mono/blob/master/mono/metadata/boehm-gc.c#L528

他の枝がちょうどkeepalive_stacksハッシュテーブルからメモリを削除します。このハッシュテーブルは、割り当てられたメモリへの参照を保持し、ガベージコレクションされません。割り当てられたメモリへのポインタがこのハッシュテーブルから削除されると、次のガベージコレクションの際に再利用されます。このコレクションは、後で特定の量のメモリ割り当てに達するとトリガーされます。

関連する問題