先日、とある事がきっかけで発覚した現象。
Lotus Notes/Domino では、エージェント終了時に、
基本的にメモリは開放されるはずだが、
Error が発生した場合は、メモリ解放が完全には行われていない(…っぽい)
※ここで言う Error とは、
「型が一致しない」や、「RESUMEが無い」等々、
一般的に「on error」で検出するエラーの事。
そこで興味本位から、とある実験を行なってみる。
(もちろんローカルPC上で)
実験用に作成したエージェントは次のとおり。
実行させる場合は自己責任で実行させて下さい
----- < Sample Start > -----
Sub Initialize
'宣言部
'テスト用文字
Const TEST_STR = "a_"
'ループ終了値
Const LOOP_MAX = 300000
'ループカウンタ
Dim loopCnt As Long
'処理部
For loopCnt = 0 To LOOP_MAX
Call testSub( TEST_STR & Cstr(loopCnt) ) '引数として数値変換不能な文字列を渡す
Print Cstr(loopCnt) & " 件目:" & Error$ 'エラーメッセージを出力
Next
Print "処理終了"
End Sub
Sub testSub(longCnt As String)
'宣言部
Dim testInt As Integer
'処理部
On Error Goto errorHandler
testInt = longCnt 'ここでエラー発生
Exit Sub '絶対に通らない Exit Sub
errorHandler:
Exit Sub
End Sub
----- < Sample End > -----
もうお分かりだろう。
要は、先に書いた Error を
ループの中で300000回繰り返し発生させるだけである。
実行すると、最初のうちは「T003 型が一致しません」というエラーが表示される。
しかし、ある程度のループ回数を超えると、
「Lotus Notes がサポートできるメモリ分割の最大数が限度を超えています。」という
エラーメッセージに変わってしまう。
※マシンスペックにもよるだろうが、
当方が使用している貧弱なマシンではこれで十分…(泣)
こうなってしまうと、
エージェントが終了した後も上記メッセージが頻発し、
大抵の場合、赤画面が表示されて落ちる。
これがもしも、サーバエージェントだったらどうなるか…?
要は、ループの中でエラーハンドラを使用する際には注意が必要…という話
Lotus Notes/Domino では、エージェント終了時に、
基本的にメモリは開放されるはずだが、
Error が発生した場合は、メモリ解放が完全には行われていない(…っぽい)
※ここで言う Error とは、
「型が一致しない」や、「RESUMEが無い」等々、
一般的に「on error」で検出するエラーの事。
そこで興味本位から、とある実験を行なってみる。
(もちろんローカルPC上で)
実験用に作成したエージェントは次のとおり。
実行させる場合は自己責任で実行させて下さい
----- < Sample Start > -----
Sub Initialize
'宣言部
'テスト用文字
Const TEST_STR = "a_"
'ループ終了値
Const LOOP_MAX = 300000
'ループカウンタ
Dim loopCnt As Long
'処理部
For loopCnt = 0 To LOOP_MAX
Call testSub( TEST_STR & Cstr(loopCnt) ) '引数として数値変換不能な文字列を渡す
Print Cstr(loopCnt) & " 件目:" & Error$ 'エラーメッセージを出力
Next
Print "処理終了"
End Sub
Sub testSub(longCnt As String)
'宣言部
Dim testInt As Integer
'処理部
On Error Goto errorHandler
testInt = longCnt 'ここでエラー発生
Exit Sub '絶対に通らない Exit Sub
errorHandler:
Exit Sub
End Sub
----- < Sample End > -----
もうお分かりだろう。
要は、先に書いた Error を
ループの中で300000回繰り返し発生させるだけである。
実行すると、最初のうちは「T003 型が一致しません」というエラーが表示される。
しかし、ある程度のループ回数を超えると、
「Lotus Notes がサポートできるメモリ分割の最大数が限度を超えています。」という
エラーメッセージに変わってしまう。
※マシンスペックにもよるだろうが、
当方が使用している貧弱なマシンではこれで十分…(泣)
こうなってしまうと、
エージェントが終了した後も上記メッセージが頻発し、
大抵の場合、赤画面が表示されて落ちる。
これがもしも、サーバエージェントだったらどうなるか…?
要は、ループの中でエラーハンドラを使用する際には注意が必要…という話