抓住金三银四好机会,超齐全java大厂面试题汇总(请自寻学习查找答案)
目錄
一、JDK源碼
1.HashMap
2.concurrentHashMap
3.volatile
4.linkedList、ArrayList
5.線程池
6.設(shè)計(jì)模式
二、JVM、GC、G1
1.jvm內(nèi)部
2.加載
3.堆
4.方法區(qū)
5.jit即時(shí)編譯器
6.垃圾回收
7.垃圾回收器
三、springboot、springcloud
1.注解
2.spring源碼
3.AOP
4.事務(wù)
5.自動(dòng)配置原理
6.請(qǐng)求處理原理
7.springcloud
四、docker、k8
五、netty
六、xxljob
七、處理生產(chǎn)問(wèn)題
八、redis
1.string
2.hash
3.list
4.set(無(wú)序)
5.zset
九、es
十、mysql
一、JDK源碼
1.HashMap
jdk7:hash沖突會(huì)存放在鏈表中,
jdk8:hash沖突過(guò)多,鏈表會(huì)轉(zhuǎn)變?yōu)榧t黑樹(shù)。‘
紅黑樹(shù)(Red Black Tree) 是一種自平衡二叉查找樹(shù)。’
2.concurrentHashMap
jdk7:分段鎖。
jdk8:不用分段鎖了,使用cas+
3.volatile
可見(jiàn)性,不保證原子性,防止指令重排序。
cas:比較并交換
4.linkedList、ArrayList
CountDownLacth:他經(jīng)常用于監(jiān)聽(tīng)某些初始化操作,等初始化執(zhí)行完畢后,通知主線程繼續(xù)工作。
CyclicBarrier:只要有一個(gè)人沒(méi)有準(zhǔn)備好,大家都等待
Semaphore信號(hào)量
Callable和Future的使用
CopyOnWriteArrayList(讀寫(xiě)分離,寫(xiě)時(shí)復(fù)制)、CopyOnWriteArraySet(HashSet不安全)、
5.線程池
??newFixedThreadPool()、newSingleThreadExecutor()、newCachedThreadPool()、newScheduledThreadPool()
線程池七大參數(shù)
1.corePoolSize:線程池中的常駐核心線程數(shù)。
????在創(chuàng)建了線程池后,當(dāng)有請(qǐng)求任務(wù)來(lái)之后,就會(huì)安排池中的線程去執(zhí)行任務(wù),近似理解為今日當(dāng)值線程。
????當(dāng)線程池中的線程數(shù)目達(dá)到corePoolSize后,就會(huì)把到達(dá)的任務(wù)放到緩存隊(duì)列當(dāng)中。
2.maximumPoolSize:線程池能夠容納同時(shí)執(zhí)行的最大線程數(shù),此值必須大于等于1。
3.keepAliveTime:多余的空閑線程的存活時(shí)間。
????當(dāng)前線程池線程數(shù)量超過(guò)corePoolSize時(shí),當(dāng)空閑時(shí)間達(dá)到keepAliveTime值時(shí),多余空閑線程會(huì)被銷(xiāo)毀直到只剩下corePoolSize個(gè)線程為止。
4.unit:keepAliveTime的單位。
5.workQueue:任務(wù)隊(duì)列,被提交但尚未被執(zhí)行的任務(wù)。
6.threadFactory:表示生成線程池中工作線程的線程工廠,用于創(chuàng)建線程,一般用默認(rèn)的即可。
7.handler:拒絕策略,表示當(dāng)隊(duì)列滿了并且工作線程大于等于線程池的最大線程數(shù)(maximumPoolSize)時(shí)如何來(lái)拒絕。
6.設(shè)計(jì)模式
設(shè)計(jì)模式簡(jiǎn)介 | 菜鳥(niǎo)教程
二、JVM、GC、G1
1.jvm內(nèi)部
類加載子系統(tǒng)、堆、棧、方法區(qū)、直接內(nèi)存、垃圾回收系統(tǒng)、執(zhí)行引擎、本地方法棧、PC寄存器
2.加載
加載-鏈接(驗(yàn)證、準(zhǔn)備、解析)-初始化
類加載器:系統(tǒng)類加載器、擴(kuò)展類加載器、引導(dǎo)類加載器(啟動(dòng)類加載器)、用戶自定義加載器
雙親委派打破:1.jdk1.2之前還沒(méi)有,引入了線程上下文類加載器,熱代碼替換熱部署
3.堆
jdk7:新生代、老年代、永久代
jdk8:新生代、老年代、元空間
參數(shù)
-Xms、-Xmx設(shè)置堆內(nèi)存大小
新生代一般占1,老年代占2,eden比Survivor為8:1:1,朝生夕死。
垃圾收集:
頻繁在新生區(qū)收集,很少在養(yǎng)老區(qū)收集,幾乎不再永久區(qū)/元空間收集。
TLAB:線程私有緩存,避免線程不安全問(wèn)題,TLAB僅占有eden區(qū)的百分之一,優(yōu)先在TLAB分配,分配失敗會(huì)加鎖然后在eden區(qū)分配內(nèi)存。
逃逸分析、標(biāo)量替換(JIT即時(shí)編譯器會(huì)將對(duì)象拆解為基本數(shù)據(jù)類型):棧上分配。
4.方法區(qū)
jdk7:方法區(qū)-永久代
jdk8:元空間-方法區(qū)
常量池(數(shù)量值、字符串值、類引用、字段、方法引用)vs運(yùn)行時(shí)常量池(int、string)
方法區(qū)的垃圾回收(很難回收)
方法區(qū)的演變
?
?
?
5.jit即時(shí)編譯器
6.垃圾回收
stop?the?world、安全點(diǎn)與安全區(qū)域,強(qiáng)軟弱虛、內(nèi)存溢出與內(nèi)存泄漏。
引用計(jì)數(shù)法(循環(huán)引用問(wèn)題無(wú)法解決)、可達(dá)性分析算法(GC?ROOts,棧引用的對(duì)象、本地方法引用的對(duì)象、靜態(tài)屬性引用的對(duì)象、方法區(qū)中引用的對(duì)象例如字符串常量、同步鎖持有的對(duì)象、系統(tǒng)類加載器加載的對(duì)象等等)
finalize(),對(duì)象被銷(xiāo)毀之前會(huì)調(diào)用(只有一次復(fù)活機(jī)會(huì))
標(biāo)記-清除算法,復(fù)制算法,標(biāo)記-壓縮算法,分代回收,分區(qū)算法(G1)
7.垃圾回收器
串行新生代老年代回收(serial?GC)單核cpu
并行垃圾新生代老年代回收器(parallel?GC),吞吐量?jī)?yōu)先
parnew +?CMS并發(fā),但是需要有個(gè)兜底方案(低延遲)
G1區(qū)域化分代式,混合回收。分區(qū)域所以有個(gè)記憶集的概念,
zgc,革命性的。
三、springboot、springcloud
1.注解
@Bean、@Configuration、@ComponentScan掃描包(包括排除等等@Filter排除規(guī)則)、@Scope("prototype")(設(shè)置單實(shí)例多實(shí)例)、@Lazy-bean懶加載、@Conditional-按照條件注冊(cè)bean、@Import導(dǎo)入組件
@Controller、@Service、@Repository、@Component注冊(cè)名稱都是類名首字母小寫(xiě)
@Value賦值、@PropertySource加載配置文件、@EnableConfigurationProperties + @ConfigurationProperties自動(dòng)配置綁定
@Autowired自動(dòng)注入(優(yōu)先按照類型,多個(gè)類型就根據(jù)屬性名查找)@Autowired:可以標(biāo)注 構(gòu)造器、參數(shù)、方法、屬性。
@Qualifier指定需要裝配的組件名稱
@Primary裝配首選bean
@Resource默認(rèn)是按照屬性名裝配
@Inject自動(dòng)裝配,與@Autowired一樣
@RestController、@Controller、@ResponseBody、@RequestMapping("/hello")
@SpringBootApplication啟動(dòng)類,容器注冊(cè)
@PathVariable、@RequestHeader、@ModelAttribute、@RequestParam、@MatrixVariable、@CookieValue、@RequestBody、@RequestAttribute
@ControllerAdvice+@ExceptionHandler處理全局異常(推薦)
2.spring源碼
BeanPostProcessor后置處理器,bean賦值,注入其他組件、@Autowired、生命周期注解功能、@Async、等等很多功能都用到了BeanPostProcessor。
ApplicationContextAwareProcessor注入源碼
3.AOP
前置?后置?環(huán)繞?異常?返回通知。
在組件創(chuàng)建完成之后,判斷組件是否需要增強(qiáng),需要增強(qiáng)就返回一個(gè)代理對(duì)象。
攔截器鏈的概念
4.事務(wù)
@Transactional
底層使用AOP,
5.自動(dòng)配置原理
@EnableAutoConfiguration
* SpringBoot先加載所有的自動(dòng)配置類 xxxxxAutoConfiguration
* 每個(gè)自動(dòng)配置類按照條件進(jìn)行生效(@Conditionalxxxx),默認(rèn)都會(huì)綁定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件進(jìn)行了綁定
* 生效的配置類就會(huì)給容器中裝配很多組件
* 只要容器中有這些組件,相當(dāng)于這些功能就有了
* SpringBoot默認(rèn)會(huì)在底層配好所有的組件。但是如果用戶自己配置了以用戶的優(yōu)先(@ConditionalOnMissingBean)
*定制化配置:① 用戶直接自己@Bean替換底層的組件② 用戶去看這個(gè)組件是獲取的配置文件什么值就去修改。
xxxxxAutoConfiguration ---> 組件 ---> xxxxProperties里面拿值 ----> application.properties
6.請(qǐng)求處理原理
HttpServlet -> HttpServletBean -> FrameworkServlet -> DispatcherServlet(實(shí)現(xiàn)doService-> doDispatch方法處理請(qǐng)求)
處理請(qǐng)求、解析參數(shù)、攔截器HandlerInterceptor
7.springcloud
nacos、feign?openfeign、hystrix、gateway、sleuth?zipkin、
sentinel、seata(AT模式、SAGA模式)
四、docker、k8
docker使用
五、netty
RPC框架、心跳檢測(cè)、http服務(wù)器、即時(shí)通訊、消息推送
Channel通道,用來(lái)讀寫(xiě)連接等,
EventLoop用來(lái)處理事件。
異步非阻塞。
CPU核心數(shù)*2
bossGroup:接收連接。
workerGroup:負(fù)責(zé)具體的處理,交由對(duì)應(yīng)的 Handler 處理。
自帶的解碼器
六、xxljob
分布式任務(wù)調(diào)度,配合springbatch使用(但是springbatch比較復(fù)雜,reader、writer、processor等,所以直接用的tasklet)
七、處理生產(chǎn)問(wèn)題
jstack 、?jmap
jps:顯示當(dāng)前java縣城
jstack:查看當(dāng)前進(jìn)程的線程棧,通常查看死鎖、鎖等待等。
jmap:顯示各種信息,還可以生成堆dump快照(會(huì)stop應(yīng)用,生產(chǎn)慎用)
jstat查看堆內(nèi)存
八、redis
string
hash
list
set
zset(sortedSet)
bitmap(位圖)
HyperLogLog(統(tǒng)計(jì))
GEO(地理)
stream
1.string
set?get
ttl?查看過(guò)期時(shí)間
setnx?不存在創(chuàng)建
商品id等、點(diǎn)贊數(shù)、閱讀量,incr命令遞增
2.hash
hset?hget
做緩存用
3.list
lpush:向左添加
rpush:向右添加
訂閱列表
4.set(無(wú)序)
sadd、srem
交集、差集、并集運(yùn)算,隨機(jī)彈出元素(SPOP彈出并刪除,SRANDMEMBER彈出不刪除)。
抽獎(jiǎng)小程序、點(diǎn)贊用戶列表
微博社交關(guān)系(關(guān)注的人、我關(guān)注的人也關(guān)注她、可能認(rèn)識(shí)的人、共同關(guān)注等)
5.zset
zadd、
商品排序(排行榜)、抖音熱搜、
分布式鎖、redisson、內(nèi)存淘汰策略lru(最近最少使用)
哨兵、集群、持久化(快照、aof)
九、es
elk、查詢、倒排索引、IK分詞器、javaAPI
| Relational?DB(MySQL) | Elasticsearch |
| 數(shù)據(jù)庫(kù)(database) | 索引(indices)(就和數(shù)據(jù)庫(kù)一樣) |
| 表(tables) | 類型types(慢慢會(huì)被棄用) |
| 行(rows) | 文檔documents |
| 字段(columns) | 字段fields |
十、mysql
MyISAM和InnoDB(支持行鎖)
索引:單值索引、唯一索引、主鍵索引、復(fù)合索引
B+樹(shù),真實(shí)數(shù)據(jù)存在葉子結(jié)點(diǎn),非葉子節(jié)點(diǎn)不存儲(chǔ)真實(shí)數(shù)據(jù),只存儲(chǔ)索引方向。
需要索引:主鍵、頻繁查詢、頻繁更新、高并發(fā)下更傾向于用復(fù)合索引、排序字段、統(tǒng)計(jì)分組字段。
不需要:表記錄少、經(jīng)常刪改的、重復(fù)多的字段
explain:
id越大越先被執(zhí)行
type最好達(dá)到ref級(jí)別
key_len:越短越好。
索引失效:
1.全值匹配我最愛(ài)。
2.最佳左前綴法則。
3.不在索引列上計(jì)算、函數(shù)、類型轉(zhuǎn)換,字符串不加引號(hào)導(dǎo)致類型轉(zhuǎn)換。
4.范圍索引右邊的列會(huì)失效。
5.盡量使用覆蓋索引,少用select*
6.!= <>無(wú)法用索引
76.is?null?is?not?null
8.like以通配符開(kāi)頭的
9.少用or
慢查詢?nèi)罩尽ruid會(huì)有sql執(zhí)行時(shí)間
樂(lè)觀鎖悲觀鎖
總結(jié)
以上是生活随笔為你收集整理的抓住金三银四好机会,超齐全java大厂面试题汇总(请自寻学习查找答案)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: oracle-sqlloader的简单使
- 下一篇: java加载一个来自项目之外的java文