商汤后端实习一面面经
1.SpringBoot优点
2.SpringBootStarter底层如何实现的
3.Redis与MySQL如何保持一致
4.缓存雪崩,缓存穿透
5.缓存穿透如何解决
6.缓存中有百万条数据,如何取abc开头的数据,用Redis什么指令
不知道
scan
7.B+树索引讲一下
8.红黑树说一下
9.volatile底层说一下,使用场景
10.内存屏障有哪几种?
不知道
- 硬件层的内存屏障分为两种:Load Barrier和Store Barrier即读屏障和写屏障。
- 内存屏障有两个作用:
- 阻止屏障两侧的指令重排序;
- 强制把写缓冲区/高速缓存中的脏数据等写回主内存,让缓存中相应的数据失效。
- 对于Load Barrier来说,在指令前插入Load Barrier,可以让高速缓存中的数据失效,强制从新从主内存加载数据;
- 对于Store Barrier来说,在指令后插入Store Barrier,能让写入缓存中的最新数据更新写入主内存,让其他线程可见。
- java的内存屏障通常所谓的四种即LoadLoad,StoreStore,LoadStore,StoreLoad实际上也是上述两种的组合,完成一系列的屏障和数据同步功能。
- LoadLoad屏障:对于这样的语句Load1; LoadLoad; Load2,在Load2及后续读取操作要读取的数据被访问前,保证Load1要读取的数据被读取完毕。
- StoreStore屏障:对于这样的语句Store1; StoreStore; Store2,在Store2及后续写入操作执行前,保证Store1的写入操作对其它处理器可见。
- LoadStore屏障:对于这样的语句Load1; LoadStore; Store2,在Store2及后续写入操作被刷出前,保证Load1要读取的数据被读取完毕。
- StoreLoad屏障:对于这样的语句Store1; StoreLoad; Load2,在Load2及后续所有读取操作执行前,保证Store1的写入对所有处理器可见。它的开销是四种屏障中最大的。在大多数处理器的实现中,这个屏障是个万能屏障,兼具其它三种内存屏障的功能
12.JVM内存结构。方法区1.8之后有什么变化
13.一个对象在堆中划分成了几部分
忘了
对象在内存中的布局可以分为 3 块区域:对象头、实例数据和对齐填充
14.直接引用和符号引用了解吗?
不了解,忘了
符号引用:
符号引用是一个字符串,它给出了被引用的内容的名字并且可能会包含一些其他关于这个被引用项的信息——这些信息必须足以唯一的识别一个类、字段、方法。这样,对于其他类的符号引用必须给出类的全名。对于其他类的字段,必须给出类名、字段名以及字段描述符。对于其他类的方法的引用必须给出类名、方法名以及方法的描述符。在Class文件中它以CONSTANT_Class_info、CONSTANT_Fieldref_info、CONSTANT_Methodref_info等类型的常量出现。
直接引用:
直接引用可以是 (1)直接指向目标的指针(比如,指向“类型”【Class对象】、类变量、类方法的直接引用可能是指向方法区的指针) (2)相对偏移量(比如,指向实例变量、实例方法的直接引用都是偏移量) (3)一个能间接定位到目标的句柄 直接引用是和虚拟机的布局相关的,同一个符号引用在不同的虚拟机实例上翻译出来的直接引用一般不会相同。如果有了直接引用,那引用的目标必定已经被加载入内存中了。
用我自己的理解,换句话说符号引用就是描述,标识一个对象的符号,直接引用就是对象的地址。
15.进入老年代有哪几种方式
16.CMS和G1有什么区别
不会答,答了CMS过程和G1过程,乱答一通
(1)使用范围不一样
CMS老年代,G1新生代
(2)STW时间
CMS以最短停顿时间为目标。G1可预测垃圾回收停顿时间
(3)垃圾碎片
CMS基于标记清除,G1基于标记整理
(4)垃圾回收过程
16.CMS适合哪个代用作垃圾回收器,G1适合哪个?
蒙了CMS适合老年代,G1不知道
面试官说其实挖了个坑,CMS适合老年代没错,但是G1新生代老年代都适合
17.Region如何判断回收价值
G1收集器会跟踪每个region里面垃圾堆积的价值(即回收该region所获的空间和所需时间的价值),然后再后台维护一个优先级列表,每次根据该优先级列表进行回收(优先处理优先级高的region),这也是Garbage First的由来
18.JVM调优了解吗?
不了解
19.如果老年代用CMS垃圾回收器,那么新生代适合用哪个?
不知道。没找到答案
20.动态链接
动态链接库(Dynamic Link Library,缩写为DLL)是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。动态链接库文件的扩展名一般是dll, 也有可能是drv、sys和fon,它和可执行文件(exe)非常类似,区别在于DLL中虽然包含了可执行代码却不能单独执行,而应由Windows应用 程序直接或间接调用。
动态链接是相对于静态链接而言的。所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件 的一部分。换句话说,函数和过程的代码就在程序的exe文件中,该文件包含了运行时所需的全部代码。当多个程序都调用相同函数时,内存中就会存在这个函数 的多个拷贝,这样就浪费了宝贵的内存资源。而动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信 息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在Windows的管理下,才在应用程序与相应的DLL之间建立链接关系。当要执行所调 用DLL中的函数时,根据链接产生的重定位信息,Windows才转去执行DLL中相应的函数代码。
一般情况下,如果一个应用程序使 用了动态链接库,Win32系统保证内存中只有DLL的一份复制品,这是通过内存映射文件实现的。DLL首先被调入Win32系统的全局堆栈,然后映射到 调用这个DLL的进程地址空间。在Win32系统中,每个进程拥有自己的32位线性地址空间,如果一个DLL被多个进程调用,每个进程都会收到该DLL的 一份映像。与16位Windows不同,在Win32中DLL可以看作是每个进程自己的代码。
动态链接是相对于静态链接而言的。所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件 的一部分。换句话说,函数和过程的代码就在程序的exe文件中,该文件包含了运行时所需的全部代码。当多个程序都调用相同函数时,内存中就会存在这个函数 的多个拷贝,这样就浪费了宝贵的内存资源。而动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信 息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在Windows的管理下,才在应用程序与相应的DLL之间建立链接关系。当要执行所调 用DLL中的函数时,根据链接产生的重定位信息,Windows才转去执行DLL中相应的函数代码。
一般情况下,如果一个应用程序使 用了动态链接库,Win32系统保证内存中只有DLL的一份复制品,这是通过内存映射文件实现的。DLL首先被调入Win32系统的全局堆栈,然后映射到 调用这个DLL的进程地址空间。在Win32系统中,每个进程拥有自己的32位线性地址空间,如果一个DLL被多个进程调用,每个进程都会收到该DLL的 一份映像。与16位Windows不同,在Win32中DLL可以看作是每个进程自己的代码。
面试总结:面试官老哥应该技术很不错,对JVM了解特别深。。JVM被问麻了。问的都好底层,面试氛围好压抑。。问了实习生几轮面试说四轮。。。。人麻了。。好难啊。。。0 offer选手自闭了啊,焦虑。