詳情提要: 記一次面試題
如果寫的有問題麻煩指出哦
一. Java基礎
1. ClassLoader的加載過程
- 加載: 通過類的完全限定名查找這個類的字節碼文件, 讀取這個類的二進制字節流到JVM中, 創建一個Class對象.
- 驗證: 通過文件格式、元數據驗證、字節碼驗證、符號引用四種驗證方法驗證Class文件, 確保字節流中的信息符合虛擬機要求, 不會危害虛擬機安全.
- 準備: 爲類變量(主要是靜態變量, final變量在編譯期就分配了)分配內存並設置初始值爲0(比如 static int a = 10, 則初始化爲0, 10在下一步初始化), 這裏不會爲實例變量分配初始化, 類變量會分配在方法區中, 而實例變量會隨着對象分配到Java堆中.
- 解析: 將常量池中的符號引用替換爲直接引用.
- 初始化: 如果這個類有父類, 則初始化父類, 執行靜態初始化器和靜態初始化成員變量(前面的static int a), 成員變量也會在這一步被初始化.
2. 堆和棧的區別
-
堆內存用來存放由new創建的對象和數組, 該區域是共享的.
特點是先進先出, 後進後出. 可以動態分配內存大小, 存取速度較慢.
-
棧內存主要是用於執行程序, 包含基本類型的變量和對象的引用變量.
特點是先進後出, 後進先出. 大小需要先確定, 但存取速度較快.
存放棧幀, 每個棧幀對應被調用的一個方法, 其中包括局部變量表, 操作數棧, 指向運行時常量池的引用, 方法返回地址等.
3. 臨時變量存在哪裏
棧內存
4. 辣雞回收如何判斷一個對象是否需要被回收
根搜索算法(可達性分析)
沒有引用計數法! 那是js用的
5. 根搜索算法的起點有哪些
- Java虛擬機棧中引用的對象, 比如局部變量
- 靜態屬性引用的對象
- 常量引用的對象
- 本地方法棧中引用的對象
二. Spring相關
1. Spring中Bean的作用域
基本作用域(singleton、prototype),Web 作用域(reqeust、session、global session), 自定義作用域.
- singleton: 單例
- prototype: 原型模式, 每次通過容器獲取都會產生新的實例.
- request: 對於每次HTTP請求, 使用request定義的Bean都會產生一個新的實例, 且只有在Web應用中使用Spring時, 該作用域才生效.
- session: 每次HTTP中使用session定義的Bean都會產生一個新的實例. 且只有在Web應用中使用Spring時, 該作用域才生效.
- global session: 每個全局的HTTP Session, 使用session定義的Bean都會產生一個新的實例. 典型情況僅在使用portlet context時有效, 且只有在Web應用中使用Spring時, 該作用域才生效.
三. Dubbo和ZooKeeper
1. ZooKeeper的節點類型
- 持久節點: 在節點創建後就一直存在, 直到被刪除, 不會因爲客戶端會話失效而清除.
- 持久順序節點: 和普通持久節點不同的是每個父節點會爲他的第一級子節點維護一份時序.
- 臨時節點: 生命週期和客戶端會話綁定, 客戶端失效時節點自動清除. 且臨時節點不能創建子節點.
- 臨時順序節點: 可以用於實現分佈式鎖.
2. ZooKeeper的節點存儲結構
樹形結構, 樹上的節點可以是文件也可以是目錄.
3. 服務註冊到ZooKeeper上時是什麼類型的節點, 爲什麼?
臨時節點, 連接斷開時節點被刪除.
4. Dubbo的通訊協議
netty
四. MySQL
1. MySQL有哪些引擎
主要有InnoDB和MyISAM
2. InnoDB和MyISAM的區別
- InnoDB:
- 支持事務處理
- 不加鎖讀取
- 支持外鍵
- 支持行鎖
- 不支持FULLTEXT類型的索引
- 不保存錶行數, 需要全表掃描
- DELETE時是一行一行刪
- 數據和索引都存在表空間
- MyISAM:
- 不支持事務, 回滾會造成不完全回滾, 不具有原子性
- 不支持外鍵
- 支持全文搜索
- 保存錶行數
- DELETE時先drop再重建
- 索引和數據分開存, frm存放表結構, MYD存放數據, MYI存放索引
五. Redis
1. Redis常用數據類型
String, Hash, List, Set, ZSet
2. Redis如何設置過期時間
Expire命令
3. Redis如何更換key
Rename