先做个自我介绍 对于男生,面试官才不会客套,
    请简介有力的自我介绍!
    你刚才说的这两个项目,你觉得最有难度的有亮点的是哪个? 我应该主动告诉面试官先问那个项目
    对这个项目里就这个项目你在里面承担了一个什么职能?
    这是一个开源项目是吧?有对开源项目做二次开发吗?还是说。
    这块二次开发是开发了哪些部分?哪些是在原来基础上开发的?
    我简单介绍一下这个项目的架构,对项目的架构以及主要的一个业务流程。

    面试开始应该有一个自我介绍:

    您好,我叫詹泽晔,就读于南京大学软件学院,22届毕业。意向岗位是 Java 研发。

    我最擅长的专业技能,对那块知识有较深的理解,项目中让你感觉最有收获的事情。

    1. 先做个自我介绍
    2. 我叫詹泽晔,是南京大学软件学院的硕士生。研一,22届毕业,意向岗位是Java 。在项目方面,我曾基于钉钉微应用为实验室开发了一个绩效管理系统,从产品的设计,开发,持续部署,到运维都是由我来完成的。它将绩效审核与钉钉周报管理起来,同时管理论文绩效,内部评审记录和投票,和开发绩效管理,可以自动计算每月助研金。最明显的改变是,实验室50多人的助研金计算从原来的Excel表格统计,变成了由微应用自动完成。
    3. 此外,最近我还负责开发一个离散事件系统仿真工具,它是应用在生产调度,和物流制造等领域的仿真软件。运用了比较多的设计模式和面向对象的思想。
    4. 你刚才说的这两个项目,你觉得最有难度的有亮点的是哪个?
    5. 我这里说了两个项目,但是没有像面试官抛出橄榄枝~,减轻面试官选择负担
    6. 对这个项目里就这个项目你在里面承担了一个什么职能?
    7. 这是一个开源项目是吧?有对开源项目做二次开发吗?还是说。
    8. 这块二次开发是开发了哪些部分?哪些是在原来基础上开发的?
    9. 简单介绍一下这个项目的架构,对项目的架构以及主要的一个业务流程。
    10. 这个背景你我简单说一下,你用参与项目为了解决什么问题,你现在是有个什么样的需求或者什么样的一个一一个目的,就是为什么用这个东西,就刚才聊了很独崭节,项目里面的很多细节,目前我对这个背景还不是太了解,你这个东西能解决什么问题,然后为什么用这两个问题先给解答一下。
    11. 这个的背景是为了帮你修改完成毕业论文,对是一个做这个项目
    12. 他能解决什么实际问题,比如他毕业论文里解决了什么问题

    专业技能
    Java 内存区域:
    线程私有的有:程序计数器,虚拟机栈,本地方法栈
    线程共享的有:堆,方法区,直接内存

    程序计数器:当前线程的所执行的字节码的行号指示器,帮助线程切换时恢复到正确的位置
    虚拟机栈:java调用方法时,虚拟机会在当前线程的虚拟机栈中生成一个栈帧,用于保存局部变量和字节码操作数。
    本地方法栈:主要为虚拟机调用本地方法服务。
    堆:用于存放对象实例
    方法区:用于存储虚拟机已加载的类,常量,静态变量
    直接内存:不是虚拟机运行时数据的一部分,但也会被频繁的使用

    JVM内存管理:

    现代的垃圾收集基本采用分代垃圾收集算法,所以Java堆还可分为,新生代和老年代,具体一些就是,Eden,From Survivor, To Survivor空间

    大部分情况,对象都会首先在 Eden 区域分配,在一次新生垃圾回收后,则会进入s0 或 s1, 并且对象的年龄还会 + 1当它的年龄增加到一定程度(默认为15岁),就会晋升到老年代。

    在 GC 后,Eden 区和 Survivor From 区已经被清空,这时候,From 和 To 会交换他们的角色。保证 Survivor To 区域是空的,Minor GC 会一直重复这样的过程,直到

    堆内存中对象分配的基本策略

    1. 对象优先在eden区分配
      1. 大多数情况下对象在新生代中的eden 区分配,如果没有足够空间的话虚拟机会发起一次 Minor GC
    2. 大对象直接进入老年代
      1. 大对象就是需要大量连续内存空间的对象(比如:字符串,数组)
    3. 长期存活的对象将进入老年代

    垃圾收集算法:

    1. 标记-清除算法
      1. 效率不稳定,
      2. 会产生大量的不连续的碎片
    2. 复制算法
      1. 将内存分为大小相同的两块,每次使用其中一块
      2. 当这一块内存使用完后,将他复制到另一块去
    3. 标记整理算法
      1. 将所有存活的对象移动到内存的一端,然后清楚掉端边界意外的内存
    4. 分代收集算法
      1. 根据对象的存活周期不同将内存分为几块,一般将Java堆分为新生代和老年代,根据各个年代的特点选择合适的垃圾收集算法。

    垃圾回收器:

    1. Serial收集器

    是一个单线程收集器,它在进行垃圾收集的过程中,必须暂停其他所有的工作线程。
    新生代采用复制算法,老年代采用标记整理算法。
    image.png

    1. ParNew 收集器

    是Serial收集器的多线程版本,除了使用多线程进行垃圾收集外,其余行为和 Serial 收集器完全一致
    image.png

    1. Parallel Scavenge 收集器
      1. 关注点是吞吐量
    2. CMS
      a. 初始标记:找到GC Root 所指向的第一个对象 (STW 的时间很短暂)

    b. 并发标记:用户线程可以正常执行 (可能产生浮动垃圾,错标)
    c. 重新标记:修正b STW
    d. 并发清理:标记清理算法(并发)
    d. 并发重置:
    image.png

    1. G1
      1. 采用 region 化的思想,像棋盘一样的结构