diff --git oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollector.java oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollector.java
index 9b12714..56ed6ed 100644
--- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollector.java
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollector.java
@@ -22,10 +22,13 @@ package org.apache.jackrabbit.oak.plugins.document;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.EnumSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
+
+import com.google.common.base.Function;
 import com.google.common.base.Joiner;
 import com.google.common.base.StandardSystemProperty;
 import com.google.common.base.Stopwatch;
@@ -35,10 +38,13 @@ import org.apache.jackrabbit.oak.plugins.document.util.Utils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static com.google.common.collect.Iterators.partition;
+import static com.google.common.collect.Iterators.transform;
 import static org.apache.jackrabbit.oak.plugins.document.NodeDocument.SplitDocType.COMMIT_ROOT_ONLY;
 import static org.apache.jackrabbit.oak.plugins.document.NodeDocument.SplitDocType.DEFAULT_LEAF;
 
 public class VersionGarbageCollector {
+    private static final int DELETE_BATCH_SIZE = 450;
     private final DocumentNodeStore nodeStore;
     private final VersionGCSupport versionStore;
 
@@ -50,6 +56,13 @@ public class VersionGarbageCollector {
     private static final Set<NodeDocument.SplitDocType> GC_TYPES = EnumSet.of(
             DEFAULT_LEAF, COMMIT_ROOT_ONLY);
 
+    private static final Function<String, String> PATH_TO_ID = new Function<String, String>() {
+        @Override
+        public String apply(String path) {
+            return Utils.getIdFromPath(path);
+        }
+    };
+
     VersionGarbageCollector(DocumentNodeStore nodeStore,
                             VersionGCSupport gcSupport) {
         this.nodeStore = nodeStore;
@@ -90,7 +103,7 @@ public class VersionGarbageCollector {
     }
 
     private void collectDeletedDocuments(VersionGCStats stats, Revision headRevision, long oldestRevTimeStamp) {
-        List<String> docIdsToDelete = new ArrayList<String>();
+        List<String> docPathsToDelete = new ArrayList<String>();
         Iterable<NodeDocument> itr = versionStore.getPossiblyDeletedDocs(oldestRevTimeStamp);
         try {
             for (NodeDocument doc : itr) {
@@ -99,10 +112,10 @@ public class VersionGarbageCollector {
                 //this node has not be revived again in past maxRevisionAge
                 //So deleting it is safe
                 if (doc.getNodeAtRevision(nodeStore, headRevision, null) == null) {
-                    docIdsToDelete.add(doc.getId());
+                    docPathsToDelete.add(doc.getPath());
                     //Collect id of all previous docs also
                     for (NodeDocument prevDoc : ImmutableList.copyOf(doc.getAllPreviousDocs())) {
-                        docIdsToDelete.add(prevDoc.getId());
+                        docPathsToDelete.add(prevDoc.getPath());
                     }
                 }
             }
@@ -110,16 +123,21 @@ public class VersionGarbageCollector {
             Utils.closeIfCloseable(itr);
         }
 
-        Collections.sort(docIdsToDelete, PathComparator.INSTANCE);
+        Collections.sort(docPathsToDelete, PathComparator.INSTANCE);
 
         if(log.isDebugEnabled()) {
             StringBuilder sb = new StringBuilder("Deleted document with following ids were deleted as part of GC \n");
-            Joiner.on(StandardSystemProperty.LINE_SEPARATOR.value()).appendTo(sb, docIdsToDelete);
+            Joiner.on(StandardSystemProperty.LINE_SEPARATOR.value()).appendTo(sb, docPathsToDelete);
             log.debug(sb.toString());
         }
-        nodeStore.getDocumentStore().remove(Collection.NODES, docIdsToDelete);
+
+        Iterator<List<String>> idListItr = partition(transform(docPathsToDelete.iterator(), PATH_TO_ID), DELETE_BATCH_SIZE);
+        while (idListItr.hasNext()) {
+            nodeStore.getDocumentStore().remove(Collection.NODES, idListItr.next());
+        }
+
         nodeStore.invalidateDocChildrenCache();
-        stats.deletedDocGCCount += docIdsToDelete.size();
+        stats.deletedDocGCCount += docPathsToDelete.size();
     }
 
     public static class VersionGCStats {
@@ -139,4 +157,5 @@ public class VersionGarbageCollector {
                     '}';
         }
     }
+
 }
