JVM是运行所有java程序的抽象计算机。
在实际的计算机中,是通过软件模拟来实现JVM的,我们通常要开发java程序,需要安装jdk和jre,jre(java运行环境)就是包含了JVM的标准实现。
因为所有的java程序都是运行在JVM上的,所以常说java是一门夸平台的语言的一个原因。
1.JVM执行java程序分为三个步骤:
1)加载.class文件(我们编写的.java文件代码,执行之前先要编译成.class文件)
2)管理并分配内存
3)垃圾回收
2.JVM内存模型结构:
1)程序计数器:一块很小的内存区域,因为java是多线程的,所以多个线程并发执行时,线程之间根据时间片轮转抢夺CPU资源,所以每个线程都有一个独立的程序计数器来标记线程执行到哪里了,程序计数器就是用来记录下一条执行的指令的地址。
2)虚拟机栈:也是线程的私有内存空间,保存方法的局部变量,部分结果和参与方法的调用和返回。
3)java堆:几乎所有的对象和数组都是在堆中分配空间的。
4)本地方法栈:管理本地方法的调用,使线程可以调用本地方法。
5)方法区:这是所有线程共享的区域,用于存储类信息(类名、父类名、类修饰、常量池、方法信息)。
3.GC原理(垃圾回收原理)
垃圾收集器其实就干两件事:检测垃圾和收集垃圾。
检测垃圾:
1.引用计数法:给一个对象添加引用计数器,有地方引用它时,加1,引用失败时减1,计数为0,为垃圾。
2.可达性分析算法:以根集对象为起始点进行搜索,如果有对象不可达的话,即是垃圾对象。这里的根集一般包括java栈中引用的对象、方法区常良池中引用的对象。
收集垃圾:
1.标记、清除:标记所有需要回收的对象,然后统一回收。
2.标记清除、复制:准备两块相同大小的内存区域,垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。(这样处理可以整理内存,减少碎片)
3.分代垃圾回收策略(被普遍采用的):按对象的生命周期,划分年轻代、年老代、持久代,不同代使用不同的垃圾回收方法。
4.性能调优:
从四个方面优化:
java线程池;连接池;JVM启动参数:调整各代的内存比例和垃圾回收算法;提高吞吐量、程序算法:改进程序逻辑算法提高性能;
5.class加载过程和实例创建过程:
1.class加载:找到class文件、读取内容。
2.class连接:这里面做三件事。
1).验证:确保class文件正确。2)准备:静态变量分配内存,赋予默认值(有些变量定义时未给初值)。3)解析:class文件中符号引用替换成直接引用。
3.class初始化:给静态变量赋值。