学习视频

cms的核心算法三色标记法

三色标记法: 逻辑上的抽象,将对象分为3种颜色, 黑色,表示 已经标记完成,确认不是垃圾,灰色自己标记完成了,但是成员还没有标记完。 白色 : 没有标记完

cms 通过 增量 increment update 的方式解决漏标的问题。

cms 的过程

  1. 初始标记: 直接stop the world 标出根引用的对象。
  2. 并发标记: 继续标记其他对象,与应用程序是并发执行的。
  3. 重新标记: stop the world 对并发标记阶段的对象重新标记,解决漏标的问题。
  4. 并发清除: 并行,对产生的垃圾清除。 清除过程中,应用程序不断产生新的垃圾,这些垃圾被称为浮动垃圾,将会在下次 GC 过程中进行清除。

G1收集器的过程

garbage first 收集器, 他的内存模式实际上是部分带的,但是逻辑上是分代的。 在内存中,对于堆内存就不在分老年代和新生代,而是划分为一个个小内存块,region,每个region 可以隶属于不同的年代

四个阶段:

  1. 初始标记, 标 GCROOT 直接引用的那些对象。
  2. 标记 region,通过 RSet标记出上一个阶段标记的Region 引用到 的 Old区 region
  3. 并发标记阶段: 跟 CMS 的步骤差不多。 只是遍历的范围不再是整个 Old区,而只是需要遍历第二步标记出来的 region
  4. 重新标记: 跟CMS 的重标记差不多,解决漏标问题。
  5. 垃圾清理【复制算法】,与CMS 不同,G1直接用拷贝算法,直接将整个堆的对象拷贝 到另一个 region。 而 这个阶段,G1 只选择垃圾较多的region 进行拷贝

那些可以作为 GC ROOT

  1. 引用计数: 这种方式是给堆内存当中的每个对象记录一个引用个数, 引用个数为0 的就认为是垃圾,这是早期JDK 使用 的方式, 引用计数无法解决循环引用问题。
  2. 可达性分析: 这种方式就是在内存中,从引用根对象一直向下查找引用, GC ROOT: 栈, 本地方法栈, class类, 运行时常量池,static reference 静态引用。

如何进行 JVM 调优,jvm参数有哪些?

跑了一段java程序,一段时间后,服务器非常的卡顿,如何进行优化。

  1. 定制 JVM 运行参数来提高 JAVA 应用的运行数据
  2. 标注之类: -开头表示所有 hotspot 都支持的参数,用 java -help 打印
  3. 非标准之类, -x开头,通常是特定的 hotspot 版本对应的。

京东二面

说说类加载器双亲委派模式

JVM 中存在的三个默认的类加载器:

  1. BootstrapClassLoader
  2. ExtClassLoader
  3. AppClassLoader

JVM 在加载一个类时候,会调用AppClassLoader 的 loadClass方法来加载这个类, 不过这个方法中, 会先使用 ExtClassLoader 的 loadClass 方法来加载类看,同样 ExtClassLoader 的 loadClass方法中会先使用 BootstrapClassLoader 来加载类,如果 bootstrapClassLoader 加载成功,就直接成功,如果失败,没加载到类,就ExtclassLoader 尝试加载,如果没有加载到,就 AppClassLoader 加载这个类

双亲是 指的是 ExtClassLoader 和 BootstrapClassLoader ,委派这2个 亲人加载。

泛型 extends 和 super区别

  1. <? extends T> 表示包括T在内的任何 T的子类
  2. <? super T> 表示 T 还有 T 的父类

第3种单例模式

  1. 懒汉式单例
  2. 饿汉式单例
  3. 枚举单例
    • 枚举单例一定要会,笔试居然刷到了
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
public enum Singleton {

    INSTANCE;

    public void doSomething() {
        System.out.println("doSomething");
    }

}

public class Main {

    public static void main(String[] args) {
        Singleton.INSTANCE.doSomething();
    }

}