2010-11-18 1 views
1

..Erlangのヒープオーバーフロー

私は、実行中の約12時間後に、ヒープのクラッシュを見ていますが。

スタックの再構築時にerlangを特定の方法でプログラムできないと聞いて覚えています。誰もその例を提供できますか?

また、どのプロセスがスタックしているのかをリアルタイムで監視する方法はありますか?

よろしく

EDIT - 何

loop() -> 
    receive 
    {sys, Msg} -> 
     handle_sys_msg(Msg), 
     loop(); 
    {From, Msg} -> 
      Reply = handle_msg(Msg), 
      From ! Reply, 
      loop(); 

    _ -> continue 
    end, 
    loop(). 
+0

あなたの編集は末尾再帰です。つまり、スタック上に何も構築されません。 – Lukas

+2

@TERRIBLE ADVICEはあなたの編集が尾部再帰的ではないことを非常に正しく指摘しています – rvirding

答えて

8

でも、あなたの編集はない末尾再帰的である:1つの関数の実行順序がある

loop() -> 
    receive 
    {sys, Msg} -> 
     handle_sys_msg(Msg), 
     loop(); 
    {From, Msg} -> 
      Reply = handle_msg(Msg), 
      From ! Reply, 
      loop(); 
     _ -> continue 
    end, 
    loop(). 

receive ... end, loop()。あなたが{sys, _}メッセージを得れば今、loop/0は、上記と同等のものに実行順序を変換し、内部から受け取ると呼び出されます。

loop() -> 
     receive 
      loop() -> 
       receive 
        ... 
       end, 
       loop(), 
     end, 
     loop() -> 
     ... 

問題は、内からloop()を呼び出す場合、受け取るということですreceiveの後にloop()を実行するには、VMは引き続きリターンポイントを格納する必要があります。

あなたの関数は末尾再帰にするために、あなたがいずれかを実行する必要があります:

loop() -> 
    receive 
    {sys, Msg} -> 
     handle_sys_msg(Msg); 
    {From, Msg} -> 
      Reply = handle_msg(Msg), 
      From ! Reply; 
     _ -> continue 
    end, 
    loop(). 

または

loop() -> 
    receive 
    {sys, Msg} -> 
     handle_sys_msg(Msg), 
     loop(); 
    {From, Msg} -> 
      Reply = handle_msg(Msg), 
      From ! Reply, 
      loop(); 
     _ -> loop() 
    end. 

loop()を呼び出すと、実際に行われる常に最後の事です関数。

+0

偉大な答えです。 – BAR

2

についてのプロセスループは末尾再帰でなければなりません。

loop() -> 
    receive 
    {sys, Msg} -> 
     handle_sys_msg(Msg), 
     loop(); 
    {From, Msg} -> 
      Reply = handle_msg(Msg), 
      From ! Reply, 
      loop() 
    end, 
    io:format("Message is processed~n", []). 

表示されていない。このようなhttp://www.erlang.org/doc/efficiency_guide/processes.html

1

何かがあなたのシステム内のプロセスの現在のヒープ使用状況を監視するために使用することができます。ループするgen_serverの中にプリントアウトするか、シェルの中で毎回実行してください。

lists:reverse(lists:keysort(2, 
    [{Pid,catch element(2,process_info(Pid,total_heap_size))} || Pid <- processes()])).