Java 虚拟机( Java Virtual Machine,缩写为 JVM ):是一种可以运行 Java 程序的抽象计算机。 git
特色:实现 Java 平台无关性,使得编译后的 Java 程序指令并不直接在硬件系统的 CPU 上执行,而由 JVM 执行。JVM 屏蔽了与具体操做系统平台相关的信息,使得 Java 程序只需生成在 Java 虚拟机上运行的目标代码(字节码),再由 JVM把字节码解释成具体平台上的机器指令执行,就能够在多种平台上不加修改地运行。github
Java 虚拟机在执行 Java 程序的过程当中会把它所管理的内存划分为若干个不一样的数据区域,如下是 Java 虚拟机所管理的运行时数据区:数组
和 pc 寄存器来存放下一条指令地址相似,JVM 的程序计数器可看做当前线程所正在执行(不是下一条)的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工做时能够经过改变这个计数器的值来选取下一条须要执行的字节码指令。多线程
Java 虚拟机的多线程是经过线程轮流切换并分配处理器执行的时间来实现的,在任何肯定的某个时刻,一个处理器都只会执行一条线程中的指令。所以,为了线程切换后能恢复到正确的执行位置,每条线程都有一个独立的程序计数器,即线程私有。spa
描述了 Java 方法 执行的内存模型,即存放每一个方法执行时建立的栈帧,用于存放局部变量表、操做数栈、动态连接、返回地址等信息,线程私有。操作系统
相似于 Java 虚拟机栈执行 Java 方法服务,本地方法栈则为虚拟机使用到的 Native 方法服务,线程私有。线程
存放分配的对象实例及数组,能够处于物理上不连续的内存空间,只要逻辑连续便可,线程共享,区域主要由垃圾收集器管理。code
存储一个类的结构信息,例如运行时常量池、成员变量和方法数据等,线程共享。
注意:方法区≠永久代(Permanent Generation),仅仅是由于HotSpot虚拟机中使用永久代来实现方法区,以此像管理堆内存同样来管理方法区而已。对象
方法区的一部分,用于存放编译期间生成的各类字面量(文字所表示的取值,即固定值,对于 String 而言,形如 String str="hello"
这种属于字面量,有专门的字符串池进行保存,形如String str = new String("hello")
这种不属于字面量,则是在堆上分配)和符号引用(至关于Linux中一个文件的软连接,在该类实际执行时,才把符号引用转为直接引用)。内存
本文发表于我的博客:http://lavnfan.github.io/,欢迎指教。