千家信息网

什么是JVM的类加载及内存区域

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章将为大家详细讲解有关什么是JVM的类加载及内存区域,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、JVM加载类的过程加载,加载为按需加载,主
千家信息网最后更新 2026年11月01日什么是JVM的类加载及内存区域

这篇文章将为大家详细讲解有关什么是JVM的类加载及内存区域,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

一、JVM加载类的过程

  • 加载,加载为按需加载,主线程需要用到一个类才开始加载一个类。

  • 验证,简而言之就是校验class内容是否符合指定规范

  • 准备,为类变量分配内存空间,并初始默认值。

  • 初始化,执行类的初始化代码(静态代码块,静态赋值代码),注:初始化会检验父类是否初始化,没有则必须先初始化父类。

  • 使用

  • 卸载

二、类加载器

种类

  • 启动类加载器-Bootstrap ClassLoader,用于加载Java核心类库-java安装目录下的lib目录下的class。

  • 扩展类加载器-Extension ClassLoader,用于加载java下的一些扩展类库-java安装目录lib\ext下的class。

  • 应用程序类加载器-Application ClassLoader,加载项目ClassPath下所的class。

  • 自定义类加载器,自己定义的类加载器

双亲委派机制

意思就是即优先让父ClassLoader去加载。原因是避免重复加载,保证应用的classPath下的Class对象在内存中的唯一性。

层次图

tomcat破坏双亲委派

tomcat作为java编码的web容器,本身也是在jvm中运行,怎么让基于tomcat容器的各个web应用正常运行,使得各个web应用包含的应用的class不会乱套,必须破坏双亲委派机制,为每一个web应用的class都用不同的类加载器去加载。

  • tomcat的类加载器层次图

其中:

common、catalina、shared负责加载tomcat自己的核心类库,webApp加载web应用的class(隔离web应用引用的三方类库),jsp加载器加载JSP(每个JSP文件都对应一个Jsp类加载器,jsp加载器支持热加载,即Jsp只要修改,就重新加载一次覆盖原来的jsp)。

通过tomcat的类加载机制,可以达成以下目标:

  • tomcat支持各个web引用中不同版本的三方类库相互隔离。

  • 同一个第三方类库的相同版本在不同web应用可以共享。

  • tomcat自身依赖的类库需要与应用依赖的类库隔离 。

  • jsp需要支持修改后不用重启tomcat即可生效 为了上面类加载隔离和类更新不用重启,定制开发各种的类加载器。

自定义类加载器的作用

  • 实际中,可以从Web服务器、数据库或缓存服务器获取bytes数组,这就不是系统类加载器能做到的了。

  • 可以从不同的路径中获取同一个类的不同class对象,可以实现隔离,一个复杂的程序,内部可能按模块组织,不同模块可能使用同一个类,但使用的是不同版本,如果使用同一个类加载器,它们是无法共存的,不同模块使用不同的类加载器就可以实现隔离,Tomcat使用它隔离不同的Web应用,OSGI使用它隔离不同模块。

  • 可以实现热部署。使用同一个ClassLoader,类只会被加载一次,加载后,即使class文件已经变了,再次加载,得到的也还是原来的Class对象,而使用自定义类加载器,则可以先创建一个新的ClassLoader,再用它加载Class,得到的Class对象就是新的,从而实现动态更新。

三、JVM内存区域划分

方法区(1.8之后叫metaspace-元数据空间)

存放类的元数据信息,可以理解为反射获取的Class对象的哪些信息。

程序计数器

  • 记录当前执行的class文件中字节码指令的位置

  • 与线程是一对一的关系,每个线程都会有自己的一个程序计数器

栈

一个程序计数器对应一个线程、一个线程对应一个栈、一个栈由一个个栈帧组成,一个方法对应一个栈帧,栈帧包含局部变量表、操作数栈、动态链接、方法出口(相当于结束方法时需要跳转的位置)。栈帧在调用方法的时候进栈,方法结束的时候出栈。

堆

  • 存放对象数据(上述栈中只存在对象的引用(即堆内存中对象的地址)或基本数据类型的值)

  • 所有线程共享

  • 当引用变量地址数据出栈时,堆中的内存释放由JVM控制回收

其他内存区域

  • 执行native方法会有线程对应的本地方法栈。

  • NIO中ByteBuffer类方法:allocateDirect(int capacity)-堆外分配内存空间返回DirectBuffer,通过DirectBuffer的Api可以操作堆外内存。

图示

关于什么是JVM的类加载及内存区域就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

不同 应用 内存 方法 对象 隔离 线程 数据 程序 区域 模块 代码 内容 双亲 变量 就是 文件 机制 版本 目录 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 河南云网互联网络科技有限公司 重生之互联网科技帝国 互联网科技公司税收优惠 重庆互联网络科技 互联网科技公司官网 互联网科技论坛 天扬科技互联网广告 互联网科技素材视频竖屏 四个字互联网科技公司取名 互联网科技公司实习生 消费医药和互联网科技 健康食品互联网创新科技园项目 亳州好赞互联网科技有限公司 烟台灵鸽互联网科技有限公司 深圳互联网科技的发展 城市宝互联网科技有限公司 21世纪互联网科技成就 云鲸互联网络科技有限公司 张家口科技产业互联网平台 北京互联网科技类企业分布 深圳互联网络科技有限公司 善班互联网科技 长亮科技 互联网金融 居家互联网科技有限公司 互联网科技创新企业排名 青海省互联网新科技 成都玖崟互联网科技有限公司乐商圈怎么样 未来五年的互联网科技 爱医互联网络科技 好易买互联网科技
0