一、JVM是什么
大白话:
全称Java Virtual Machine(Java虚拟机), 它是一个虚构出来的计算机, 通过实际的计算机来模拟各种计算机的功能.
专业版:
JVM是一个进程, 用来模拟计算单元, 将.class字节码文件转成计算机能够识别的指令.
二、JVM类加载机制
1、java虚拟机的运行流程
2、类加载机制
三、 JVM的内存模型(方法区, 堆区, 栈区, 程序计数器)
类加载器是用来加载字节码文件的, 那加载完字节码文件之后, 就要运行起来
1) A.class字节码文件被加载到内存. //存储在方法区中, 并且方法区中也包含常量池.
2) 创建本类的实例对象, 存储在堆中(heap)
3) 通过对象名.的形式调用方法, 方法执行过程是在: 虚拟机栈中完成的. //一个线程对应一个虚拟机栈, 每一个方法对应一个: 虚拟机栈中的栈帧
4) 程序计数器区域记录的是当前程序的执行位置, 例如: 线程1: print(), 第3行
5) 将具体要执行的代码交给: 执行引擎来执行.
6) 执行引擎调用: 本地库接口, 本地方法库来执行具体的内容. //这部分了解即可, 用native修饰的方法都是本地方法.
7) 本地方法栈: 顾名思义, 就是本地方法执行的区域.(C语言, 外部库运行的空间)
8) 直接内存: 大白话翻译, 当JVM内存不够用的时候, 会找操作系统"借点"内存
四、 线程安全和内存溢出的问题
五、JDK1.7的堆内存的垃圾回收算法
JDK1.7 将堆内存划分为3部分: 年轻代, 年老代, 持久代(就是方法区).
年轻代又分为三个区域: //使用的是 复制算法(需要有足够多的空闲空间).
Eden: 伊甸园
//存储的新生对象, 当伊甸园满的时候, 会将存活对象复制到S1区.
//并移除那些垃圾对象(空指针对象).
Survivor: 幸存者区1
//当该区域满的时候, 会将存活对象复制到S2区
//并移除那些垃圾对象.
Survivor: 幸存者区2
//当该区域满的时候, 会将存活对象复制到S1区.
//并移除那些垃圾对象.
大白话翻译:
s1区 和 s2区是来回互相复制的.
年老代: //使用的是标记清除算法, 标记整理算法.
//当对象在S1区和S2区之间来回复制15次, 才会被加载到: 年老代.
//当年轻代和年老代全部装满的时候, 就会报: 堆内存溢出.
持久代: //就是方法区
存储常量, 类的描述信息(也叫: 元数据).