how JVM works