I think it could be that those applications are using native memory which can exceed the limit (they request memory from native code).
It should be possible to do that even without native code via using a ByteBuffer and call allocateDirect. This could be validated using this hack.
Update Sadly this is only possible via native code according to this post. They've wrapped that in a java utility call. But for the commenter 'Delyan' suggests the following Java-only hack for image-processing:
BitmapFactory.Options opts = new BitmapFactory.Options();
Field field = opts.getClass().getField("inNativeAlloc");
field.setBoolean(opts, true);
but: "That said, bear in mind that this is dangerous. If the device runs out of memory, the oomkiller is going after you first. No warning, no nothing, just SIGKILL. So, more than ever, recycle everything you don't need and be very, very careful!"
Update 2 Eventually we can hack via reflections to access sun.misc.Unsafe as done in the popular Java-Chronicle project?