加入收藏 | 设为首页 | 会员中心 | 我要投稿 温州站长网 (https://www.0577zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 交互 > 正文

知名互联网公司校招 Java 开发岗面试知识点解析

发布时间:2021-01-01 16:13:37 所属栏目:交互 来源:网络整理
导读:副标题#e# 天之道,损有余而补不足,是故虚胜实,不足胜有余。 本文作者在一年之内参加过多场面试,应聘岗位均为 Java 开发方向。在不断的面试中,分类总结了 Java 开发岗位面试中的一些知识点。 主要包括以下几个部分: Java 基础知识点 Java 常见集合 高

1)JVM 内存划分:

  1. 方法区(线程共享):常量、静态变量、JIT(即时编译器) 编译后的代码也都在方法区;
  2. 堆内存(线程共享):垃圾回收的主要场所;
  3. 程序计数器: 当前线程执行的字节码的位置指示器;
  4. 虚拟机栈(栈内存):保存局部变量、基本数据类型变量以及堆内存中某个对象的引用变量;
  5. 本地方法栈 :为 JVM 提供使用 native 方法的服务。

2)类似-Xms、-Xmn 这些参数的含义:

答:

堆内存分配:

  1. JVM 初始分配的内存由-Xms 指定,默认是物理内存的 1/64;
  2. JVM 最大分配的内存由-Xmx 指定,默认是物理内存的 1/4;
  3. 默认空余堆内存小于 40% 时,JVM 就会增大堆直到-Xmx 的最大限制;空余堆内存大于 70% 时,JVM 会减少堆直到 -Xms 的最小限制;
  4. 因此服务器一般设置-Xms、-Xmx 相等以避免在每次 GC 后调整堆的大小。对象的堆内存由称为垃圾回收器的自动内存管理系统回收。

非堆内存分配:

  1. JVM 使用-XX:PermSize 设置非堆内存初始值,默认是物理内存的 1/64;
  2. 由 XX:MaxPermSize 设置最大非堆内存的大小,默认是物理内存的 1/4;
  3. -Xmn2G:设置年轻代大小为 2G;
  4. -XX:SurvivorRatio,设置年轻代中 Eden 区与 Survivor 区的比值。

3)垃圾回收算法有哪些?

答:

  1. 引用计数 :原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为 0 的对象。此算法最致命的是无法处理循环引用的问题;
  2. 标记-清除 :此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除;

此算法需要暂停整个应用,同时,会产生内存碎片;

  1. 复制算法 :此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中;

此算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不会出现 “碎片” 问题。当然,此算法的缺点也是很明显的,就是需要两倍内存空间;

  1. 标记-整理 :此算法结合了 “标记-清除” 和 “复制” 两个算法的优点。也是分两阶段,第一阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,把清除未标记对象并且把存活对象 “压缩” 到堆的其中一块,按顺序排放。

此算法避免了 “标记-清除” 的碎片问题,同时也避免了 “复制” 算法的空间问题。

4)root 搜索算法中,哪些可以作为 root?

答:

  • 被启动类(bootstrap 加载器)加载的类和创建的对象;
  • JavaStack 中的引用的对象 (栈内存中引用的对象);
  • 方法区中静态引用指向的对象;
  • 方法区中常量引用指向的对象;
  • Native 方法中 JNI 引用的对象。

5)GC 什么时候开始?

答:GC 经常发生的区域是堆区,堆区还可以细分为新生代、老年代,新生代还分为一个 Eden 区和两个 Survivor 区。

  1. 对象优先在 Eden 中分配,当 Eden 中没有足够空间时,虚拟机将发生一次 Minor GC,因为 Java 大多数对象都是朝生夕灭,所以 Minor GC 非常频繁,而且速度也很快;
  2. Full GC,发生在老年代的 GC,当老年代没有足够的空间时即发生 Full GC,发生 Full GC 一般都会有一次 Minor GC。

大对象直接进入老年代,如很长的字符串数组,虚拟机提供一个;XX:PretenureSizeThreadhold 参数,令大于这个参数值的对象直接在老年代中分配,避免在 Eden 区和两个 Survivor 区发生大量的内存拷贝;

  1. 发生 Minor GC 时,虚拟机会检测之前每次晋升到老年代的平均大小是否大于老年代的剩余空间大小,如果大于,则进行一次 Full GC,如果小于,则查看 HandlePromotionFailure 设置是否允许担保失败,如果允许,那只会进行一次 Minor GC,如果不允许,则改为进行一次 Full GC。

6)内存泄漏和内存溢出

答:

概念:

  1. 内存溢出指的是内存不够用了;
  2. 内存泄漏是指对象可达,但是没用了。即本该被 GC 回收的对象并没有被回收;
  3. 内存泄露是导致内存溢出的原因之一;内存泄露积累起来将导致内存溢出。

内存泄漏的原因分析:

  1. 长生命周期的对象引用短生命周期的对象;
  2. 没有将无用对象置为 null。
小结:本小节涉及到 JVM 虚拟机,包括对内存的管理等知识,相对较深。除了以上问题,面试官会继续问你一些比较深的问题,可能也是为了看看你的极限在哪里吧。比如:内存调优、内存管理,是否遇到过内存泄漏的实际案例、是否真正关心过内存等。由于本人实际项目经验不足,这些深层次问题并没有接触过,各位有需要可以上网查阅。

(五)Java 8 相关知识点

关于 Java8 中新知识点,面试官会让你说说 Java8 你了解多少,下边主要阐述我所了解,并且在面试中回答的 Java8 新增知识点。

1)HashMap 的底层实现有变化:HashMap 是数组 + 链表 + 红黑树(JDK1.8 增加了红黑树部分)实现。

2)JVM 内存管理方面,由元空间代替了永久代。

区别:

  1. 元空间并不在虚拟机中,而是使用本地内存;
  2. 默认情况下,元空间的大小仅受本地内存限制;
  3. 也可以通过-XX:MetaspaceSize 指定元空间大小。

3)Lambda 表达式(也称为闭包),允许我们将函数当成参数传递给某个方法,或者把代码本身当做数据处理。

4)函数式接口:指的是只有一个函数的接口,java.lang.Runnable 和 java.util.concurrent.Callable 就是函数式接口的例子;java8 提供了一个特殊的注解 @Functionallnterface 来标明该接口是一个函数式接口。

5)引入重复注解:Java 8 中使用 @Repeatable 注解定义重复注解。

6)接口中可以实现方法 default 方法。

7) 注解的使用场景拓宽: 注解几乎可以使用在任何元素上:局部变量、接口类型、超类和接口实现类,甚至可以用在函数的异常定义上。

(编辑:温州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读