. Ideally, since a character takes 2 bytes, it should hold 100M characters before exceeding the memory limit. Even if we say, few space is getting used for pointer and length, I don't know, why it is throwing error after 69926904 length.

-XX:NewRatio option allows to change the proportion, but the default value of 2 means that YoungGen will reserve 1/(2+1) part of the heap.

Java objects cannot span generations, so the maximum size of object cannot be larger than the largest generation. In your case the largest generation is OldGen: 136576K = 139853824 which is exactly the size of char[69926904] (16 bytes header + 2 * 69926904 bytes of data).