面试知识点——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的老年代版本,多线程,标记-整理算法

    扫描二维码关注公众号,回复: 3581381 查看本文章
  • CMS(Concurrent Mark Sweep):老年代,多线程,标记-清除算法,四个步骤:初始标记、并发标记、重新标记、并发清除。各个阶段的作用,CMS的缺点

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

内存分配与回收策略

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

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

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

java nio

猜你喜欢

转载自www.cnblogs.com/darknessplus/p/9787903.html