• 面试知识点——Java


    Java容器

    hashmap实现原理

    存储结构是链表数组,数组的每个元素都是链表(为了解决冲突,还可以将链表变成红黑树进一步降低复杂度)。
    put方法:根据Key类的hashCode函数得到散列码(这就要求Key类实现hashCode函数),根据散列码找到数组里对应的位置(散列码到下标的转换有不同方法),查找是否已经有Key(这就要求Key类实现equals函数),如果碰撞导致链表过长(大于等于TREEIFY_THRESHOLD),就把链表转换成红黑树(此时要求Key实现Comparable);
    get方法:思路同上,根据hashcode函数得到散列码,查找数组相应位置
    如何设计好的hashcode函数?

    hash=C0;
    hash=C1 * hash + field.hashcode;
    //C0、C1为常数
    

    负载因子(过大,过小),再散列

    java多线程

    jvm内存模型

    java 垃圾回收机制

    对象存活状态检查

    • 引用计数法(对象添加引用计数器,优点:简单高效,缺点:对象之间循环引用)
    • 可达性分析算法

    垃圾收集算法

    对象的判定到回收之间还有两次标记,如果对象没有实现finalize方法或者已经执行过finalize方法,则直接回收,否则对象进入待回收队列(同一对象的finalize方法最多被系统调用一次)

    • 标记-清除算法
    • 标记-整理算法
    • 复制算法
    • 分代算法

    新生代由于存活率较低,适合复制算法,老年代由于存活率高,适合标记清除或者标记整理算法

    垃圾收集器

    垃圾收集器之间的组合

    • Serial:新生代,单线程,复制算法收集内存,Stop the world

    • ParNew:新生代,复制算法,Serial的多线程版本

    • Parallel Scanvenge:新生代,复制算法,多线程,注重吞吐量(用户时间/总时间)

    • Serail Old:老年代,单线程,标记-整理算法

    • Parallel Old:PS的老年代版本,多线程,标记-整理算法

    • CMS(Concurrent Mark Sweep):老年代,多线程,标记-清除算法,四个步骤:初始标记、并发标记、重新标记、并发清除。各个阶段的作用,CMS的缺点

    • G1:多线程,内存分区,新生代与老年代不再物理隔离,都由一组区域组成。G1的特点。G1维护优先列表,优先回收价值大的区域。步骤:初始标记,并发标记,最终标记,筛选回收。各个阶段的作用

    内存分配与回收策略

    内存分为新生代和老年代,新生代分为一块较大的eden区和两块较小的survivor区,eden区和其中一块survivor区时可用的,另一块survivor区用于复制算法放置回收的对象。

    对象优先分配在新生代,如果对象过大或者年龄达到条件即可晋升到老年代。

    新生代对象内存分配过程:首先查看eden区空间是否够用,不够用则进行一次minor gc到survivor区,如果survivor区也不够用,通过分配担保机制转移到老年代。

    java nio

  • 相关阅读:
    [Flink] 从 RabbitMQ 读取并计算后输出到 MySQL
    极光笔记丨搭建UMS私有云文件服务器
    极光笔记丨Spark SQL 在极光的建设实践
    Iog4j2漏洞相关技术分析
    极光笔记丨关于数据大屏一比一还原设计稿这件事
    极光笔记|基于CMPP协议集成短信测试桩全流程实践分享
    极光笔记|数据服务平台一期建设
    【记录】GIT常用命令
    【原创】使用micrel的千兆PHY芯片ksz9021GN和KSZ9021GQ前要注意
    【记录】调试千兆以太网PHY芯片DP83865的痛苦经历
  • 原文地址:https://www.cnblogs.com/darknessplus/p/9787903.html
Copyright © 2020-2023  润新知