1. java运行时,一个类是什么时候被加载的?
按需加载,用的时候加载,不需要用就不加载。
1.1 内存泄漏:
java导致内存泄露的原因很明确:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景。
2. java类的加载机制:
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的Java类型。
3. 什么是类加载器?
实现通过类的全限定名获取该类的二进制字节流的代码块叫类加载器。主要有以下四种类加载器:启动类加载器、扩展类加载器、系统类加载器、用户自定义加载器。
4. jvm内存结构划分
栈因为是运行单位,因此里面存储的信息都是跟当前线程相关的信息。包括:局部变量、程序运行状态、方法返回值等等;而堆只负责存储对象信息
堆:线程共享,主要是存放对象实例和数组;
栈:栈是运行时的单位,Java 虚拟机栈,线程私有;每个方法在执行时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行结束,就对应着一个栈帧从虚拟机栈中入栈到出栈的过程。
5. 垃圾回收器
在jvm中,有一个垃圾回收线程,它是低优先级的,在正常情况下它是不会执行的,只有在虚拟机内空闲或者当前堆内存不足的情况下,才会触发执行,扫描那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。
6. 垃圾回收算法
标记—清除算法:标记无用对象,然后进行清除回收。缺点:效率不高,无法清除垃圾碎片
复制算法:按照容量划分二个大小相等的内存区域,当一块用完的时候将活着的对象复制到另一块上,然后再把已使用的内存空间一次清理掉。缺点:内存使用率不高,只有原来的一半。
标记-整理算法:标记无用对象,让所有存活的对象都向一端移动,然后直接清除掉端边界以外的内存。
分代算法:根据对象存活周期的不同将内存划分为几块,一般是新生代和老年代,新生代基本采用复制算法,老年代采用标记整理算法
7. 双亲委派模型
如果一个类加载器收到了类加载的请求,它首先不会自己去加载这个类,而是把这个请求委派给父类加载器去完成,每一层的类加载器都是如此,这样所有的加载请求都会被传送到顶层的启动类加载器中,只有当父加载无法完成加载请求(它的搜索范围中没找到所需的类)时,子加载器才会尝试去加载类。