자바 프로그램의 실행은 운영체제의 가상 머신(Virtual Machine) 위에서 인터프리터 방식으로 작동하므로 프로그램의 속도가 떨어진다는 단점도 지적된다. 이러한 단점은 자바를 시스템에 독립적인 언어로 만들기 위해 감수해야 할 비용이다.
자바는 시스템에 독립적(system independence)이다. 즉 자바 언어는 시스템의 호환성을 갖는다. 단순히 문법상의 호환이 아니라 하나의 플랫폼에서 만든 자바 프로그램은 다른 플랫폼에서 어떤 작업 없이 수행이 가능하다. 마이크로소프트의 윈도우 플랫폼에서 개발된 자바 프로그램 역시 리눅스(Linux)나 서버 계열의 유닉스(Unix) 시스템에서도 아무 수정 없이 수행이 가능하다. 바로 이것이 'Write Once, Run Anywhere'라는 자바의 철학이다. 즉 '한 번 작성된 프로그램은 어디서든 실행된다'라는 것은 기존의 프로그래밍 방식을 전환하는 획기적인 프로그래밍 패러다임인 것이다.
시스템에 독립적인 특징을 가능하게 하는 요소가 자바 가상 기계(Java Virtual Machine)와 자바 바이트코드(Java Bytecode) 개념이다. 하나의 플랫폼에서 자바 언어를 이용한 원시 파일인 자바 소스를 컴파일하면 바이트코드 파일이 생성된다. 즉 바이트코드는 다양한 하드웨어 및 소프트웨어 플랫폼에서 효율적으로 실행하기 위해 설계된 구조 중립적인(achitecture neutral) 중간 형태의 이진 파일이다.
하나의 플랫폼에서 만들어진 자바 바이트코드가 모든 플랫폼에서 실행될 수 있도록 하는 것이 자바 가상 기계(Java Virtual Machine)이다. 이 자바 가상 기계가 각종 플랫폼에 소프트웨어나 하드웨어로 존재하여 그 플랫폼에서 바이트코드가 실행될 수 있도록 하는 역할을 담당한다. 즉 자바 가상 기계는 바이트코그다 실행될 수 있도록 돕는 가상적인 컴퓨터이다.