20道BAT面試官最喜歡問的JVM+MySQL面試題(含答案解析)

1. 內存模型以及分區,需要詳細到每個區放什麼。

JVM 分爲堆區和棧區,還有方法區,初始化的對象放在堆裏面,引用放在棧裏面,

class 類信息常量池(static 常量和 static 變量)等放在方法區

new:

方法區:主要是存儲類信息,常量池(static 常量和 static 變量),編譯後的代碼(字

節碼)等數據

堆:初始化的對象,成員變量 (那種非 static 的變量),所有的對象實例和數組都要

在堆上分配

棧:棧的結構是棧幀組成的,調用一個方法就壓入一幀,幀上面存儲局部變量表,操

作數棧,方法出口等信息,局部變量表存放的是 8 大基礎類型加上一個應用類型,所

以還是一個指向地址的指針

本地方法棧:主要爲 Native 方法服務

程序計數器:記錄當前線程執行的行號

2. 堆裏面的分區:Eden,survival (from+ to),老年代,各自的特點。

堆裏面分爲新生代和老生代(java8 取消了永久代,採用了 Metaspace),新生代包

含 Eden+Survivor 區,survivor 區裏面分爲 from 和 to 區,內存回收時,如果用的是復

制算法,從 from 複製到 to,當經過一次或者多次 GC 之後,存活下來的對象會被移動

到老年區,當 JVM 內存不夠用的時候,會觸發 Full GC,清理 JVM 老年區

當新生區滿了之後會觸發 YGC,先把存活的對象放到其中一個 Survice

區,然後進行垃圾清理。因爲如果僅僅清理需要刪除的對象,這樣會導致內存碎

片,因此一般會把 Eden 進行完全的清理,然後整理內存。那麼下次 GC 的時候,

就會使用下一個 Survive,這樣循環使用。如果有特別大的對象,新生代放不下,

就會使用老年代的擔保,直接放到老年代裏面。因爲 JVM 認爲,一般大對象的存

活時間一般比較久遠。

3. 對象創建方法,對象的內存分配,對象的訪問定位。

new 一個對象

4. GC 的兩種判定方法:

引用計數法:指的是如果某個地方引用了這個對象就+1,如果失效了就-1,當爲 0 就

會回收但是 JVM 沒有用這種方式,因爲無法判定相互循環引用(A 引用 B,B 引用 A)

的情況

引用鏈法: 通過一種 GC ROOT 的對象(方法區中靜態變量引用的對象等-static 變

量)來判斷,如果有一條鏈能夠到達 GC ROOT 就說明,不能到達 GC ROOT 就說明

可以回收

5. SafePoint 是什麼

比如 GC 的時候必須要等到 Java 線程都進入到 safepoint 的時候 VMThread 才能開始

執行 GC,

1. 循環的末尾 (防止大循環的時候一直不進入 safepoint,而其他線程在等待它進入

safepoint)

2. 方法返回前

3. 調用方法的 call 之後

4. 拋出異常的位置

6. GC 的三種收集方法:標記清除、標記整理、複製算法的原理與特點,分別用

在什麼地方,如果讓你優化收集方法,有什麼思路?

先標記,標記完畢之後再清除,效率不高,會產生碎片

複製算法:分爲 8:1 的 Eden 區和 survivor 區,就是上面談到的 YGC

標記整理:標記完畢之後,讓所有存活的對象向一端移動

7. GC 收集器有哪些?CMS 收集器與 G1 收集器的特點。

並行收集器:串行收集器使用一個單獨的線程進行收集,GC 時服務有停頓時間

串行收集器:次要回收中使用多線程來執行

CMS 收集器是基於“ 標記— 清除”算法實現的,經過多次標記纔會被清除

G1 從 整體來看是基於“ 標記— 整理”算法實現的收集器,從 局部(兩個 Region 之間)

上來看是基於“ 複製”算法實現的

8. Minor GC 與 Full GC 分別在什麼時候發生?

新生代內存不夠用時候發生 MGC 也叫 YGC,JVM 內存不夠的時候發生 FGC

9. 幾種常用的內存調試工具:jmap、jstack、jconsole、jhat

jstack 可以看當前棧的情況,jmap 查看內存,jhat 進行 dump 堆的信息

mat(eclipse 的也要了解一下)

10. 類加載的幾個過程:

加載、驗證、準備、解析、初始化。然後是使用和卸載了

通過全限定名來加載生成 class 對象到內存中,然後進行驗證這個 class 文件,包括文

件格式校驗、元數據驗證,字節碼校驗等。準備是對這個對象分配內存。解析是將符

號引用轉化爲直接引用(指針引用),初始化就是開始執行構造器的代碼

1. 數據庫三範式是什麼?

1. 第一範式(1NF):字段具有原子性,不可再分。(所有關係型數據庫系

統都滿足第一範式數據庫表中的字段都是單一屬性的,不可再分)

2. 第二範式(2NF)是在第一範式(1NF)的基礎上建立起來的,即滿足

第二範式(2NF)必須先滿足第一範式(1NF)。要求數據庫表中的每

個實例或行必須可以被惟一地區分。通常需要爲表加上一個列,以存儲

各個實例的惟一標識。這個惟一屬性列被稱爲主關鍵字或主鍵。

3. 滿足第三範式(3NF)必須先滿足第二範式(2NF)。簡而言之,第三

