There is no memory leak. The garbage collector just doesn't run, which is a difference.
If you reduce your duration (e.g. 2 milliseconds), you'll see your memory usage rise until it reaches a certain point (500MB on my machine, but your mileage may vary). Apparently, at this point the garbage collector runs and frees the unused memory, reducing the memory usage to almost zero. Then it rises again etc. etc.
As for why the garbage collector doesn't run, I don't really know. There seems to be no specification or documentation how the GC works.
At least, your memory isn't lost and will be recycled, if needed. So - your code is fine.