mysql经常问到的面试题_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, 循環的末尾 (防止大循環的時候一直不進入 safepoint,而其他線程在等待它進入
safepoint)
方法返回前
調用方法的 call 之后
拋出異常的位置
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. 數據庫三范式是什么? 第一范式(1NF):字段具有原子性,不可再分。(所有關系型數據庫系
統都滿足第一范式數據庫表中的字段都是單一屬性的,不可再分)
第二范式(2NF)是在第一范式(1NF)的基礎上建立起來的,即滿足
第二范式(2NF)必須先滿足第一范式(1NF)。要求數據庫表中的每
個實例或行必須可以被惟一地區分。通常需要為表加上一個列,以存儲
各個實例的惟一標識。這個惟一屬性列被稱為主關鍵字或主鍵。
滿足第三范式(3NF)必須先滿足第二范式(2NF)。簡而言之,第三
范式(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主關
鍵字信息。 >所以第三范式具有如下特征: >>1. 每一列只有一個
值 >>2. 每一行都能區分。 >>3. 每一個表都不包含其他表已經包含
的非主關鍵字信息。
2. 有哪些數據庫優化方面的經驗? 用 PreparedStatement, 一般來說比 Statement 性能高:一個 sql
發給服務器去執行,涉及步驟:語法檢查、語義分析, 編譯,緩存。
有外鍵約束會影響插入和刪除性能,如果程序能夠保證數據的完整性,
那在設計數據庫時就去掉外鍵。
表中允許適當冗余,譬如,主題帖的回復數量和最后回復時間等
UNION ALL 要比 UNION 快很多,所以,如果可以確認合并的兩個結
果集中不包含重復數據且不需要排序時的話,那么就使用 UNION
ALL。 >>UNION 和 UNION ALL 關鍵字都是將兩個結果集合并為一
個,但這兩者從使用和效率上來說都有所不同。 >1. 對重復結果的處
理:UNION 在進行表鏈接后會篩選掉重復的記錄,Union All 不會去除
重復記錄。 >2. 對排序的處理:Union 將會按照字段的順序進行排
序;UNION ALL 只是簡單的將兩個結果合并后就返回。
3. 請簡述常用的索引有哪些種類? 普通索引: 即針對數據庫表創建索引
唯一索引: 與普通索引類似,不同的就是:MySQL 數據庫索引列的值
必須唯一,但允許有空值
主鍵索引: 它是一種特殊的唯一索引,不允許有空值。一般是在建表的
時候同時創建主鍵索引
組合索引: 為了進一步榨取 MySQL 的效率,就要考慮建立組合索引。
即將數據庫表中的多個字段聯合起來作為一個組合索引。
4. 以及在 mysql 數據庫中索引的工作機制是什么?
數據庫索引,是數據庫管理系統中一個排序的數據結構,以協助快速查詢、更
新數據庫表中數據。索引的實現通常使用 B 樹及其變種 B+樹
5.MySQL 的基礎操作命令: MySQL 是否處于運行狀態:Debian 上運行命令 service mysql
status,在 RedHat 上運行命令 service mysqld status
開啟或停止 MySQL 服務 :運行命令 service mysqld start 開啟服
務;運行命令 service mysqld stop 停止服務
Shell 登入 MySQL: 運行命令 mysql -u root -p
列出所有數據庫:運行命令 show databases;
切換到某個數據庫并在上面工作:運行命令 use databasename; 進入
名為 databasename 的數據庫
列出某個數據庫內所有表: show tables;
獲取表內所有 Field 對象的名稱和類型 :describe table_name;
6.mysql 的復制原理以及流程。
Mysql 內建的復制功能是構建大型,高性能應用程序的基礎。將 Mysql 的數據
分布到多個系統上去,這種分布的機制,是通過將 Mysql 的某一臺主機的數據
復制到其它主機(slaves)上,并重新執行一遍來實現的。 * 復制過程中一
個服務器充當主服務器,而一個或多個其它服務器充當從服務器。主服務器將
更新寫入二進制日志文件,并維護文件的一個索引以跟蹤日志循環。這些日志
可以記錄發送到從服務器的更新。 當一個從服務器連接主服務器時,它通知主
服務器在日志中讀取的最后一次成功更新的位置。從服務器接收從那時起發生
的任何更新,然后封鎖并等待主服務器通知新的更新。 過程如下 1. 主服務器
把更新記錄到二進制日志文件中。 2. 從服務器把主服務器的二進制日志拷貝
到自己的中繼日志(replay log)中。 3. 從服務器重做中繼日志中的時間,
把更新應用到自己的數據庫上。
7.mysql 支持的復制類型? 基于語句的復制: 在主服務器上執行的 SQL 語句,在從服務器上執行
同樣的語句。MySQL 默認采用基于語句的復制,效率比較高。 一旦發
現沒法精確復制時,會自動選著基于行的復制。
基于行的復制:把改變的內容復制過去,而不是把命令在從服務器上執
行一遍. 從 mysql5.0 開始支持
混合類型的復制: 默認采用基于語句的復制,一旦發現基于語句的無法
精確的復制時,就會采用基于行的復制。
8.mysql 中 中 varchar 與 與 char 的區別以及 varchar(50) 中的 50 代表的涵
義? varchar 與 char 的區別: char 是一種固定長度的類型,varchar 則是
一種可變長度的類型.
varchar(50)中 50 的涵義 : 最多存放 50 個字節
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 將使用表鎖!
總結
以上是生活随笔為你收集整理的mysql经常问到的面试题_20道BAT面试官最喜欢问的JVM+MySQL面试题(含答案解析)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redisson用阿里云集群版redis
- 下一篇: portainer 启动mysql_Do