範式(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主關

鍵字信息。 >所以第三範式具有如下特徵: >>1. 每一列只有一個

值 >>2. 每一行都能區分。 >>3. 每一個表都不包含其他表已經包含

的非主關鍵字信息。


2. 有哪些數據庫優化方面的經驗?

1. 用 PreparedStatement, 一般來說比 Statement 性能高:一個 sql

發給服務器去執行,涉及步驟:語法檢查、語義分析, 編譯,緩存。

2. 有外鍵約束會影響插入和刪除性能,如果程序能夠保證數據的完整性,

那在設計數據庫時就去掉外鍵。

3. 表中允許適當冗餘,譬如,主題帖的回覆數量和最後回覆時間等

4. UNION ALL 要比 UNION 快很多,所以,如果可以確認合併的兩個結

果集中不包含重複數據且不需要排序時的話,那麼就使用 UNION

ALL。 >>UNION 和 UNION ALL 關鍵字都是將兩個結果集合併爲一

個,但這兩者從使用和效率上來說都有所不同。 >1. 對重複結果的處

理:UNION 在進行錶鏈接後會篩選掉重複的記錄,Union All 不會去除

重複記錄。 >2. 對排序的處理:Union 將會按照字段的順序進行排

序;UNION ALL 只是簡單的將兩個結果合併後就返回。


3. 請簡述常用的索引有哪些種類?

1. 普通索引: 即針對數據庫表創建索引

2. 唯一索引: 與普通索引類似,不同的就是:MySQL 數據庫索引列的值

必須唯一,但允許有空值

3. 主鍵索引: 它是一種特殊的唯一索引,不允許有空值。一般是在建表的

時候同時創建主鍵索引

4. 組合索引: 爲了進一步榨取 MySQL 的效率,就要考慮建立組合索引。

即將數據庫表中的多個字段聯合起來作爲一個組合索引。


4. 以及在 mysql 數據庫中索引的工作機制是什麼?

數據庫索引,是數據庫管理系統中一個排序的數據結構,以協助快速查詢、更

新數據庫表中數據。索引的實現通常使用 B 樹及其變種 B+樹

5.MySQL 的基礎操作命令:

1. MySQL 是否處於運行狀態:Debian 上運行命令 service mysql

status,在 RedHat 上運行命令 service mysqld status

2. 開啓或停止 MySQL 服務 :運行命令 service mysqld start 開啓服

務;運行命令 service mysqld stop 停止服務

3. Shell 登入 MySQL: 運行命令 mysql -u root -p

4. 列出所有數據庫:運行命令 show databases;

5. 切換到某個數據庫並在上面工作:運行命令 use databasename; 進入

名爲 databasename 的數據庫

6. 列出某個數據庫內所有表: show tables;

7. 獲取表內所有 Field 對象的名稱和類型 :describe table_name;

6.mysql 的複製原理以及流程。

Mysql 內建的複製功能是構建大型,高性能應用程序的基礎。將 Mysql 的數據

分佈到多個系統上去,這種分佈的機制,是通過將 Mysql 的某一臺主機的數據

複製到其它主機(slaves)上,並重新執行一遍來實現的。 * 複製過程中一

個服務器充當主服務器,而一個或多個其它服務器充當從服務器。主服務器將

更新寫入二進制日誌文件,並維護文件的一個索引以跟蹤日誌循環。這些日誌

可以記錄發送到從服務器的更新。 當一個從服務器連接主服務器時,它通知主

服務器在日誌中讀取的最後一次成功更新的位置。從服務器接收從那時起發生

的任何更新,然後封鎖並等待主服務器通知新的更新。 過程如下 1. 主服務器

把更新記錄到二進制日誌文件中。 2. 從服務器把主服務器的二進制日誌拷貝

到自己的中繼日誌(replay log)中。 3. 從服務器重做中繼日誌中的時間,

把更新應用到自己的數據庫上。

7.mysql 支持的複製類型?

1. 基於語句的複製: 在主服務器上執行的 SQL 語句,在從服務器上執行

同樣的語句。MySQL 默認採用基於語句的複製,效率比較高。 一旦發

現沒法精確複製時,會自動選着基於行的複製。

2. 基於行的複製:把改變的內容複製過去,而不是把命令在從服務器上執

行一遍. 從 mysql5.0 開始支持

3. 混合類型的複製: 默認採用基於語句的複製,一旦發現基於語句的無法

精確的複製時,就會採用基於行的複製。


8.mysql 中 中 varchar 與 與 char 的區別以及 varchar(50) 中的 50 代表的涵

義?

1. varchar 與 char 的區別: char 是一種固定長度的類型,varchar 則是

一種可變長度的類型.

2. varchar(50)中 50 的涵義 : 最多存放 50 個字節

3. int(20)中 20 的涵義: int(M)中的 M indicates the maximum

display width (最大顯示寬度)for integer types. The maximum

legal display width is 255.

9. 表中有大字段 X (例如:text 類型),且字段 X 不會經常更新,以讀爲

爲主,將該字段拆成子表好處是什麼?

如果字段裏面有大字段(text,blob)類型的,而且這些字段的訪問並不多,這

時候放在一起就變成缺點了。 MYSQL 數據庫的記錄存儲是按行存儲的,數據

塊大小又是固定的(16K),每條記錄越小,相同的塊存儲的記錄就越多。此

時應該把大字段拆走,這樣應付大部分小字段的查詢時,就能提高效率。當需

要查詢大字段時,此時的關聯查詢是不可避免的,但也是值得的。拆分開後,

對字段的 UPDAE 就要 UPDATE 多個表了

10.MySQL 中 中 InnoDB 引擎的行鎖是通過加在什麼上完成(或稱實現)

的?

InnoDB 行鎖是通過給索引上的索引項加鎖來實現的,這一點 MySQL 與

Oracle 不同,後者是通過在數據塊中對相應數據行加鎖來實現的。InnoDB 這

種行鎖實現特點意味着:只有通過索引條件檢索數據,InnoDB 才使用行級

鎖,否則,InnoDB 將使用表鎖!

歡迎大家一起交流,希望文章記得關注我點個喜歡喲,感謝支持!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章