JVM总结

1、什么是JVM?

JVM 是 Java 虚拟机(Java Virtual Machine)的缩写。它是一个虚拟计算机,可以在其上运行Java程序。JVM 的主要作用有:

  1. 使Java程序在不同平台(Windows,Linux,Mac等)上运行。Java源代码(.java文件)在编译之后会生成字节码(.class文件),这个字节码文件能在不同平台上运行,这得益于JVM的存在。
  2. 管理Java程序的运行时内存分配和回收(通过GC)。
  3. 提供一个隔离的安全沙箱环境来运行Java程序。
  4. 负责Java程序的编译和执行。

总结:JVM是让Java具有“编译一次,到处运行”的特性,为Java程序提供一个跨平台的运行环境,任何一台安装了JVM 的设备,都可以运行Java程序。

2、JVM 的主要组成部 

  1.  类加载器(ClassLoader):负责加载Java类
  2. 运行时数据区(又叫JVM内存结构):分为方法区、堆区、栈区、本地方法栈区、程序计数器等
  3. 执行引擎:解释器Interpreter(字节码逐行翻译成机器码)、即时编译器JIT(直接将源代码翻译成机器码),负责执行处理运行时数据区的字节码
  4. 垃圾回收器(GC):负责内存管理和垃圾回收
  5.  本地接口:用于Java调用本地方法。
  6. 安全管理器:用于实现Java的安全机制,控制程序访问权限。

3、JVM 类加载器有哪些?

JVM 类加载器主要分为三种:

  1. 引导类加载器(Bootstrap ClassLoader):负责加载Java的核心库,使用C++编写,是最底层的类加载器。
  2. 扩展类加载器(Extension ClassLoader):负责加载javax.*目录下的jar包,开发者可以直接使用
  3. 系统类加载器(System ClassLoader):负责加载classpath环境变量所指定的jar包和类路径。开发者直接使用的类加载器,可以加载自定义的类。

4、双亲委派机制

双亲委派机制(Parent Delegation Model)是类加载器的一种架构模式。它要求除了顶层的启动类加载器外,其余的类加载器都应当有一个父类加载器。类加载器在收到类加载请求时,首先不会自己去加载类,而是把请求委派给父类加载器。只有在父类加载器无法完成类加载请求时,该类加载器才会尝试自己去加载类。比如:系统类加载器的父类加载器是扩展类加载器,扩展类加载器的父类加载器是启动类加载器。所以系统类加载器在收到加载请求时,首先会把请求委派给扩展类加载器,扩展类加载器再尝试委派给启动类加载器。只有当父类加载器都无法完成加载时,系统类加载器才会自己去加载类。

双亲委派机制的作用:

  1. 避免类的重复加载。因为父类加载器已经加载过该类,子类加载器无需再加载。
  2. 保证核心库的稳定性。启动类加载器加载的类不会被子类加载器重新加载,保证核心库的类型安全。 
  3. 防止用户自定义类替换系统核心类。系统类由启动类加载器加载,用户自定义类由系统类加载器加载,二者属于不同命名空间。

5、类加载器的作用

VM 类加载器的主要作用是将类加载到JVM 中,并将类的字节码文件转换成为JVM 识别的格式。

类加载器主要做了以下这4件事:

  1. 根据一个类的全限定名(包名+类名)查找该类的字节码文件。
  2. 将这个字节码文件内容加载到内存中,并生成一个java.lang.Class对象来表示这个类。
  3. 此Class对象将包含这个类的所有信息,如包名、父类、实现的接口、属性、方法等。
  4. 当我们调用这个类的构造方法创建对象时,会调用Class对象的newInstance()方法。

所以,类加载器的作用就是将类加载到JVM 中,为创建对象和运行程序提供必要的Class对象。类的加载是Java程序运行的基础,没有加载成功就无法创建对象和调用方法 

