mysql经常问到的面试题_20道BAT面试官最喜欢问的JVM+MySQL面试题(含答案解析)...
1. 內(nèi)存模型以及分區(qū),需要詳細(xì)到每個區(qū)放什么。
JVM 分為堆區(qū)和棧區(qū),還有方法區(qū),初始化的對象放在堆里面,引用放在棧里面,
class 類信息常量池(static 常量和 static 變量)等放在方法區(qū)
new:
方法區(qū):主要是存儲類信息,常量池(static 常量和 static 變量),編譯后的代碼(字
節(jié)碼)等數(shù)據(jù)
堆:初始化的對象,成員變量 (那種非 static 的變量),所有的對象實例和數(shù)組都要
在堆上分配
棧:棧的結(jié)構(gòu)是棧幀組成的,調(diào)用一個方法就壓入一幀,幀上面存儲局部變量表,操
作數(shù)棧,方法出口等信息,局部變量表存放的是 8 大基礎(chǔ)類型加上一個應(yīng)用類型,所
以還是一個指向地址的指針
本地方法棧:主要為 Native 方法服務(wù)
程序計數(shù)器:記錄當(dāng)前線程執(zhí)行的行號
2. 堆里面的分區(qū):Eden,survival (from+ to),老年代,各自的特點。
堆里面分為新生代和老生代(java8 取消了永久代,采用了 Metaspace),新生代包
含 Eden+Survivor 區(qū),survivor 區(qū)里面分為 from 和 to 區(qū),內(nèi)存回收時,如果用的是復(fù)
制算法,從 from 復(fù)制到 to,當(dāng)經(jīng)過一次或者多次 GC 之后,存活下來的對象會被移動
到老年區(qū),當(dāng) JVM 內(nèi)存不夠用的時候,會觸發(fā) Full GC,清理 JVM 老年區(qū)
當(dāng)新生區(qū)滿了之后會觸發(fā) YGC,先把存活的對象放到其中一個 Survice
區(qū),然后進行垃圾清理。因為如果僅僅清理需要刪除的對象,這樣會導(dǎo)致內(nèi)存碎
片,因此一般會把 Eden 進行完全的清理,然后整理內(nèi)存。那么下次 GC 的時候,
就會使用下一個 Survive,這樣循環(huán)使用。如果有特別大的對象,新生代放不下,
就會使用老年代的擔(dān)保,直接放到老年代里面。因為 JVM 認(rèn)為,一般大對象的存
活時間一般比較久遠(yuǎn)。
3. 對象創(chuàng)建方法,對象的內(nèi)存分配,對象的訪問定位。
new 一個對象
4. GC 的兩種判定方法:
引用計數(shù)法:指的是如果某個地方引用了這個對象就+1,如果失效了就-1,當(dāng)為 0 就
會回收但是 JVM 沒有用這種方式,因為無法判定相互循環(huán)引用(A 引用 B,B 引用 A)
的情況
引用鏈法: 通過一種 GC ROOT 的對象(方法區(qū)中靜態(tài)變量引用的對象等-static 變
量)來判斷,如果有一條鏈能夠到達(dá) GC ROOT 就說明,不能到達(dá) GC ROOT 就說明
可以回收
5. SafePoint 是什么
比如 GC 的時候必須要等到 Java 線程都進入到 safepoint 的時候 VMThread 才能開始
執(zhí)行 GC, 循環(huán)的末尾 (防止大循環(huán)的時候一直不進入 safepoint,而其他線程在等待它進入
safepoint)
方法返回前
調(diào)用方法的 call 之后
拋出異常的位置
6. GC 的三種收集方法:標(biāo)記清除、標(biāo)記整理、復(fù)制算法的原理與特點,分別用
在什么地方,如果讓你優(yōu)化收集方法,有什么思路?
先標(biāo)記,標(biāo)記完畢之后再清除,效率不高,會產(chǎn)生碎片
復(fù)制算法:分為 8:1 的 Eden 區(qū)和 survivor 區(qū),就是上面談到的 YGC
標(biāo)記整理:標(biāo)記完畢之后,讓所有存活的對象向一端移動
7. GC 收集器有哪些?CMS 收集器與 G1 收集器的特點。
并行收集器:串行收集器使用一個單獨的線程進行收集,GC 時服務(wù)有停頓時間
串行收集器:次要回收中使用多線程來執(zhí)行
CMS 收集器是基于“ 標(biāo)記― 清除”算法實現(xiàn)的,經(jīng)過多次標(biāo)記才會被清除
G1 從 整體來看是基于“ 標(biāo)記― 整理”算法實現(xiàn)的收集器,從 局部(兩個 Region 之間)
上來看是基于“ 復(fù)制”算法實現(xiàn)的
8. Minor GC 與 Full GC 分別在什么時候發(fā)生?
新生代內(nèi)存不夠用時候發(fā)生 MGC 也叫 YGC,JVM 內(nèi)存不夠的時候發(fā)生 FGC
9. 幾種常用的內(nèi)存調(diào)試工具:jmap、jstack、jconsole、jhat
jstack 可以看當(dāng)前棧的情況,jmap 查看內(nèi)存,jhat 進行 dump 堆的信息
mat(eclipse 的也要了解一下)
10. 類加載的幾個過程:
加載、驗證、準(zhǔn)備、解析、初始化。然后是使用和卸載了
通過全限定名來加載生成 class 對象到內(nèi)存中,然后進行驗證這個 class 文件,包括文
件格式校驗、元數(shù)據(jù)驗證,字節(jié)碼校驗等。準(zhǔn)備是對這個對象分配內(nèi)存。解析是將符
號引用轉(zhuǎn)化為直接引用(指針引用),初始化就是開始執(zhí)行構(gòu)造器的代碼
1. 數(shù)據(jù)庫三范式是什么? 第一范式(1NF):字段具有原子性,不可再分。(所有關(guān)系型數(shù)據(jù)庫系
統(tǒng)都滿足第一范式數(shù)據(jù)庫表中的字段都是單一屬性的,不可再分)
第二范式(2NF)是在第一范式(1NF)的基礎(chǔ)上建立起來的,即滿足
第二范式(2NF)必須先滿足第一范式(1NF)。要求數(shù)據(jù)庫表中的每
個實例或行必須可以被惟一地區(qū)分。通常需要為表加上一個列,以存儲
各個實例的惟一標(biāo)識。這個惟一屬性列被稱為主關(guān)鍵字或主鍵。
滿足第三范式(3NF)必須先滿足第二范式(2NF)。簡而言之,第三
范式(3NF)要求一個數(shù)據(jù)庫表中不包含已在其它表中已包含的非主關(guān)
鍵字信息。 >所以第三范式具有如下特征: >>1. 每一列只有一個
值 >>2. 每一行都能區(qū)分。 >>3. 每一個表都不包含其他表已經(jīng)包含
的非主關(guān)鍵字信息。
2. 有哪些數(shù)據(jù)庫優(yōu)化方面的經(jīng)驗? 用 PreparedStatement, 一般來說比 Statement 性能高:一個 sql
發(fā)給服務(wù)器去執(zhí)行,涉及步驟:語法檢查、語義分析, 編譯,緩存。
有外鍵約束會影響插入和刪除性能,如果程序能夠保證數(shù)據(jù)的完整性,
那在設(shè)計數(shù)據(jù)庫時就去掉外鍵。
表中允許適當(dāng)冗余,譬如,主題帖的回復(fù)數(shù)量和最后回復(fù)時間等
UNION ALL 要比 UNION 快很多,所以,如果可以確認(rèn)合并的兩個結(jié)
果集中不包含重復(fù)數(shù)據(jù)且不需要排序時的話,那么就使用 UNION
ALL。 >>UNION 和 UNION ALL 關(guān)鍵字都是將兩個結(jié)果集合并為一
個,但這兩者從使用和效率上來說都有所不同。 >1. 對重復(fù)結(jié)果的處
理:UNION 在進行表鏈接后會篩選掉重復(fù)的記錄,Union All 不會去除
重復(fù)記錄。 >2. 對排序的處理:Union 將會按照字段的順序進行排
序;UNION ALL 只是簡單的將兩個結(jié)果合并后就返回。
3. 請簡述常用的索引有哪些種類? 普通索引: 即針對數(shù)據(jù)庫表創(chuàng)建索引
唯一索引: 與普通索引類似,不同的就是:MySQL 數(shù)據(jù)庫索引列的值
必須唯一,但允許有空值
主鍵索引: 它是一種特殊的唯一索引,不允許有空值。一般是在建表的
時候同時創(chuàng)建主鍵索引
組合索引: 為了進一步榨取 MySQL 的效率,就要考慮建立組合索引。
即將數(shù)據(jù)庫表中的多個字段聯(lián)合起來作為一個組合索引。
4. 以及在 mysql 數(shù)據(jù)庫中索引的工作機制是什么?
數(shù)據(jù)庫索引,是數(shù)據(jù)庫管理系統(tǒng)中一個排序的數(shù)據(jù)結(jié)構(gòu),以協(xié)助快速查詢、更
新數(shù)據(jù)庫表中數(shù)據(jù)。索引的實現(xiàn)通常使用 B 樹及其變種 B+樹
5.MySQL 的基礎(chǔ)操作命令: MySQL 是否處于運行狀態(tài):Debian 上運行命令 service mysql
status,在 RedHat 上運行命令 service mysqld status
開啟或停止 MySQL 服務(wù) :運行命令 service mysqld start 開啟服
務(wù);運行命令 service mysqld stop 停止服務(wù)
Shell 登入 MySQL: 運行命令 mysql -u root -p
列出所有數(shù)據(jù)庫:運行命令 show databases;
切換到某個數(shù)據(jù)庫并在上面工作:運行命令 use databasename; 進入
名為 databasename 的數(shù)據(jù)庫
列出某個數(shù)據(jù)庫內(nèi)所有表: show tables;
獲取表內(nèi)所有 Field 對象的名稱和類型 :describe table_name;
6.mysql 的復(fù)制原理以及流程。
Mysql 內(nèi)建的復(fù)制功能是構(gòu)建大型,高性能應(yīng)用程序的基礎(chǔ)。將 Mysql 的數(shù)據(jù)
分布到多個系統(tǒng)上去,這種分布的機制,是通過將 Mysql 的某一臺主機的數(shù)據(jù)
復(fù)制到其它主機(slaves)上,并重新執(zhí)行一遍來實現(xiàn)的。 * 復(fù)制過程中一
個服務(wù)器充當(dāng)主服務(wù)器,而一個或多個其它服務(wù)器充當(dāng)從服務(wù)器。主服務(wù)器將
更新寫入二進制日志文件,并維護文件的一個索引以跟蹤日志循環(huán)。這些日志
可以記錄發(fā)送到從服務(wù)器的更新。 當(dāng)一個從服務(wù)器連接主服務(wù)器時,它通知主
服務(wù)器在日志中讀取的最后一次成功更新的位置。從服務(wù)器接收從那時起發(fā)生
的任何更新,然后封鎖并等待主服務(wù)器通知新的更新。 過程如下 1. 主服務(wù)器
把更新記錄到二進制日志文件中。 2. 從服務(wù)器把主服務(wù)器的二進制日志拷貝
到自己的中繼日志(replay log)中。 3. 從服務(wù)器重做中繼日志中的時間,
把更新應(yīng)用到自己的數(shù)據(jù)庫上。
7.mysql 支持的復(fù)制類型? 基于語句的復(fù)制: 在主服務(wù)器上執(zhí)行的 SQL 語句,在從服務(wù)器上執(zhí)行
同樣的語句。MySQL 默認(rèn)采用基于語句的復(fù)制,效率比較高。 一旦發(fā)
現(xiàn)沒法精確復(fù)制時,會自動選著基于行的復(fù)制。
基于行的復(fù)制:把改變的內(nèi)容復(fù)制過去,而不是把命令在從服務(wù)器上執(zhí)
行一遍. 從 mysql5.0 開始支持
混合類型的復(fù)制: 默認(rèn)采用基于語句的復(fù)制,一旦發(fā)現(xiàn)基于語句的無法
精確的復(fù)制時,就會采用基于行的復(fù)制。
8.mysql 中 中 varchar 與 與 char 的區(qū)別以及 varchar(50) 中的 50 代表的涵
義? varchar 與 char 的區(qū)別: char 是一種固定長度的類型,varchar 則是
一種可變長度的類型.
varchar(50)中 50 的涵義 : 最多存放 50 個字節(jié)
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 不會經(jīng)常更新,以讀為
為主,將該字段拆成子表好處是什么?
如果字段里面有大字段(text,blob)類型的,而且這些字段的訪問并不多,這
時候放在一起就變成缺點了。 MYSQL 數(shù)據(jù)庫的記錄存儲是按行存儲的,數(shù)據(jù)
塊大小又是固定的(16K),每條記錄越小,相同的塊存儲的記錄就越多。此
時應(yīng)該把大字段拆走,這樣應(yīng)付大部分小字段的查詢時,就能提高效率。當(dāng)需
要查詢大字段時,此時的關(guān)聯(lián)查詢是不可避免的,但也是值得的。拆分開后,
對字段的 UPDAE 就要 UPDATE 多個表了
10.MySQL 中 中 InnoDB 引擎的行鎖是通過加在什么上完成(或稱實現(xiàn))
的?
InnoDB 行鎖是通過給索引上的索引項加鎖來實現(xiàn)的,這一點 MySQL 與
Oracle 不同,后者是通過在數(shù)據(jù)塊中對相應(yīng)數(shù)據(jù)行加鎖來實現(xiàn)的。InnoDB 這
種行鎖實現(xiàn)特點意味著:只有通過索引條件檢索數(shù)據(jù),InnoDB 才使用行級
鎖,否則,InnoDB 將使用表鎖!
總結(jié)
以上是生活随笔為你收集整理的mysql经常问到的面试题_20道BAT面试官最喜欢问的JVM+MySQL面试题(含答案解析)...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redisson用阿里云集群版redis
- 下一篇: portainer 启动mysql_Do