JVM面试题
2023-12-29 01:13:04
一:类的生命周期是怎么样的?
大的阶段可以分为类的加载、类的使用、以及类的卸载。类的加载阶段又分为加载、链接、初始化。其中连接过程又包含了验证、准备和解析。
二:Java中类加载的过程是怎么样的?
Java中类的加载阶段分为加载、链接、初始化。其中连接过程又包含了验证、准备和解析。
类的加载:类的加载指的是将类的.class文件中的二进制数据读取到内存中,存放在运行时数据区的方法区中,并创建一个大的Java.lang.Class对象,用来封装方法区内的数据结构
链接阶段
链接阶段:Java类加载器对类进行验证、准备和解析操作。
- 验证:校验类的正确性(文件格式,元数据,字节码,二进制兼容性)
- 准备:为类的静态变量分配内存,将其初始化为默认值。但是在到达初始化之前,类变量都没有初始化为真正的初始值。当然,对于final修饰的变量来说,会在此时就被初始化为指定值
- 解析:把类的符号引用转为直接引用(类或接口、字段、类方法、接口方法、方法类
型、方法句柄和访问控制修饰符7类符号引用)
三:Java中的类什么时候会被加载?
Java中的类在以下几种情况中会被加载:
- 当创建类的实例时,如果该类还没有被加载,则会触发类的加载。例如,通过关键字new创建一个类的对象时,JVM会检查该类是否已经加载,如果没有加载,则会调用类加载器进行加载。
- 当使用类的静态变量或静态方法时,如果该类还没有被加载,则会触发类的加载。例如,当调用某个类的静态方法时,JVM会检查该类是否已经加载,如果没有加载,则会调用类加载器进行加载。
- 当使用反射机制访问类时,如果该类还没有被加载,则会触发类的加载。例如,当使用
Class.forName()方法加载某个类时,JVM会检查该类是否已经加载,如果没有加载,则会调用类加载器进行加载. - 当JVM启动时,会自动加载一些基础类,例如java.lang.Object类和java.lang.Class类等。
总之,Java中的类加载其实是延迟加载的,除了一些基础的类以外,其他的类都是在需要使用类时才会进行加载。同时,Java还支持动态加载类,即在运行时通过程序来加载类,这为java程序带来了更大的灵活性。
四:什么是双亲委派?如何破坏?
如果一个类加载器收到了类加载的请求,它并不会自己先去加载,而是把这个请求委托给父类加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类的加载器可以完成类的加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式
如何破坏:双亲委派模型主要是由ClassLoader#loadclass 实现的,我们只需要自定义类加载器,并且重写其中的loadClass方澪,即可破坏双亲委派模式。
文章来源:https://blog.csdn.net/weixin_44582492/article/details/135189633
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!