JVM,Java怎样实现一次编译到处运行(平台无关性)

Posted 寻找梦想的大熊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM,Java怎样实现一次编译到处运行(平台无关性)相关的知识,希望对你有一定的参考价值。

二、Java怎样实现一次编译到处运行(平台无关性)

1.java平台无关性原理

 

Java源码首先被编译成字节码,再由不同平台的JVM进行解析,JAVA语言在不同的平台上运行时不需要进行重新编译,Java虚拟机在执行字节码的时候,把字节码转换成具体平台上的机器指令。

2.为什么JVM不直接将源码进行编译成机器码去执行

1)准备工作太过繁琐

JVM每次进行编译的时候都会对源代码进行各种检查,纠错

(2)兼容性

JVM不仅仅可以给java语言编译成的class文件进行解释,还可以对任何语言,只要是解释为.class字节码都可以解释

3.查看(.class)字节码

1)准备一个简单的java文件

package com.interview.javabasic.bytecode;

public class ByteCodeSample {
    public static void main(String[] args) {
        int i=1,j=5;
        i++;
        ++j;
        System.out.println(i);
        System.out.println(j);
    }
}

 (2)javac进行编译成.class文件

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.interview.javabasic.bytecode;

public class ByteCodeSample {
    public ByteCodeSample() {
    }

    public static void main(String[] var0) {
        byte var1 = 1;
        byte var2 = 5;
        int var3 = var1 + 1;
        int var4 = var2 + 1;
        System.out.println(var3);
        System.out.println(var4);
    }
}

(3)通过javap指令查看.class文件反编译代码

 

Compiled from "ByteCodeSample.java"
public class com.interview.javabasic.bytecode.ByteCodeSample {
  public com.interview.javabasic.bytecode.ByteCodeSample();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: iconst_1
       1: istore_1
       2: iconst_5
       3: istore_2
       4: iinc          1, 1
       7: iinc          2, 1
      10: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
      13: iload_1
      14: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
      17: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
      20: iload_2
      21: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
      24: return
}

 

以上是关于JVM,Java怎样实现一次编译到处运行(平台无关性)的主要内容,如果未能解决你的问题,请参考以下文章

测试必备之Java知识———— Java基础

JVM原理与深度调优

Java基础篇(JVM)——总领

java面试题02

Java虚拟机A博娱乐(JVM)以及跨平台原理

Java初识