Loading
Salesforce から送信されるメールは、承認済ドメインからのみとなります続きを読む

「System.LimitException: Batchable instance is too big (System.LimitException: 一括処理可能なインスタンスが大きすぎます)」エラーのトラブルシューティング

公開日: Apr 24, 2026
説明
Apex 一括処理クラスで Database.Stateful で実装されると、インスタンスの状態がデータベースに保存されます。  現在、インスタンスの状態のサイズに対してチェックが実行され、Apex ヒープサイズ制限を超えると例外が発生します。ヒープサイズ制限は、同期 Apex で 6 MB、非同期 Apex で 12 MB です。この例外は、当然のことながら、大きなコレクションが持続的に維持されるシナリオで発生する可能性があります。

一部のチャンクにこのエラーが発生して失敗しても、一括処理ジョブは完了します。『Apex 開発者ガイド』に次のような説明があります。
「最初のトランザクションが成功し、2 番目が失敗した場合、最初のトランザクションで行われたデータベースの更新はロールバックされません。」

この問題を回避するために、次の手順に従うことができます。
 
1.Database.Stateful の使用を避ける
2.持続データの量を減らす
3.一括処理するレコード数を減らす

場合によっては、Database.Stateful が実装されていない、または上記のステップでこの例外を回避できないことがあります。この回避策を試してもまだ例外が発生する場合は、次の手順に従って、どこでヒープサイズの制限を超えているのかを調べてください。
解決策
1.次の debug メソッドを影響を受けるクラスに追加します。
void checkHeapSize(String tag) {
system.debug(tag + ': Heap size is ' + limits.getHeapSize() + ' enforced is ' + limits.getLimitHeapSize());
}

2a.コード内でこのメソッドがコールされる場所を特定するために、"tag" パラメータを使用してコード内のさまざまな場所でメソッドをコールします。例: checkHeapSize('constructor1');
 
2b.ヒープ制限をチェックするために、ループにチェックを追加し、1000 反復ごとにチェックを実行します。これを行うには、"i"というローカル変数 (つまり "integer i;") を追加し、反復ごとに増分し、次のコードを実行します。if (math.mod(i, 1000) == 0) } { call the method }

3.ヒープサイズが制限を超えているかどうかを調べるためにデバッグログを確認します。スケジュール済み一括処理での問題に関しては、開発者コンソールのテストではコードが同期実行され、制限が 6 MB と表示されますが、スケジュール済み一括処理のヒープサイズ制限は、12 MB の非同期制限です。

4.ヒープサイズが制限を超えていない場合は、ステップ 1 ~ 3 を繰り返します。制限を超えている場合は、修正が必要な問題のあるコードの部分がデバッグログで指摘されます。
 
問題のあるコードの例
retryIds = new Set<String>();
for(Process_Error__c pe : [SELECT Id, Asset_Maintenance__c, AssetId__c, Error_Messages__c, No_of_Retries__c, Is_Successful__c FROM Process_Error__c WHERE Is_Successful__c = FALSE AND Max_Retries_Reached__c = FALSE]){
            ProcessErrorMap.put(pe.AssetId__c, pe);
                if (pe.Asset_Maintenance__c != null) {
                retryIds.add(pe.Asset_Maintenance__c);
            }
}


上記のコードをトラブルシューティングするには、増大して制限を超えているヒープサイズを表示するために、checkHeapSize メソッドを 1000 反復ごとにコールできます (ステップ 2b)。上記の問題は、変数に多くのオブジェクトが追加されていることでした。この場合、retryIds によってオブジェクトが追加され、ヒープ制限に対してオブジェクトのサイズが増大し過ぎていました。ヒープサイズはオブジェクトのサイズに応じて変わるため、多数のレコードが処理される場合にヒープサイズ制限を超えないようにするには、このコードを変更する必要があります。
 
ナレッジ記事番号

000383707

 
読み込み中
Salesforce Help | Article