Java后台开发面经(包括答案)
一部分自己整理的面经,主要是基础部分。包括Java基础、网络、JVM、数据库、数据结构、并发等部分。分享出来吧。
我会持续更新,增加总结的。
举个例子,比如:
16、运行时数据中哪些区域是线程共享的,哪些是独享的。
在JVM运行时内存区域中,程序计数器、虚拟机栈和本地方法栈是线程独享的。而Java堆、方法区是线程共享的。但是值得注意的是,Java堆其实还为每一个线程单独分配了一块TLAB空间(本地线程分配缓冲),这部分空间在分配时是线程独享的,在使用时是线程共享的。(TLAB介绍)
创建对象时,内存分配过程如何保证线程安全性?有两种解决方案:
- 对分配内存空间的动作做同步处理,采用CAS机制,配合失败重试的方式保证更新操作的线程安全性。
- 每个线程在Java堆中预先分配一小块内存,然后再给对象分配内存的时候,直接在自己这块"私有"内存中分配,当这部分区域用完之后,再分配新的"私有"内存。这个本地线程分配缓冲就叫做TLAB。
17、Java中数组是存储在堆上还是栈上。
在Java中,数组同样是一个对象,所以对象在内存中如何存放同样适用于数组;
所以,数组的实例是保存在堆中,而数组的引用是保存在栈上的。
20、什么是回表,覆盖索引有什么作用。
回表是指,数据库根据索引找到了指定的记录所在行后,还需要根据rowid再次到数据块里取数据的操作。在执行计划中,先索引扫描,再通过rowid去取索引中未能提供的数据,即为回表。
避免回表的方法就是将需要的字段放在索引中去,查询的时候避免回表。也就是覆盖索引。
覆盖索引:一个索引内包含(或覆盖)所有需要查询的字段的值,即只需扫描索引而无须回表,减少了IO操作,提高了效率。
同时打个广告,阿里考拉/天猫国际团队招秋招同学,组内hc很多(尤其java后端)。
有想了解的同学可以wx联系:lzh960227