概念:
Java虚拟机:用来解释执行Java字节码文件的虚拟计算机,它拥有独立的运行机制。其运行的java字节码未必是由Java语言编译而成。
jvm的位置:
jvm是运行二进制字节码和操作系统交互,没有与硬件的直接交互。
作用:
Java虚拟机是二进制字节码的运行环境,负责把二进制字节码装载到其内部,解释/编译成相应的机器指令执行。
每一条Java指令,java虚拟机中都有详细的定义,比如怎么拿到操作数、怎么处理操作数、结果存放在哪里等等。
特点:
一次编译,到处运行。
自动内存管理。
自动垃圾回收。
jvm内存结构概览
方法区和堆区时所有线程共享的区域,而Java栈、本地方法栈、程序计数器是线程私有的区域;
方法区(永久代)在jdk8中又叫做元空间Metaspace,方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器(JIT编译器,英文写作Just-In-Time Compiler)编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做 Non-Heap(非堆),目的应该是与 Java 堆区分开来。
在JDK1.7之前运行时常量池逻辑包含字符串常量池存放在方法区, 此时hotspot虚拟机对方法区的实现为永久代
在JDK1.7 字符串常量池被从方法区拿到了堆中, 这里没有提到运行时常量池,也就是说字符串常量池被单独拿到堆,运行时常量池剩下的东西还在方法区, 也就是hotspot中的永久代
在JDK1.8之后JVM 已经将运行时常量池从方法区中移了出来,在 Java 堆(Heap)中开辟了一块区域存放运行时常量池。同时在 jdk 1.8中移除整个永久代,取而代之的是一个叫元空间(Metaspace)的区域。
Java代码的执行流程:
Java程序--javac编译-->字节码文件----->类加载子系统(数据加载到方法区、内存中生成java.lang.class对象作为各种数据访问口)----->运行时数据区----->执行引擎(解释执行)----->操作系统执行的具体指令