See this eclipse bug.
The general problem is the jvm requires a contiguous block of memory for this. On windows, the process will be getting 2 Gigs, other libraries that get loaded are placed in different areas of the memory space. If a library happens to get placed in the middle, in basically cuts in half the size you can use.
The Eclipse launcher will be loading some system dlls to do graphics, and in particular, user32.dll can result in 3rd party libraries getting loaded depending what is installed on your machine (seen here).
To achieve higher memory limits, you can force the jvm to be forked into a separate process from the eclipse launcher. The jvm process won't be loading these extra libraries until after the vm has initialized its memory. Do this by using a -vm argument pointing to a javaw.exe:
eclipse -vm C:\jdk\jre\bin\javaw.exe