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