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