Might be a 2 month old post but perhaps using the debug library will yield different results than gcinfo() as gcinfo is total memory heap and seems to be global across all scripts also you cannot really confirm if garbage collection will happen after the task.wait(3) or only after the script stops running and perhaps needs to be measured with another script instance, not much documentation on gcinfo as well for this type of usage.
I know this is an old post, but for anyone wondering, I believe it has to do with the use of table.clear() as opposed to setting values to nil. Per the documentation:
"Sets the value for all keys within the given table to nil. This causes the # operator to return 0 for the given table. The allocated capacity of the table’s array portion is maintained, which allows for efficient re-use of the space.
local grades = {95, 82, 71, 92, 100, 60}
print(grades[4], #grades) --> 92, 6
table.clear(grades)
print(grades[4], #grades) --> nil, 0
-- If grades is filled again with the same number of entries,
-- no potentially expensive array resizing will occur
-- because the capacity was maintained by table.clear.
This function does not delete/destroy the table provided to it. This function is meant to be used specifically for tables that are to be re-used."