暑假 :本周总结

本周博主主要复习了JVM,重点在于类加载器、双亲委派模型以及垃圾收集器。加载器负责类的加载,双亲委派模型保证了核心API的安全。在调优方面,博主计划学习JVM工具并探讨各种垃圾收集器,如G1和CMS。此外,还详细介绍了类的生命周期和加载过程,包括验证、准备和初始化阶段。博客中还涉及了垃圾收集器的工作步骤和类的卸载条件。
摘要由CSDN通过智能技术生成

本周总结,本周主要是对jvm进行了复习吧,其他时间除了练车就是有事,在家的效率还是比较低的,这两天又有事外出了,可能回不了家,在外面的学习时间会更少一点,但是白天也会抓住时间学习的,以下是我复习想的一些问题,有的顺手答出来一点,有的没有写,是因为答案我有的是背出来的,就懒得写结果了,这个问答博客就当作课余没事干的时候我自己看看吧

下周计划:学习以下jvm的工具吧,以及调优

  • 说一下加载器的作用

  • 总结一下类加载器

  • 可以说一下双亲委派模型吗?

  • 使用双亲委派模型的好处有哪些?

    • 避免类的重复加载,也保证了java核心Api不被篡改
  • 不想用双亲委派模型怎么办?怎么破坏?

    • 自定义类加载器要继承classLoad,然后重写loadClass方法
  • GCRoots都可以有哪些?

  • 说一下垃圾收集器的搭配情况

  • 说一下G1垃圾收集器吧

  • 说一下CMS垃圾收集器在手机的时候有几个步骤,每一个步骤都在干什么

  • 说一下类的生命周期

    • 加载,连接(验证,准备,解析),初始化,使用,卸载
  • 说一下类的加载过程

    • 主要是加载,连接,初始化
    • 其中连接包含验证,准备,解析
  • 加载阶段干什么?非数组类和数组类加载区别?

    • 加载阶段一般有三步,第一步:通过该类的全限定名来获取该类的二进制字节流,第二步:将字节流的静态存储结构转化为方法区的运行时动态数据结构,第三步:在内存中生成一个java.lang.class对象,作为方法区这个类的各种数据访问的入口
    • 对于java虚拟机规范中并没有对这三条有明确的规定,就比如说第一条,他没有说是从哪里获取类的字节流文件,比如说可以从zip中获取字节流,最终成为日后jar,war的基础,还有jsp生成的对应的class文件等等,从网络中获取
    • 非数组类型的加载是该阶段可控性比较强的,可以重写loadClass()或者findClass()来控制字节流的获取方式
  • 验证阶段目的是什么?验证阶段都验证哪几个部分,每个部分都验证什么信息?

    • 验证阶段的目的是为了确保class文件中的字节流包含的信息符合java虚拟机规范中的全部约束,以确保这些信息被当作代码在运行时不会对虚拟机自身造成伤害
    • 验证阶段是在类加载阶段中占比较重的一个阶段
    • 验证阶段一般都验证四个部分:class文件格式验证,元数据验证,字节码验证,符号引用验证
    • class文件格式验证:主要验证class文件是否正确,版本号是否能被java虚拟机处理,比如说魔数,还有主次版本号,常量池中是否有不被接受的常量
    • 元数据验证:这个阶段主要对字节码进行语义分析,以确保字节码描述的信息符合java语言规范,他主要有这几个验证点,判断一个类是否有父类除了object,其他类都有父类,一个类的父类是否继承了不能被继承的类(被final修饰),非抽象类是否全部实现了其父类或父接口的所有方法
    • 字节码验证:这个阶段主要是通过数据流分析和控制流分析,确保程序语义是合法的符合逻辑的,这个验证点主要是,保证任意时刻操作数栈的数据类型和指令代码序列能够配合工作
    • 符号引用验证:确保解析正常运行本阶段通常校验以下内容:能否通过字符串描述的全限定名称找到该类,方法中是否存在字段描述符以及简单名称
  • 准备阶段的目的是什么?分配的话在哪里分配?

    • 准备阶段主要对类变量(静态变量,不是实例变量,实例变量在对象实例化的时候随着对象一块分配在堆中)进行分配内存和设置初始值
  • 准备阶段需要注意什么?

    • 初始化的是静态变量(类变量,不是实例变量,实例变量在实例化的时候随着对象一起分配在堆中)
  • 基本数据类型的零值有哪些?说出五个

    • char:‘\u0000’
    • int: 0
    • long :0l
  • 请说一下解析阶段针对什么解析?

    • 解析阶段是java虚拟机将常量池内符号引用替换为直接引用的阶段,主要对接口或类,字段,接口方法,类方法,方法类型,方法句柄,调用限定符
  • 说一下符号引用和直接引用的区别

    • 符号引用是class文件中的常量池中的,它是由任意的字面量组成的,他必须在加载解析的时候变成直接引用
    • 直接引用是指向该目标的指针、相对偏移量,或一个间接定位到该系统的句柄
    • 解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程,也就是得到类或者字段、方法在内存中的指针或者偏移量。
  • 请说一下初始化阶段执行什么方法,都有哪些情况需要初始化?

    • 遇到new,getstatic,putstatic,invokestatic指令的时候
    • 反射的时候
    • 父类未被加载会先加载父类,接口不同,只有在用到父接口的时候才会加载
    • main
    • default
  • 卸载类的适用场景是什么?哪些类可以被回收?

  • 卸载类需要满足什么条件?

    • 该类中的所有实例都已经被GC也就是说,堆中不存在该类中的实例
    • 该类没有在其他地方被引用
    • 该类的加载器的实例被gc
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值