Java 哪些事儿

JVM系列(一):JVM内存模型

2019-07-26  本文已影响0人  疏花

一、JVM介绍

JVM(Java virtual machine)是一种虚拟机,本身用C语言编写,用来屏蔽不同操作系统的细节,使得Java代码经过一次编译即可在不同的系统上运行。如图所示:
我们用javac命令,就是将Java源文件(.java)编译成Java字节码文件(.class)文件,而jvm会把.class文件翻译成机器码以实现Java的跨平台性。
这里跟C和C++做个比较:

二、JVM的内存模型

JVM的内存模型即Java的运行时数据区,也就是Java程序在运行时,各种数据存放的地方,基本结构如图:




图一是JVM内存基本结构,分为线程共享区和非线程共享区,图二是比较详细的版本,其中堆又分为新生代和老年代,新生代又分为Eden区和两个Survivor区,下面针对图一来详细说明JVM内存结构。

  1. 非线程共享区
public class Hello {

    int add() {
        int a = 1;
        int b = 2;
        int c = a + b;
        return c;
    }

    public static void main(String[] args) {
        Hello h = new Hello();
        int result = h.add();
        System.out.println(result);
    }
}

我们用javap -c命令来对class文件进行反汇编:

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

  int add();
    Code:
       0: iconst_1
       1: istore_1
       2: iconst_2
       3: istore_2
       4: iload_1
       5: iload_2
       6: iadd
       7: istore_3
       8: iload_3
       9: ireturn

  public static void main(java.lang.String[]);
    Code:
       0: new           #2                  // class file/Hello
       3: dup
       4: invokespecial #3                  // Method "<init>":()V
       7: astore_1
       8: aload_1
       9: invokevirtual #4                  // Method add:()I
      12: istore_2
      13: getstatic     #5                  // Field java/lang/System.out:Ljava/io/PrintStream;
      16: iload_2
      17: invokevirtual #6                  // Method java/io/PrintStream.println:(I)V
      20: return
}

代码中Code下的行号,就是程序计数器了。

  1. 线程共享区
上一篇 下一篇

猜你喜欢

热点阅读