假想:Java虚拟机并不是真正的物理机,JVM 是运行在操作系统之上的,它与硬件没有直接的交互。Java被称为解释性语言:JVM执行字节码过程由一个循环组成——不停加载程序,先进行合法性和安全性检查,然后解释执行代码(字节码 —> 平台机器代码),交给计算机执行,直到程序结束。跨平台:字节码是一种与平台无关的代码,Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。(一次编译,多次运行) (二)执行过程
- Java 源文件(.java) —> 编译器 —> 字节码文件(.class)字节码文件 —> JVM —> 机器码
程序计数器:当前线程所执行的字节码的行号指示器(每个线程独立拥有自己的);虚拟机栈:包含多个栈帧,单方法调用结束时,栈帧才会被销毁;本地方法栈:与虚拟机栈相似,虚拟机栈为执行 Java 方法服务, 而本地方法栈则为 Native 方法服务;堆:运行时数据区;方法区:用于存储被 JVM 加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。(static、final、class、常量池)。
三、栈Native
凡是带了native关键字的,说明java的作用范围到达不了,回去调用底层C语言的库!
会进入本地方法栈
调用本地方法接口 :JNI
JNI作用:扩展java的使用,融合不同的编程语言为java所用
栈帧:
存储局部变量表:8个基本数据类型、对象引用地址、returnAddress类型;操作数栈:用于操作动态链接:其他方法方法出口:return或异常…
对象在栈中只是存一个引用,指向堆中的具体对象。
四、JVM运行时内存
一个JVM只有一个堆内存,可以调节的。
OOM是一般是堆爆了。
MinorGC(新生代GC):复制算法 复制—>清空—>互换MajorGC(老年代GC):标记清除算法元数据区(永久代):不在虚拟机中,使用本地内存 五、垃圾回收(GC) (一)垃圾确定
- 引用计数法:
(1) 被引用则次数+1;
(2)可能有循环问题。可达性分析
(1)与引用对象之间建一条路径;
(2)两次不可达才可GC。
- 标记清除算法(Mark-Sweep)
(1)标注:存活对象、未使用、可回收;
(2)清除:可回收区域回收。
(3)碎片化问题!复制算法(copying)
(1)内存划分为两块:一块使用,另一块复制时用的,这样碎片化得到解决。
(2)内存使用率太低!标记整理算法(Mark-Compact)
将清理对象清除,存活对象移向内存的一端。分代收集算法
(1)新生代——复制算法
(2)老年代——标记整理算法(新生代中年龄达15才会进入老年代)
- 加载:在内存中生成一个代表这个类的 java.lang.Class 对 象,作为方法区这个类的各种数据的入口。连接
(1)验证:确保 Class 文件的字节流中包含的信息是否符合当前虚拟机的要求。
(2)准备:在方法区中分配变量所使用的内存空间。
(3)解析:虚拟机将常量池中的符号引用替换为直接引用的过程。初始化
执行类构造器方法的过程使用卸载
启动类加载器(Bootstrap ClassLoader):是使用C++实现的,无法被Java程序直接引用,它负责加载核心JavaClass(即所有Java.*开头的类)。因此如果Bootstrap ClassLoader,用getClassLoader获得的是null。扩展类加载器(Extension ClassLoader)应用程序类加载器(Application ClassLoader) (三)双亲委派机制
- 双亲委派机制:安全。
(1)外层恶意同名类得不到加载而无法使用;
(2)严格通过包来区分访问域。APP-EXC-BOOT过程:
(1)类加载器收到类加载的请求
(2)将这个请求向上委托给父类加载器去完成,一直向上委托,直到启动类加载器
(3)启动加载器检查是否能够加载当前这个类,能加载就结束,使用当前的加载器,否则,抛出异常,通知子加载器进行加载
(4)重复步骤3



