0

Monotouch で Sqlite を使用している以下のコードを参照してください。これは多くのメソッドの 1 つを表し、すべての種類が同じように見えます。すべてが正常にクリーンアップされていますか? Sqlite docs で、準備されたすべてのステートメントをファイナライズする必要があることを読みましたが、一致する呼び出しが見つかりません。それで、私は何か不足していますか?

私が見る限り、私はすべてを正しく開閉して処分しています。それにもかかわらず、Sqlite からランダムにmalloc() エラーが発生しています。これは最近始まったので、コードが変更されていないため、MT 自体の Sqlite バージョンでも問題になる可能性があります。

using ( SqliteConnection oConn = this.CreateDBMSConnection() )
{
  oConn.Open ();

  using ( SqliteCommand oCmd = new SqliteCommand (
    "SELECT CollaborationItems.*, CollaborationParticipants.intStatus AS intParticipantStatus   FROM CollaborationItems " +
"LEFT JOIN CollaborationParticipants ON CollaborationItems.intItemID = CollaborationParticipants.intItemID " +
"WHERE CollaborationItems.intID = @intD", oConn ) )
  {
    oCmd.Parameters.AddWithValue( "@intID", iItemID );

    using ( SqliteDataReader oReader = oCmd.ExecuteReader (  ) )
    {
      while ( oReader.Read( ) )
      {
         // [...] - some code omitted.

         // The next call again create a DMBS connection, has similar using etc.
         oItem.Participants = this.GetEventParticipants(oItem);
      }
      oReader.Close( );
    }
  }
  oConn.Close( );
}

これは私が受け取る例外です:

Mono.Data.Sqlite.SqliteException: malloc() が Mono.Data.Sqlite.SQLite3.Prepare でメモリ不足に失敗しました (Mono.Data.Sqlite.SqliteConnection cnn、System.String strSql、Mono.Data.Sqlite.SqliteStatement 以前、UInt32 timeoutMS, System.String& strRemain) [0x0022a] in /Developer/MonoTouch/Source/mono/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLite3.cs:343 at Mono.Data.Sqlite. SqliteCommand.BuildNextCommand () [0x00019] in /Developer/MonoTouch/Source/mono/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLiteCommand.cs:230

4

1 に答える 1

1

メモリ不足状態の場所は、メモリが不足した場所であることを意味しますが、すべてのメモリが割り当てられた場所であることを意味するわけではありません。

IOWは、要求された利用可能なメモリがないことに加えて、失敗したところで 何も問題がない可能性があります。(以前の) メモリ使用量を見つけるために間違った場所を見ている可能性mallocがあります。

また、sqliteアンマネージ コードであるため、メモリ不足の状態でも GC はトリガーされません (iOS がアプリケーションに警告を送信しない限り)。したがって、このコードでメモリ使用量が増加すると、アプリケーション内の他の多くの場所よりも、このエラーが発生する可能性が高くなります。これにより、コードの間違った部分が疑われる可能性があります。

正しい場所を見ていることを確認する (または少なくとも確認する) には、Apple の Instruments を使用して、アプリケーションの合計メモリ使用量を監視することをお勧めします。これにより、ほとんどのメモリがどこに (いつ) 割り当てられているかがわかります。

それはまだ指摘しているかもしれませんsqliteが、それでも、問題のより正確な全体像を把握できるはずです.

于 2012-04-18T14:34:03.803 に答える