当前位置: 首页 > news >正文

复习JVM

JVM的三个主要主题:

1.java内存区域划分:

a. 堆 b. 栈 c. 元数据区 d. 程序计数器

2. 类加载 

a. 加载: 打开.class文件, 读取内容

b. 验证: 验证.class文件的格式是否符合要求.

c. 准备: 给类对象分配内存空间

d. 解析: 初始化字符串常量

e. 初始化: 对类对象中的各个部分初始化,比如 静态代码块, 静态成员的初始化等

经典面试题: 双亲委派模型

他出现在 " 加载" 环节,根据"全限定名称" 寻找对应的.class文件, JVM中内置了三个类加载器: 

1. BootstrapClassLoader  2. ExtensionClassLoader 3. ApplicationClassLoader

未找到: ClassNotFoundException.

3. 垃圾回收机制 GC

两个步骤: 

1.找到垃圾 (判断是否有引用指向它)

a. 引用计数 : 在对象中维护一个计数器, 如果计数器不为0,则有引用,否则无引用,标记为垃圾

缺点: 消耗额外内存

循环引用:   两个对象互相引用,计数器就永远不为0,

b. 可达性分析(JVM采用的方式) : 

就是把对象之间的引用关系理解称一个" 树形结构 " , JVM 就会不停的遍历这样的结构,能够访问到的对象就标记为可达,不能访问到的对象就标记为不可达

2.释放对应的内存

a. 标记-清除 : 

将标记为垃圾的对象对应的内存释放掉

b. 复制算法:

将分配的内存划分为两块, 将不是垃圾的对象拷贝到另外一块空间中,将之前的空间直接全部释放掉

缺点: 空间浪费太多

c. 标记-整理: 

就像"顺序表删除中间元素" , 将非垃圾的对象覆盖掉标记为垃圾的对象

JVM 的实际方案是, 分代回收 

堆中的内存分为 : 新生代和老年代

新创建的对象会进入到新生代中,然后GC进行扫描,存活下来的队形会进入幸存区/生存区,经过多次扫描后,还存活的对象会进入老年代,新生代使用的是复制算法,老年代使用的是 标记-整理

相关文章:

  • STM32之快乐的Event Recorder功能
  • Docker 部署RabbitMQ
  • MySQL日期转字符串,字符串转日期的函数
  • GraphDPI:通过互信息最大化进行图表示学习来消除部分标签歧义
  • SpringBoot之如何集成SpringDoc最详细文档
  • java之IP 工具类
  • MySQL事务介绍
  • Windows主机、虚拟机Ubuntu、开发板,三者之间文件互传
  • 通过NodeRED三步完成数据上报|AIoTedge最佳实践
  • MyBatis XMLMapperBuilder 是如何将 SQL 语句解析成可执行的对象? 如何将结果映射规则解析成对应的处理器?
  • vue3中用v-for循环出三个元素,绑定元素的ref并拿到这三个元素的ref属性
  • YOLO11结构
  • 深度学习框架PyTorch——从入门到精通(2)张量
  • 项目中pnpm版本和全局pnpm版本不一致
  • Vue:Vue2和Vue3创建项目的几种常用方式以及区别
  • Canary
  • 小程序API —— 52 小程序界面交互 - 模态对话框 - 消息对话框
  • 15 文件操作
  • 【初学者】解释器和脚本各是什么?有什么区别与联系?
  • Agent系列——Agent框架调研
  • 对话哭泣照被恶意盗用成“高潮针”配图女生:难过又屈辱
  • 城管给商户培训英语、政银企合作纾困,上海街镇这样优化营商环境
  • 九部门:对机动车特别是货车排放问题的监管将更加严格
  • 金球看淡,不服就干!这是抬不起腿却昂着头的劳塔罗
  • 有乘客被高铁车门夹住?铁路回应:系突感不适下车,未受伤,列车正点发车
  • 上海模速空间“北斗七星”与“群星”生态布局,正在做些什么?