Java虚拟机新手困惑:在编译java时何时调用虚拟机

时间:2013-07-18 06:02:31

标签: java jvm

我刚刚开始学习java进入android编程 我假设我使用java编译的所有东西都被编译为java字节码,必须由虚拟机解释。所以javac filename.java生成filename.class,其中包含要由JVM解释的字节码(至少我认为是这样,我将使用java filename.class运行此类文件)。但是,如果我写这样的话,

public class Arrays { 
  public static void main(String[] args) { 
    int[] a1 = { 1, 2, 3, 4, 5 }; 
    int[] a2; 
    a2 = a1; 
    for(int i = 0; i < a2.length; i++) 
      a2[i]++; 
    for(int i = 0; i < a1.length; i++) 
      System.out.println( 
        "a1[" + i + "] = " + a1[i]); 
  } 
}  

它只是在控制台上显示一些消息,看起来与C / C ++输出没什么不同。这真的只是一个C / C ++程序,还是Windows仍然在后台以某种方式调用VM?我知道浏览器需要安装VM才能运行

import javax.swing.*; 
import java.awt.*; 

public class Applet1 extends JApplet { 
  public void init() { 
    getContentPane().add(new JLabel("Applet!")); 
  } 
}  

但是其他基于控制台的基本程序呢?再一次,继续前进到android,在这种情况下VM的调用究竟是什么?或者我们应该将Android操作系统视为运行VM的非常精细的浏览器,我们使用java代码执行的任何操作都会在此VM中执行?

4 个答案:

答案 0 :(得分:7)

Javac(compile)不会调用VM,它只会将您的java代码转换为字节码。而Java(运行时)调用VM。

将JVM视为一个可以在操作系统中安全地执行java程序的环境。请注意,您的java可执行文件是调用VM的,它将在您的操作系统中运行某些任务(例如,Windows / Android内核)。

这就是为什么Java有一个口号“一次编写运行”,因为只要有一个为操作系统提供的JVM,java字节码就能在该操作系统中运行。

enter image description here

答案 1 :(得分:1)

  

这真的只是一个C / C ++程序,还是Windows仍然在后台以某种方式调用VM?

当您与控制台交互时,您无法区分它是Java还是c / c ++程序。但是你的java源代码已被编译为字节代码(.class文件),然后在JVM上运行。您知道命令javac,还有另一个名为java的命令,它启动JVM并运行您的程序。

在您的情况下,当您运行程序时,IDE会调用命令java,后者会在Windows上启动JVM。 JVM可以通过调用Windows API来解释System.out.println()以在控制台上显示内容。

  

据我所知,浏览器需要安装此类虚拟机才能运行,但其他基于控制台的基本程序呢?

事实上,在运行任何java程序之前,我们必须在每个操作系统上安装JVM。对于浏览器,它只是一个调用操作系统上安装的JVM的插件。与其他Windows媒体播放器插件一样,您必须先安装合适的Windows媒体播放器。

  

再一次,转向android,在这种情况下VM究竟会被调用吗?或者我们应该将Android操作系统视为运行VM的非常精细的浏览器,我们使用java代码执行的任何操作都会在此VM中执行?

因此,Android OS不是浏览器而是操作系统。它集成了JVM,您可以立即运行java程序。

答案 2 :(得分:0)

是的,.class文件是JVM字节码。 JVM(由java foofoo.class调用)将字节码(在运行时将字节码JIT解释为本地机器代码)字节码。

答案 3 :(得分:0)

Java编译器(javac)是用Java实现的,它位于jdk / lib / tools.jar中。当我们启动javac时,它调用JVM(JVM在本机代码中实现,在Windows的情况下是jvm.dll)并使用它运行编译器类。