The paper focuses on the loop-level parallelism of bytecode on a distributed shared memory (DSM) system, which is built on a cluster of multiprocessors. We define a new attribute called 'Loop Attribute' to record the information of Java loops. When first loading a Java program, our Java virtual machine, called ES-JVM, checks and analyzes the loops of the bytecode dynamically, handles the data dependence of loops, and records the information as the loop attributes. ES-JVM uses the virtual shared memory and synchronization mechanisms provided by the DSM system to maintain the memory consistency. Before ES-JVM interprets the loops of the bytecodes, it dispatches the workload of loops to the interpreter threads at all nodes according to the loop attributes and the number of threads. After distributed and parallel execution of the loops, ES-JVM continues to interpret the rest of the bytecodes of the Java program. Finally, ES-JVM saves the loop attributes in a new class file for the next run. Our research shows that distributed and parallel execution of loops of a Java program could improve performance.