面试前准备

  1. http和https的区别

HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。

HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

HTTPS和HTTP的区别主要如下:

1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。

2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

  1. haspmap的具体实现原理,hashmap和hashset的区别

HashMap 底层是基于 数组 + 链表 组成的,不过在 jdk1.7 和 1.8 中具体实现稍有不同。

Entry 是 HashMap 中的一个内部类,从他的成员变量很容易看出:

  • key 就是写入时的键。
  • value 自然就是值。
  • 开始的时候就提到 HashMap 是由数组和链表组成,所以这个 next 就是用于实现链表结构。
  • hash 存放的是当前 key 的 hashcode。

取值:

  • 首先也是根据 key 计算出 hashcode,然后定位到具体的桶中。
  • 判断该位置是否为链表。
  • 不是链表就根据 key、key 的 hashcode 是否相等来返回值。
  • 为链表则需要遍历直到 key 及 hashcode 相等时候就返回值。
  • 啥都没取到就直接返回 null 。

1.8 和 1.7 大体上都差不多,还是有几个重要的区别:

  • TREEIFY_THRESHOLD 用于判断是否需要将链表转换为红黑树的阈值。
  • HashEntry 修改为 Node。

Node 的核心组成其实也是和 1.7 中的 HashEntry 一样,存放的都是 key value hashcode next 等数据。

HashSet 和 HashMap 的区别

HashMap HashSet
HashMap 实现了 Map 接口 HashSet 实现了 Set 接口
HashMap 储存键值对 HashSet 仅仅存储对象
使用 put() 方法将元素放入 map 中 使用 add() 方法将元素放入 set 中
HashMap 中使用键对象来计算 hashcode 值 HashSet 使用成员对象来计算 hashcode 值,对于两个对象来说 hashcode 可能相同,所以 equals() 方法用来判断对象的相等性,如果两个对象不同的话,那么返回 false
HashMap 比较快,因为是使用唯一的键来获取对象 HashSet 较 HashMap 来说比较慢
  1. Java的垃圾回收机制

java 中垃圾回收器可以帮助程序猿自动回收无用对象占据的内存,但它只负责释放 java 中创建的对象所占据的所有内存,通过某种创建对象之外的方式为对象分配的内存空间则无法被垃圾回收器回收;而且垃圾回收本身也有开销,GC 的优先级比较低,所以如果 JVM 没有面临内存耗尽,它是不会去浪费资源进行垃圾回收以恢复内存的。最后我们会发现,只要程序没有濒临存储空间用完那一刻,对象占用的空间就总也得不到释放。我们可以通过代码 System.gc()来主动启动一个垃圾回收器 (虽然 JVM 不会立刻去回收),在释放 new 分配内存空间之前,将会通过 finalize() 释放用其他方法分配的内存空间。

JVM将堆进行分代管理和使用,新生代,年老代和持久代。常见GC都在年轻代和年老代中进行。JVM 维护一个对象的年龄来进行对象的内存区域转移,从 Eden-Survivor - 老年代

新生代:新生代包括一个 Eden 区,两个 survivor 的 from 和 to 区(8:1:1), 负责年轻小对象的回收; Eden 区存放新创建的大量对象, 回收频繁, 所以区域大; Survivor 存放每次垃圾回收后存活的对象

年老代:长期存活的年老对象以及大对象直接存放在年老代

新生代收集器:Serial、ParNew、Parallel Scavenge、G1

老年代收集器:Serial Old、CMS、Parallel Old、G1

Serial 收集器:一个单线程的新生代收集器,它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。简单高效

ParNew :新生代收集器、多线程,默认开启收集线程数和CPU数目相同,适用于多核多CPU场景

Parallel(并行)收集器:JVM 缺省收集器,其最大的优点是使用多个线程来通过扫描并压缩堆。串行收集器在 GC 时会停止其他所有工作线程(stop-the-world),CPU 利用率是最高的,所以适用于要求高吞吐量(throughput)的应用,但停顿时间(pause time)会比较长,所以对 web 应用来说就不适合,因为这意味着用户等待时间会加长。而并行收集器可以理解是多线程串行收集,在串行收集基础上采用多线程方式进行 GC,很好的弥补了串行收集的不足,可以大幅缩短停顿时间,因此对于空间不大的区域(如 young generation),采用并行收集器停顿时间很短,回收效率高,适合高频率执行。

