The reason that the JVM does not use a return from main is that Java supported multi-threading in the language and restricting the return of an exit code to just the single thread that started the app is way too cumbersome. C on the other hand actually had zero support for threads (threads are handled in libraries, not the language) so being inherently single threaded it made sense to use a return value from main.