虚拟机把描述类的数据加载到内存里面,并对数据进行校验、解析和初始化,最终变成可以被虚拟机直接使用的class对象;
八、类加载的过程?
主要分为以下几个过程:加载、验证、准备、解析、初始化;加载:加载分为三步:
1、通过类的全限定性类名获取该类的二进制流;
2、将该二进制流的静态存储结构转为方法区的运行时数据结构;
3、在堆中为该类生成一个class对象;
验证:验证该class文件中的字节流信息复合虚拟机的要求,不会威胁到jvm的安全;
准备:为class对象的静态变量分配内存,初始化其初始值;
解析:该阶段主要完成符号引用转化成直接引用;
初始化:到了初始化阶段,才开始执行类中定义的java代码;初始化阶段是调用类构造器的过程;
九、什么是类加载器,常见的类加载器有哪些?
类加载器是指:通过一个类的全限定性类名获取该类的二进制字节流叫做类加载器;类加载器分为以下四种:启动类加载器:用来加载java核心类库,无法被java程序直接引用;
![](https://img-blog.csdnimg.cn/9ebea594c8d84547888f7c5a1fecf720.png?x-oss-process=image/wat
【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
ermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5omL5oyB5Lik5oqK6ZSf5pak5ou3,size_20,color_FFFFFF,t_70,g_se,x_16)
扩展类加载器:用来加载java的扩展库,java的虚拟机实现会提供一个扩展库目录,该类加载器在扩展库目录里面查找并加载java类;
系统类加载器:它根据java的类路径来加载类,一般来说,java应用的类都是通过它来加载的;
自定义类加载器:由java语言实现,继承自ClassLoader;
十、什么是双亲委派模型?
当一个类加载器收到一个类加载的请求,他首先不会尝试自己去加载,而是将这个请求委派给父类加载器去加载,只有父类加载器在自己的搜索范围类查找不到给类时,子加载器才会尝试自己去加载该类;
十一、为什么需要双亲委派模型?
为了防止内存中出现多个相同的字节码;因为如果没有双亲委派的话,用户就可以自己定义一个java.lang.String类,那么就无法保证类的唯一性;
十二、怎么打破双亲委派模型?
自定义类加载器,继承ClassLoader类,重写loadClass方法和findClass方法;
十三、强引用、软应用、弱引用、虚引用的区别?
强引用:强引用是我们使用最广泛的引用,如果一个对象具有强引用,那么垃圾回收期绝对不会回收它,当内存空间不足时,垃圾回收器宁愿抛出OutOfMemoryError,也不会回收具有强引用的对象;我们可以通过显示的将强引用对象置为null,让gc认为该对象不存在引用,从而来回收它;
软引用:软应用是用来描述一些有用但不是必须的对象,在java中用SoftReference来表示,当一个对象只有软应用时,只有当内存不足时,才会回收它;软引用可以和引用队列联合使用,如果软引用所引用的对象被垃圾回收器所回收了,虚拟机会把这个软引用加入到与之对应的引用队列中;
弱引用:弱引用是用来描述一些可有可无的对象,在java中用WeakReference来表示,在垃圾回收时,一旦发现一个对象只具有软引用的时候,无论当前内存空间是否充足,都会回收掉该对象;弱引用可以和引用队列联合使用,如果弱引用所引用的对象被垃圾回收了,虚拟机会将该对象的引用加入到与之关联的引用队列中;
虚引用:虚引用就是一种可有可无的引用,无法用来表示对象的生命周期,任何时候都可能被回收,虚引用主要使用来跟踪对象被垃圾回收的活动,虚引用和软引用与弱引用的区别在于:虚引用必须和引用队列联合使用;在进行垃圾回收的时候,如果发现一个对象只有虚引用,那么就会将这个对象的引用加入到与之关联的引用队列中,程序可以通过发现一个引用队列中是否已经加入了虚引用,来了解被引用的对象是否需要被进行垃圾回收。
篇幅有限,我给大家准备了这份超详细JVM内存结构,读完之后相信碰到多数JVM面试都不怕,先展示部分截图:
一、线程
二、JVM内存区域
-
程序计数器(线程私有)
-
虚拟机栈(线程私有)
-
本地方法区(线程私有)
-
堆(Heap-线程共享)-运行时数据区
-
方法区/永久代(线程共享)
三、JVM运行时内存
-
新生代
-
老年代
-
永久代
四、垃圾回收与算法
-
如何确定垃圾
-
标记清除算法(Mark-Sweep)
-
复制算法(copying)
-
标记整理算法(Mark-Compact)
-
分代收集算法
五、java四种引用类型
-
强引用
-
软引用
-
弱引用
-
虚引用
六、GC分代收集算法VS分区收集算法
-
分代收集算法
-
分区收集算法
七、GC垃圾收集器
-
Serial垃圾收集器(单线程、复制算法)
-
ParNew垃圾收集器(Serial+多线程)
-
Parallel Scavenge收集器(多线程复制算法、高效)
-
Serial Old收集器(单线程标记整理算法)
-
Serial Old收集器(多线程标记整理算法)
-
CMS收集器(多线程标记整理算法)
-
G1收集器
八、JAVA IO/NIO
-
阻塞IO模型
-
非阻塞IO模型
-
多路复用IO模型
-
信号驱动IO模型
-
异步IO模型
-
JAVA IO包
-
JAVA NIO
-
Channel
-
Buffer
-
Selector
九、JVM类加载机制
- 加载