CMS 收集器:基于 “标记 - 清除” 算法实现的,它使用多线程的算法去扫描老生代堆(标记)并对发现的待回收对象进行回收(清除),容易产生大量内存碎片使得大对象无法创建然后不得不提前触发 full GC。CPU 资源占用过大,标记之后容易产生浮动垃圾只能留到下一次 GC 处理

G1 收集器:G1 收集器是基于 “标记 - 整理” 算法实现的收集器,也就是说它不会产生空间碎片。G1 是一个针对多处理器大容量内存的服务器端的垃圾收集器,其目标是在实现高吞吐量的同时,尽可能的满足垃圾收集暂停时间的要求。它可以非常精确地控制停顿,既能让使用者明确指定在一个长度为 M 毫秒的时间片段内,消耗在垃圾收集上的时间不得超过 N 毫秒,具备了一些实时 Java(RTSJ)的垃圾收集器的特征。

常见垃圾回收算法

停止 - 复制算法 这是一种非后台回收算法,将可用内存按容量划分为大小相等的两块,每次只使用其中的一块,内存浪费严重. 它先暂停程序的运行,然后将所有存活的对象从当前堆复制到另外一个堆,没被复制的死对象则全部是垃圾,存活对象被复制到新堆之后全部紧密排列,就可以直接分配新空间了。此方法耗费空间且效率低,适用于存活对象少。很明显的缺点是 浪费一半内存 ,但其 简单高效,且回收后内存连续 的优点也很突出。该算法中回收时是清理使用的内存半区,然后切换复制后的内存半区来使用,相比标记-清理算法肯定实现简单,运行高效。但是需要注意的是,在对象存活较多的情况下,对应的复制操作就会越多,效率就会越低。因此,复制算法 适合在对象存活周期较短的情况使用 。

标记 - 清扫算法 同样是非后台回收算法,该算法从堆栈区和静态域出发,遍历每一个引用去寻找所有需要回收的对象,对每个找到需要回收对象都进行标记。标记结束之后,开始清理工作,被标记的对象都会被释放掉,如果需要连续堆空间,则还需要对剩下的存货对象进行整理; 否则会产生大量内存碎片.标记和清除两个过程效率都不太高 ,在死亡对象特别多的情况下尤为突出。另外收集完成后会造成 内存碎片化严重 ,回收的空间不连续。这两个特点决定了该算法 适合在对象存活周期特别长的情况下使用 ,因为这种情况下每次收集时死亡对象小,在清理时对特定空间的清理就会变少。

标记 - 整理算法 先标记需要回收的对象,但是不会直接清理那些可回收的对象,而是将存活对象向内存区域的一端移动,然后清理掉端以外的内存。适用于存活对象多。很好的弥补了标记-清理算法的缺点,回收后空间连续, 无内存碎片化问题。效率上小白感觉大多数情况下是比标记-清理算法略微差一些的,这个没有深入研究,只是推测,本身多了一个移动的步骤,如果效率也好的话,那标记-清除算法就没有必要存在了。也 适用于对象存活周期特别长的情况 。

分代算法 在新生代中,每次垃圾收集时都会发现有大量对象死去,只有少量存活,因此可选用停止复制算法来完成收集,而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用标记—清除算法或标记—整理算法来进行回收。集百家之长,一般是 首选 。 堆内存被分为新生代和老年代 。 新生代对象存活周期短,大都朝生夕死,采用复制算法 。HotSpot虚拟机默认按8:1:1的比例将新生代分为Eden区域和两块一样大的Survivor区域,每次使用Eden和一块S区,回收时将存活的对象复制到另一块S区,回收完成后再使用这块S区和Eden区。这样每次只会闲置10%的新生代空间,对于获得了高效率的结果来说这个代价还可以接受。 老年代一般存放存活周期长的对象,每次收集对象存活率高,只能使用标记-清除(整理)算法 。注意:新生代中,若收集时存活对象预留的那块S区放不下时,会依赖老年代存放,具体的机制下面会提到。

  1. JVM的原理及线上调优

  2. Java线程池说明

-------------本文结束感谢您的阅读-------------
Dean Wang wechat