1.JVM的位置
Java程序运行在JVM虚拟机上
JRE包含JVM,它运行在操作系统上,操作系统运行在计算机硬件上
2.JVM体系结构
.java文件->通过javac命令,编译成class文件->类在加载的时候使用类加载器(classloader)
->加载到JVM里面,classloader在运行时数据区中加载
运行时数据区包括:方法区,堆,java栈,本地方法栈,程序计数器
->与执行引擎和本地方法接口互动
综上:JVM由类加载器,运行时数据区,执行引擎和本地方法接口构成
3.类加载器
作用:负责加载class文件(class文件就是二进制文件),class文件在文件开头有特定的文件标识 ,将class文件字节码内容加载到内存中,并将这些内容转换成方法区中的运行时数据结构并且ClassLoader只负责class文件的加载,至于它是否可以运行,则由执行引擎(Execution Engine)决定。
种类:
1 虚拟机自带的加载器
-
① 启动类加载器 也叫根加载器(Bootstrap),由C++编写 ,程序中自带的类,存储在$JAVAHOME/jre/lib/rt.jar中,如object类等
-
② 扩展类加载器 (Extension),Java 编写 ,在我们平时看到的类路径中,凡是以javax 开头的,都是拓展包,存储在$JAVAHOME/jre/lib/ext/*.jar 中
-
③ 应用程序类加载器 (AppClassLoader),即平时程序中自定义的类, new出来的
Java也叫系统类加载器,加载当前应用的classpath的所有的类
2 用户自定义加载器
Java.lang.ClassLoader的子类,用户可以定制类的加载方式,即如果你的程序有特殊的需求,你也可以自定义你的类加载器的加载方式 ,进入ClassLoader的源码,其为抽象类,因此在你定制化开发的时候,需要你定义自己的加载器类来继承ClassLoader抽象类即可,即 MyClassLoader extends ClassLoader
4.运行时数据区(5个)
1.java栈内存:存储着的是StackFrame,StackFrame包含三类信息:局部变量,执行环境,操作数栈。
2.Java堆:是用来存放对象信息的,负责存储所有对象实例和数组的
3.程序计数寄存器:是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。
4.方法区域:存放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息等
5.本地方法堆栈:JVM采用本地方法堆栈来支持native方法的执行,此区域用于存储每个native方法调用的状态。
5.JVM的垃圾回收机制(GC)
- 定义:垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制。
-
回收时间:
①会在cpu空闲的时候自动进行回收
②在堆内存存储满了之后
③主动调用System.gc()后尝试进行回收