JVM相关知识点整理(自学)

1、JVM内存模型:

1)方法区:
① 有时候也称为永久代,但是并不代表不发生GC,在这里进行的GC主要是对方法区里的常量池和对类型的卸载;
② 方法区主要用来存储已被虚拟机加载的类的信息、常量、静态变量和即时编缉译器编译之后的代码等数据;
③ 该区域是被线程共享的;
④ 方法区里有一个运行时的常量池,用于存放静态编译产生的字面量和符号引用。该常量池具有动态性,也就是说常量并不一定是编译时确定,运行时生成的常量也会存在这个常量池中。
2)虚拟机栈:
① 即平时所称的栈内存,它为Java方法服务,每个方法在执行的时候都会创建一个栈桢,用于存储局部变量表、操作数栈、动态链接和方法出口等信息;
② 虚拟机栈是线程私有的,它的生命同期与线程相同;
③ 局部变量表里存储的是基本数据类型、returnAddress类型(指向一条字节码指令的地址)和对象引用,这个对象引用有可能是指向对象起始地址的一个指针,也有可能是代表对象的句柄或者与对象相关联的位置。局部变量所需的内存空间在编译器间确定;
④ 操作数栈的作用主要用来存储运算结果以及运算的操作数,它不同于局部变量表通过索引来访问,而是压栈和出栈的方式。
⑤ 每个栈桢都包含一个指向运行时常量池中该栈桢所属方法的引用,持有这个引用是为了支持方法调用过程中的动态链接。动态链接就是将常量池中的符号引用在运行期转化为直接引用。
3)本地方法栈:
和虚拟机栈类似,只不过本地方法栈为Native方法服务。
4)堆:
是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区城,在虚拟机启动时创建,几乎所有的对象实例都在这里创建(分配内存),因此该区域经常发全垃圾回收操作。
5)程序计数器:
① 内在空间小,当前线程所执行的字节码的行号指示器,用于记录正在执行的虚拟机字节指令地址;
② 字节码解释工作时通过改变这个计数值可以选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理和线程恢复等功能都需要依赖这个计数器完成。
③ 该区域是唯一一个 Java虚拟机规范没有规定任何OOM情况的区域。

2、Java类加载机制

虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的Java类型。

3、什么是类的加载?

类的加载指的是将类的 .class 文件中的二进制数据读入内存中,将其放在运行时数据区域的方法区内,然后在堆区创建一个 java.lang.Class 对象,用来封装类在方法区内的数据结构。
【类的加载的最终产品是位于对区中的 Class对象,Class对象封装了类在方法区内的数据结构,并向Java程序员提供了访问方法区内的数据接口。】
【只有Java虚拟机才会创建class对象,并且是一一对应的关系,这样才能通过反射找到相应的类信息】

4、类的加载过程:加载、连接(验证、准备、解析)、初始化

1)加载:
通过一个类的全限定名获取该类的二进制流,将该二进制流中的静态存储结构转化为方法去运行时的数据结构,在内存中生成该类的class对象作为该类的数据访问入口;
2)连接:
① 验证:目的是为了确保class文件的字节流中的信息不会危害到虚拟机,主要完成四种验证:文件格式验证、元数据验证、字节码验证、符号引用验证。
② 准备:为类的静态变量分配内存,并将其初始化为默认值。
③ 解析:把类中的符号引用转换为直接引用。
3)初始化:
为类的静态变量赋予正确的初始值。这是类加载的最后一步,前面的类加载过程,除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,其余动作均由JVM虚拟机主导和控制,到了初始化阶段,才真正开始执行类中定义的Java程序代码。

5、类加载器

类加载器是把类文件加载到虚拟机中,即通过类的全限定名来获取该类的二进制字节流(的代码块)。
1)启动类加载器(Bootstrap ClassLoader):
用来加载Java核心类库,无法被Java程序直接引用。
2)扩展类加载器(Extension ClassLoader):
用来加载Java的扩展库,Java虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载Java类。
3)应用程序类加载器(Application ClassLoader):
负责加载用户类路径所制定的类库,可以直接使用这个类加载器。

6、双亲委派模型

如果一个类加载器收到了类加载的请求,他首先不会自己去加载这个类,而是把这个请求委派给父类加载器去完成,每个类加载器都是如此,这样所有的加载请求都会被传送到顶层的启动类加载器中,只有当父加载无法完成加载请求(他的搜索范围中没找到所需的类)时,子类加载器才会尝试自己去加载。

7、Java垃圾回收机制(GC)

在Java中程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行。在JVM中,有一个垃圾回收线程,他是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时才会触发执行,扫描那些没有被任何引用的对象,并将它们添加到要回收的集合中进行回收。

8、JVM有哪些垃圾回收算法?

1)标记—清除算法:
① 首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象;
② 优点:实现简单,不需要对象进行移动;
③ 缺点:效率不高,会产生碎片。
2)复制算法:
① 将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉;
② 优点:按顺序分配内存即可,实现简单,运行高效,不用考虑内存碎片;
③ 缺点:可用的内存大小缩小为原来的一半,对象存活率高时会频繁进行复制。
3)标记—整理算法(标记—压缩算法):
① 首先标记出所有需要回收的对象,在标记完成后让所有存活的对象都向一端移动,然后直接清除掉端边界以外的内存;
② 优点:解决了标记—清理算法存在的内存碎片问题;
③ 缺点:需要进行局部对象移动,一定程度上降低了效率。
4)分代(收集)算法:
根据对象存活周期的不同将内存划分为几块,一般是新生代和老年代,然后根据各个年代的特点采用最适当的收集算法。新生代基本采用复制算法,老年代采用标记—整理算法。

9、垃圾回收器

1)CMS 收集器:
基于“标记—清理”算法实现的,是一种以获取最短回收停顿时间为目标的收集器;
2)G1 收集器:
是一款面向服务端应用的垃圾收集器;
3)两者区别:
① CMS 收集器是老年代的收集器,可以配合新生代的Serial 和 ParNew 收集器一起使用;
② G1 收集器收集范围是老年代和新生代,不需要结合其他收集器使用;
③ CMS 收集器是以最短回收停顿时间为目标的收集器;
④ G1 收集器可预测垃圾回收的停顿时间;
⑤ CMS 收集器是使用“标记—清除”算法进行的垃圾回收,容易产生内存碎片;
⑥ G1 收集器使用的是“标记—整理”算法,进行了空间整合,降低了内存空间碎片。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FF小迷糊吖~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值