从0开始回顾JVM---系列四

简介: 虚拟机执行1、类的生命周期吗?一个类从被加载到虚拟机内存中开始,到从内存中卸载,整个生命周期需要经过七个阶段:加载 、验证、准备、解析、初始化 、使用 和 卸载,其中验证、准备、解析三个部分统称为连接。2、什么是类加载?类加载的过程?类加载: 虚拟机把描述类的数据加载到内存里面,并对数据进行校验、解析和初始化,最终变成可以被虚拟机直接使用的class对象。类加载过程如下:● 加载:1、根据类的全限定类名获取二进制字节流;2、将字节流代表的静态存储结构转为方法区运行时存储数据结构;3、在堆中生成Class对象,作为方法区这个类数据访问入口;● 验证: 检验加载的class文

虚拟机执行

1、类的生命周期吗?


一个类从被加载到虚拟机内存中开始,到从内存中卸载,整个生命周期需要经过七个阶段:加载验证准备解析初始化使用卸载,其中验证、准备、解析三个部分统称为连接。

2、什么是类加载?类加载的过程?


类加载: 虚拟机把描述类的数据加载到内存里面,并对数据进行校验、解析和初始化,最终变成可以被虚拟机直接使用的class对象。

类加载过程如下:

  • 加载:1、根据类的全限定类名获取二进制字节流;2、将字节流代表的静态存储结构转为方法区运行时存储数据结构;3、在堆中生成Class对象,作为方法区这个类数据访问入口;
  • 验证: 检验加载的class文件正确性(修饰符、权限)
  • 准备: 为类的静态变量分配内存并设置类变量初始值;
  • 解析: 将常量池中符号引用转为直接引用(class文件常量池转至方法区运行时常量池)
  • 初始化: 对类的静态变量和静态代码块执行初始化工作

3、什么是类加载器?常见的类加载器有哪些?


类加载器是指:通过一个类的全限定性类名获取该类的二进制字节流叫做类加载器。

类加载器分为以下四种:

  • 启动类加载器:  用来加载java核心类库,无法被java程序直接引用;(JAVA_HOME/lib 如rt.jar)
  • 扩展类加载器用来加载java的扩展库(JAVA_HOME/jre/lib/ext)
  • 系统类加载器加载用户类路径ClassPath下的类
  • 用户自定义加载器由java语言实现,继承自ClassLoader;

4、什么是双亲委派模型?为什么需要双亲委派模型?


当一个类加载器收到一个类加载的请求,它首先不会尝试自己去加载,而是将这个请求委派给父类加载器去加载,只有父类加载器在自己的搜索范围内查找不到此类时,子加载器才会尝试自己去加载该类。

原因:

  • 这是为了防止我们将来使用核心类中相同的包名和类名创建类,此时如果没有双亲委派机制,加载了我们自写的类,可能会对代码有很大影响,如果使用双亲委派机制加载了核心类库中的该类,就不会再加载相同名称的我们自写的类了,确保类加载的安全

那怎么打破双亲委派模型?

  • 自定义类加载器,继承ClassLoader类,重写loadClass方法和findClass方法。
  • 线程上下文类加载器。
  • Tomcat,应用的类加载器优先自行加载应用目录下的 class,并不是先委派给父加载器,加载不了才委派给父加载器。

5、热部署实现原理?


热部署概述:

  • 对于Java应用程序来说,热部署就是在运行时更新Java类文件。也就是不重启服务器的情况下实现java类文件的替换修改等 。

作用

  • 可以不重启应用的情况下,更新应用。举个例子,就像电脑可以在不重启的情况下,更换U盘。  

原理

  • 简单一句话让JVM重新加载新的class文件!

在类加载器中,Java类只能被加载一次,并且无法卸载。因此我们可以考虑直接把类加载器给换了,自定义类加载器,并重写ClassLoader的findClass方法。想要实现热部署可以分以下三个步骤:

  1. 销毁原来的自定义ClassLoader;
  2. 更新class类文件;
  3. 创建新的ClassLoader去加载更新后的class类文件。    

6、Class文件结构?

7、为什么有垃圾收集还会有内存泄漏问题?


对象定义在错误的范围

  • 如果长生命周期的对象持有短生命周期的引用,就很可能会出现内存泄露。

异常处理不当

  • 各种资源的关闭一定要放在finally里面。

8、堆和栈有什么区别?


  1. 申请方式
  • stack: 由系统自动分配。
  • heap: 需要程序员自己申请,并指明大小
  1. 申请效率
  • stack:由系统自动分配,速度较快,但程序员是无法控制的。
  • heap:由 new 分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。
  1. 大小限制
  • stack:栈顶的地址和栈的最大容量是系统预先规定好的。
  • heap:堆的大小受限于计算机系统中有效的虚拟内存,运行期间确定,因此比较灵活。
  1. 存贮内容
  • stack:存贮局部变量表,操作数栈
  • heap:存贮对象实例与数组
相关文章
|
13天前
|
人工智能 自然语言处理 文字识别
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
Qwen3.7-Max是阿里云百炼面向智能体时代推出的新一代旗舰模型,对标GPT-5.5、Claude Opus 4.7等闭源旗舰。该模型支持百万级token上下文窗口,具备顶级推理能力、多模态搜索与视觉理解增强、流式输出低延迟响应等核心优势,覆盖编程、办公、长周期自主执行等复杂场景。同时支持OpenAI接口兼容,便于系统快速迁移。用户可通过Token Plan团队或节省计划等订阅方式灵活调用,适合企业级高要求场景使用。
5295 28
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
|
8天前
|
存储 定位技术 数据库
CodeGraph 如何让 Claude Code减少 7 成工具调用?
CodeGraph 为 Coding Agent 提供本地代码知识图谱,把函数、类、调用链和框架路由提前整理成“项目地图”,减少盲目搜索和文件读取。它不是新 Agent,而是上下文基础设施,让 Agent 更快找到正确代码路径,平均减少 7 成工具调用。
1045 1
|
15天前
|
人工智能 自然语言处理 供应链
|
5天前
|
人工智能 安全 定位技术
CodeGraph深度解析 让Claude Code工具调用直降七成的核心原理与实操教程
如今以Claude Code为代表的AI编程智能体已经成为开发者日常编码、项目重构、漏洞修复的必备工具。但在长期使用过程中,几乎所有开发者都会遇到同一个明显痛点:AI虽然具备强大的代码生成与分析能力,却常常陷入盲目探索的循环中。
737 1
|
21天前
|
人工智能 开发工具 iOS开发
Claude Code 新手完全上手指南:安装、国产模型配置与常用命令全解
Claude Code 是一款运行在终端环境中的 AI 编程助手,能够直接在命令行中完成代码生成、项目分析、文件修改、命令执行、Git 管理等开发全流程工作。它最大的特点是**任务驱动、终端原生、轻量高效、多模型兼容**,无需图形界面、不依赖 IDE 插件,能够深度融入开发者日常工作流。
3780 15
|
17天前
|
人工智能 Linux BI
国内用 Claude Code 终于不用翻墙了:一行命令搞定,自动接 DeepSeek
JeecgBoot AI专题研究 一键脚本:Claude Code + JeecgBoot Skills + DeepSeek 全平台接入 一行命令装好 Claude Code + JeecgBoot Skills + DeepSeek 接入,无需翻墙使用 Claude Code,支持 Wind
3452 10
国内用 Claude Code 终于不用翻墙了:一行命令搞定,自动接 DeepSeek

热门文章

最新文章