6、 类加载器的生命周期

  1.  加载。由类加载器根据类的全限定名(包名+类名)查找类文件的字节码,将字节码文件读入内存,并为之创建一个Class对象。
  2. 验证。校验 class 文件的正确性:
    1. 文件格式验证:检查 class 文件的结构是否正确。
    2. 元数据验证:检查 class 中各个数据的类型跟继承关系是否正确。
    3. 字节码验证:检查字节码是否合法,避免 JVM 执行非法的操作。
  3.  准备。为类变量(static变量)分配空间,并初始化为默认值。
  4.  解析。将符号引用转换为直接引用, 解析过程中,会将类中方法的符号引用转换为直接引用,是类加载的一个可选阶段,只有当一个类真正使用到另一个类的时候,解析过程才会触发。
  5. 初始化。为类变量赋予正确的初始值,初始化阶段会执行类构造器<clinit>()方法,为类变量显式赋值,父类的初始化一定在子类初始化之前完成,虚拟机会保证一个类的<clinit>() 方法在多线程环境中被正确的加锁和同步。 
  6. 使用。程序通过导类创建对象并访问类的字段和方法等。此时JVM会将指令翻译成机器代码并执行。
  7. 卸载。类的Class对象和其他存储结构被销毁。可选步骤,在垃圾回收时可能触发。

 7、JVM内存结构

共享内存:

  1. 堆(Heap):所有线程共享。用于存放对象实例,由GC回收,分为新生代和老年代:
    1. 新生代(Young Generation):分为Eden区和两个Survivor区。Eden区默认占比为8,两个Survivor区分别占比1
    2. 老年代(Old Generation):用于存放长期存活的对象。
  2. 方法区(Method Area):所有线程共享。用于存放类信息,常量,静态变量等。- 在HotSpot VM中称为Permanent Generation,简称PermGen。

私有内存:

  1. 程序计数器(PC Register):每个线程都有自己的程序计数器。用于记录当前线程执行的字节码行号。
  2. 栈(Stack):每个线程都有自己的栈。用于存储栈帧和局部变量,按后进先出方式工作。每个栈帧对应着一个方法调用。局部变量存放在栈帧中,方法调用结束后自动销毁。
  3. 本地方法栈(Native Method Stack):每个线程使用自己的本地方法栈。用于存储native方法调用信息。 

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

  1.  标记-清除算法:分为“标记”和“清除”两个阶段。
    1. 标记阶段:标记出所有需要回收的对象。
    2. 清除阶段:删除所有被标记的对象,回收内存。
    3. 优点:实现简单,效率高。缺点:会产生大量内存碎片。
  2. 复制算法:将内存分为两块,每次只使用其中一块。当这一块内存用完,就将还存活的对象复制到另一块内存,然后清理掉已使用的内存。优点:简单,无内存碎片。缺点:浪费一半的内存。
  3. 标记-整理算法:与“标记-清除”相比,在清除阶段做了优化。它会对存活和死亡对象进行整理,将内存碎片融合起来,实现内存的整理。优点:减少内存碎片。缺点:效率略低,实现较复杂。
  4. 分代收集算法:根据对象的存活周期将内存划分为几代,每代使用适当的收集算法。优点:各代使用最适合的算法,效率高。缺点:实现较复杂。 

当前JVM选用的主流算法是“分代收集算法”。它将堆内存划分为新生代和老年代:

- 新生代使用“复制算法”。因为新生代对象存活率低,可以快速回收。
- 老年代使用“标记-清理”或“标记-整理”算法。因为老年代对象存活率高,选择时间效率高的算法。

新生代和老年代内存比例通常为1:2,时间比约为10:1,也就是说,90%的时间都在回收新生代。所以,JVM选用的垃圾回收算法根据对象的存活周期采用最适合的策略,既满足快速回收的需求,也兼顾内存整理的要求。这种策略大幅减少垃圾回收时需要扫描和移动的对象数量,提高了垃圾回收效率,这是JVM具有良好性能的原因之一。

9、JVM有哪些垃圾回收器 

  1.  串行回收器(Serial Collector):单线程回收器,会暂停用户程序线程完成回收工作,默认用于客户端环境。
  2. 并行回收器(Parallel Collector):多线程回收器,会使用多个CPU核心完成回收工作,通过并行减少垃圾回收时间,默认用于服务器环境。
  3. 并发标记整理回收器(CMS Collector):多线程回收器,用户线程和垃圾收集线程同时执行。在回收时不会暂停用户程序线程,偏向于老年代的回收,用于响应时间相对较高的服务器环境。CMSCollector的缺点是可能产生较多内存碎片,且CPU资源消耗高。
  4. G1收集器(Garbage-First Collector):并发低停顿回收器,将堆内存分割成多个region,先回收优先级最高的region。在回收期间,也会有较长时间会暂停用户程序,以便完成标记、整理等工作,旨在取代CMS收集器。G1收集器的特点:
    1. -内存总体上更加规整,不会产生大量内存碎片。
    2. 收集器对CPU资源的消耗更低,扩展性更好。
    3. 暂停时间更加可控,可以根据需求调整,满足GC停顿时间的要求。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值