JVM虚拟机

本文详细介绍了JVM的作用和构成,包括类加载子系统、运行时数据区、双亲委派机制等核心概念。类加载过程包括加载、验证、准备、解析和初始化五个阶段。JVM的类加载器分为引导类加载器、扩展类加载器和应用程序类加载器,遵循双亲委派机制。运行时数据区包括程序计数器、虚拟机栈、本地方法栈、堆和方法区,其中堆和方法区会进行垃圾回收。文章还探讨了不同垃圾回收算法和垃圾回收器,如CMS和G1。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JVM概述

对Java程序的运行过程更加了解,中、高级程序员必备技能。

JVM作用:jvm负责将字节码文件加载到虚拟机中,再将字节码文件,解释\编译为机器码,管理运算时数据存储,垃圾回收(GC);现在的jvm还可以执行其他语言编译后的字节码文件。

JVM构成

  1. 类加载系统:负责从硬盘上加载字节码文件到JVM中
  2. 运行时数据区:按照不同的数据分区进行存储(方法区,堆,栈,本地方法栈,程序计数器)
  3. 执行引擎:将字节码再次编译/解释为机器码
  4. 本地库接口:负责调用本地操作系统方法
类加载子系统
 负责从硬盘上加载字节码文件到jvm中

类加载过程:

  1. 加载
    以二进制字节流的方式加载字节码,在内存中为类生成一个Class对象,将静态存储转为运行时存储
  2. 链接
    验证:验证字节码格式是否正确; 验证语法是否正确
    准备:准备阶段则负责为类的静态属性分配内存,并设置默认初始值
    static int a = 0; 准备阶段
    static int a = 10; 初始化阶段
    解析: 将静态文件中的指令符号引用替换成内存中直接引用
  3. 初始化
    对类的静态变量赋予正确的初始值
    类什么时候会被初始化?
    使用类中的静态变量,静态方法,在一个类中运行main方法,创建对象,使用反射加载一个类,当加载一个类的子类,而且优先加载父类

注意: 当只使用某个类中静态常量时,类不会被初始化,因为在编译阶段就初始化

	当类在加载阶段初始化完成,才说明类的整个加载过程结束.
类加载器
真正实施类加载的实现者

宏观上分为俩类:

  1. 引导类加载器(启动类加载器), 不是用java语言实现的, C/C++ jvm底层实现
  2. 其他类加载器,用java语言写的实现类, 都继承java.lang.ClassLoader

细分:

  1. 引导类加载器(启动类加载器)
    java中系统提供的类,都是由启动类加载器加载 例如String
  2. 扩展类加载器
    Java 语言编写的,由sun.misc.LauncherExtClassLoader 实现. 派生于 ClassLoader 类. jre/lib/ext 子目录(扩展目录)下加载类库
  3. 应用程序类加载器(系统类加载器)
    Java 语言编写的,由 sun.misc.Launcher$AppClassLoader 实现. 派生于 ClassLoader 类. 加载我们自己定义的类,用于加载用户类路径(classpath)上所有的类
  4. 自定义的类加载器
    例如我们自己写一个类,继承ClassLoder
    再例如tomcat这种容器,都会有自己加载类的加载器
双亲委派机制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值