大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

        專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
        動力節點LOGO圖
        始于2009,口口相傳的Java黃埔軍校
        首頁 學習攻略 Java學習 最常見的208道Java最新面試題及答案(五)

        最常見的208道Java最新面試題及答案(五)

        更新時間:2019-10-15 14:05:51 來源:動力節點 瀏覽3193次


        171、MySQL 索引是怎么實現的?


          索引是滿足某種特定查找算法的數據結構,而這些數據結構會以某種方式指向數據,從而實現高效查找數據。


          具體來說 MySQL 中的索引,不同的數據引擎實現有所不同,但目前主流的數據庫引擎的索引都是 B+ 樹實現的,B+ 樹的搜索效率,可以到達二分法的性能,找到數據區域之后就找到了完整的數據結構了,所有索引的性能也是更好的。


          172、怎么驗證 MySQL 的索引是否滿足需求?


          使用 explain 查看 SQL 是如何執行查詢語句的,從而分析你的索引是否滿足需求。


          explain 語法:explain select * from table where type=1。


          173、說一下數據庫的事務隔離?


          MySQL 的事務隔離是在 MySQL. ini 配置文件里添加的,在文件的最后添加:


          transaction-isolation = REPEATABLE-READ


          可用的配置值:READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE。


          READ-UNCOMMITTED:未提交讀,最低隔離級別、事務未提交前,就可被其他事務讀取(會出現幻讀、臟讀、不可重復讀)。


          READ-COMMITTED:提交讀,一個事務提交后才能被其他事務讀取到(會造成幻讀、不可重復讀)。


          REPEATABLE-READ:可重復讀,默認級別,保證多次讀取同一個數據時,其值都和事務開始時候的內容是一致,禁止讀取到別的事務未提交的數據(會造成幻讀)。


          SERIALIZABLE:序列化,代價最高最可靠的隔離級別,該隔離級別能防止臟讀、不可重復讀、幻讀。


          臟讀 :表示一個事務能夠讀取另一個事務中還未提交的數據。比如,某個事務嘗試插入記錄 A,此時該事務還未提交,然后另一個事務嘗試讀取到了記錄 A。


          不可重復讀 :是指在一個事務內,多次讀同一數據。


          幻讀 :指同一個事務內多次查詢返回的結果集不一樣。比如同一個事務 A 第一次查詢時候有 n 條記錄,但是第二次同等條件下查詢卻有 n+1 條記錄,這就好像產生了幻覺。發生幻讀的原因也是另外一個事務新增或者刪除或者修改了第一個事務結果集里面的數據,同一個記錄的數據內容被修改了,所有數據行的記錄就變多或者變少了。


          174、說一下 MySQL 常用的引擎?


          InnoDB 引擎:InnoDB 引擎提供了對數據庫 acid 事務的支持,并且還提供了行級鎖和外鍵的約束,它的設計的目標就是處理大數據容量的數據庫系統。MySQL 運行的時候,InnoDB 會在內存中建立緩沖池,用于緩沖數據和索引。但是該引擎是不支持全文搜索,同時啟動也比較的慢,它是不會保存表的行數的,所以當進行 select count(*) from table 指令的時候,需要進行掃描全表。由于鎖的粒度小,寫操作是不會鎖定全表的,所以在并發度較高的場景下使用會提升效率的。


          MyIASM 引擎:MySQL 的默認引擎,但不提供事務的支持,也不支持行級鎖和外鍵。因此當執行插入和更新語句時,即執行寫操作的時候需要鎖定這個表,所以會導致效率會降低。不過和 InnoDB 不同的是,MyIASM 引擎是保存了表的行數,于是當進行 select count(*) from table 語句時,可以直接的讀取已經保存的值而不需要進行掃描全表。所以,如果表的讀操作遠遠多于寫操作時,并且不需要事務的支持的,可以將 MyIASM 作為數據庫引擎的首選。


          175、說一下 MySQL 的行鎖和表鎖?


          MyISAM 只支持表鎖,InnoDB 支持表鎖和行鎖,默認為行鎖。


          表級鎖:開銷小,加鎖快,不會出現死鎖。鎖定粒度大,發生鎖沖突的概率最高,并發量最低。


          行級鎖:開銷大,加鎖慢,會出現死鎖。鎖力度小,發生鎖沖突的概率小,并發度最高。


          176、說一下樂觀鎖和悲觀鎖?


          樂觀鎖:每次去拿數據的時候都認為別人不會修改,所以不會上鎖,但是在提交更新的時候會判斷一下在此期間別人有沒有去更新這個數據。


          悲觀鎖:每次去拿數據的時候都認為別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會阻止,直到這個鎖被釋放。


          數據庫的樂觀鎖需要自己實現,在表里面添加一個 version 字段,每次修改成功值加 1,這樣每次修改的時候先對比一下,自己擁有的 version 和數據庫現在的 version 是否一致,如果不一致就不修改,這樣就實現了樂觀鎖。


          177、MySQL 問題排查都有哪些手段?


          使用 show processlist 命令查看當前所有連接信息。


          使用 explain 命令查詢 SQL 語句執行計劃。


          開啟慢查詢日志,查看慢查詢的 SQL。


          178、如何做 MySQL 的性能優化?


          為搜索字段創建索引。


          避免使用 select *,列出需要查詢的字段。


          垂直分割分表。


          選擇正確的存儲引擎。



          十八、Java最新面試題及答案:Redis模塊


          179、Redis 是什么?都有哪些使用場景?


          Redis 是一個使用 C 語言開發的高速緩存數據庫。


          redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現了master-slave主從同步【主從同步:數據可以從主服務器向任意數量的從服務器上同步】。


          Redis 是一個高性能的key-value數據庫。redis的出現,很大程度補償了memcached這類key/value存儲的不足,在部 分場合可以對關系數據庫起到很好的補充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客戶端,使用很方便。


          Redis 使用場景:


          記錄帖子點贊數、點擊數、評論數;


          緩存近期熱帖;


          緩存文章詳情信息;


          記錄用戶會話信息。


          180、Redis 有哪些功能?


          數據緩存功能


          分布式鎖的功能


          支持數據持久化


          支持事務


          支持消息隊列


          181、Redis 和 memcache 有什么區別?


          存儲方式不同:memcache 把數據全部存在內存之中,斷電后會掛掉,數據不能超過內存大小;Redis 有部份存在硬盤上,這樣能保證數據的持久性。


          數據支持類型:memcache 對數據類型支持相對簡單;Redis 有復雜的數據類型。


          使用底層模型不同:它們之間底層實現方式,以及與客戶端之間通信的應用協議不一樣,Redis 自己構建了 vm 機制,因為一般的系統調用系統函數的話,會浪費一定的時間去移動和請求。


          value 值大小不同:Redis 最大可以達到 1gb;memcache 只有 1mb。


          182、Redis 為什么是單線程的?


          因為 cpu 不是 Redis 的瓶頸,Redis 的瓶頸最有可能是機器內存或者網絡帶寬。既然單線程容易實現,而且 cpu 又不會成為瓶頸,那就順理成章地采用單線程的方案了。


          關于 Redis 的性能,官方網站也有,普通筆記本輕松處理每秒幾十萬的請求。而且單線程并不代表就慢, nginx 和 node.js 也都是高性能單線程的代表。


          183、什么是緩存穿透?怎么解決?


          緩存穿透:指查詢一個一定不存在的數據,由于緩存是不命中時需要從數據庫查詢,查不到數據則不寫入緩存,這將導致這個不存在的數據每次請求都要到數據庫去查詢,造成緩存穿透。


          解決方案:最簡單粗暴的方法如果一個查詢返回的數據為空(不管是數據不存在,還是系統故障),我們就把這個空結果進行緩存,但它的過期時間會很短,最長不超過五分鐘。


          184、Redis 支持的數據類型有哪些?


          Redis 支持的數據類型:string(字符串)、list(列表)、hash(字典)、set(集合)、zset(有序集合)。


          185、Redis 支持的 Java 客戶端都有哪些?


          支持的 Java 客戶端有 Redisson、jedis、lettuce 等。


          186、jedis 和 Redisson 有哪些區別?


          jedis:提供了比較全面的 Redis 命令的支持。


          Redisson:實現了分布式和可擴展的 Java 數據結構,與 jedis 相比 Redisson 的功能相對簡單,不支持排序、事務、管道、分區等 Redis 特性。


          187、怎么保證緩存和數據庫數據的一致性?


          合理設置緩存的過期時間。


          新增、更改、刪除數據庫操作時同步更新 Redis,可以使用事物機制來保證數據的一致性。


          188、Redis 持久化有幾種方式?


          Redis 的持久化有兩種方式,或者說有兩種策略:


          RDB(Redis Database):指定的時間間隔能對你的數據進行快照存儲。


          AOF(Append Only File):每一個收到的寫命令都通過write函數追加到文件中。


          189、Redis 怎么實現分布式鎖?


          Redis 分布式鎖其實就是在系統里面占一個“坑”,其他程序也要占“坑”的時候,占用成功了就可以繼續執行,失敗了就只能放棄或稍后重試。


          占坑一般使用 setnx(set if not exists)指令,只允許被一個程序占有,使用完調用 del 釋放鎖。


          190、Redis 分布式鎖有什么缺陷?


          Redis 分布式鎖不能解決超時的問題,分布式鎖有一個超時時間,程序的執行如果超出了鎖的超時時間就會出現問題。


          191、Redis 如何做內存優化?


          盡量使用 Redis 的散列表,把相關的信息放到散列表里面存儲,而不是把每個字段單獨存儲,這樣可以有效的減少內存使用。比如將 Web 系統的用戶對象,應該放到散列表里面再整體存儲到 Redis,而不是把用戶的姓名、年齡、密碼、郵箱等字段分別設置 key 進行存儲。


          192、Redis 淘汰策略有哪些?


          volatile-lru:從已設置過期時間的數據集(server. db[i]. expires)中挑選最近最少使用的數據淘汰。


          volatile-ttl:從已設置過期時間的數據集(server. db[i]. expires)中挑選將要過期的數據淘汰。


          volatile-random:從已設置過期時間的數據集(server. db[i]. expires)中任意選擇數據淘汰。


          allkeys-lru:從數據集(server. db[i]. dict)中挑選最近最少使用的數據淘汰。


          allkeys-random:從數據集(server. db[i]. dict)中任意選擇數據淘汰。


          no-enviction(驅逐):禁止驅逐數據。


          193、Redis 常見的性能問題有哪些?該如何解決?


          主服務器寫內存快照,會阻塞主線程的工作,當快照比較大時對性能影響是非常大的,會間斷性暫停服務,所以主服務器最好不要寫內存快照。


          Redis 主從復制的性能問題,為了主從復制的速度和連接的穩定性,主從庫最好在同一個局域網內。



          十九、 Java最新面試題及答案:JVM模塊


          194、說一下 JVM 的主要組成部分?及其作用?


          類加載器(ClassLoader)


          運行時數據區(Runtime Data Area)


          執行引擎(Execution Engine)


          本地庫接口(Native Interface)


          組件的作用:首先通過類加載器(ClassLoader)會把 Java 代碼轉換成字節碼,運行時數據區(Runtime Data Area)再把字節碼加載到內存中,而字節碼文件只是 JVM 的一套指令集規范,并不能直接交個底層操作系統去執行,因此需要特定的命令解析器執行引擎(Execution Engine),將字節碼翻譯成底層系統指令,再交由 CPU 去執行,而這個過程中需要調用其他語言的本地庫接口(Native Interface)來實現整個程序的功能。


          195、說一下 JVM 運行時數據區?


          不同虛擬機的運行時數據區可能略微有所不同,但都會遵從 Java 虛擬機規范, Java 虛擬機規范規定的區域分為以下 5 個部分:


          程序計數器(Program Counter Register):當前線程所執行的字節碼的行號指示器,字節碼解析器的工作是通過改變這個計數器的值,來選取下一條需要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等基礎功能,都需要依賴這個計數器來完成;


          Java 虛擬機棧(Java Virtual Machine Stacks):用于存儲局部變量表、操作數棧、動態鏈接、方法出口等信息;


          本地方法棧(Native Method Stack):與虛擬機棧的作用是一樣的,只不過虛擬機棧是服務 Java 方法的,而本地方法棧是為虛擬機調用 Native 方法服務的;


          Java 堆(Java Heap):Java 虛擬機中內存最大的一塊,是被所有線程共享的,幾乎所有的對象實例都在這里分配內存;


          方法區(Methed Area):用于存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯后的代碼等數據。


          196、說一下堆棧的區別?


          功能方面:堆是用來存放對象的,棧是用來執行程序的。


          共享性:堆是線程共享的,棧是線程私有的。


          空間大小:堆大小遠遠大于棧。


          197、隊列和棧是什么?有什么區別?


          隊列和棧都是被用來預存儲數據的。


          隊列允許先進先出檢索元素,但也有例外的情況,Deque 接口允許從兩端檢索元素。


          棧和隊列很相似,但它運行對元素進行后進先出進行檢索。


          198、什么是雙親委派模型?


          在介紹雙親委派模型之前先說下類加載器。對于任意一個類,都需要由加載它的類加載器和這個類本身統一確立在 JVM 中的唯一性,每一個類加載器,都有一個獨立的類名稱空間。類加載器就是根據指定全限定名稱將 class 文件加載到 JVM 內存,然后再轉化為 class 對象。


          類加載器分類:


          啟動類加載器(Bootstrap ClassLoader),是虛擬機自身的一部分,用來加載Java_HOME/lib/目錄中的,或者被 -Xbootclasspath 參數所指定的路徑中并且被虛擬機識別的類庫;


          其他類加載器:


          擴展類加載器(Extension ClassLoader):負責加載\lib\ext目錄或Java. ext. dirs系統變量指定的路徑中的所有類庫;


          應用程序類加載器(Application ClassLoader)。負責加載用戶類路徑(classpath)上的指定類庫,我們可以直接使用這個類加載器。一般情況,如果我們沒有自定義類加載器默認就是用這個加載器。


          雙親委派模型:如果一個類加載器收到了類加載的請求,它首先不會自己去加載這個類,而是把這個請求委派給父類加載器去完成,每一層的類加載器都是如此,這樣所有的加載請求都會被傳送到頂層的啟動類加載器中,只有當父加載無法完成加載請求(它的搜索范圍中沒找到所需的類)時,子加載器才會嘗試去加載類。


          199、說一下類裝載的執行過程?


          類裝載分為以下 5 個步驟:


          加載:根據查找路徑找到相應的 class 文件然后導入;


          檢查:檢查加載的 class 文件的正確性;


          準備:給類中的靜態變量分配內存空間;


          解析:虛擬機將常量池中的符號引用替換成直接引用的過程。符號引用就理解為一個標示,而在直接引用直接指向內存中的地址;


          初始化:對靜態變量和靜態代碼塊執行初始化工作。


          200、怎么判斷對象是否可以被回收?


          一般有兩種方法來判斷:


          引用計數器:為每個對象創建一個引用計數,有對象引用時計數器 +1,引用被釋放時計數 -1,當計數器為 0 時就可以被回收。它有一個缺點不能解決循環引用的問題;


          可達性分析:從 GC Roots 開始向下搜索,搜索所走過的路徑稱為引用鏈。當一個對象到 GC Roots 沒有任何引用鏈相連時,則證明此對象是可以被回收的。


          201、Java 中都有哪些引用類型?


          強引用:發生 gc 的時候不會被回收。


          軟引用:有用但不是必須的對象,在發生內存溢出之前會被回收。


          弱引用:有用但不是必須的對象,在下一次GC時會被回收。


          虛引用(幽靈引用/幻影引用):無法通過虛引用獲得對象,用 PhantomReference 現虛引用,虛引用的用途是在 gc 時返回一個通知。


          202、說一下 JVM 有哪些垃圾回收算法?


          標記-清除算法:標記無用對象,然后進行清除回收。缺點:效率不高,無法清除垃圾碎片。


          標記-整理算法:標記無用對象,讓所有存活的對象都向一端移動,然后直接清除掉端邊界以外的內存。


          復制算法:按照容量劃分二個大小相等的內存區域,當一塊用完的時候將活著的對象復制到另一塊上,然后再把已使用的內存空間一次清理掉。缺點:內存使用率不高,只有原來的一半。


          分代算法:根據對象存活周期的不同將內存劃分為幾塊,一般是新生代和老年代,新生代基本采用復制算法,老年代采用標記整理算法。


          203、說一下 JVM 有哪些垃圾回收器?


          Serial:最早的單線程串行垃圾回收器。


          Serial Old:Serial 垃圾回收器的老年版本,同樣也是單線程的,可以作為 CMS 垃圾回收器的備選預案。


          ParNew:是 Serial 的多線程版本。


          Parallel 和 ParNew 收集器類似是多線程的,但 Parallel 是吞吐量優先的收集器,可以犧牲等待時間換取系統的吞吐量。


          Parallel Old 是 Parallel 老生代版本,Parallel 使用的是復制的內存回收算法,Parallel Old 使用的是標記-整理的內存回收算法。


          CMS:一種以獲得最短停頓時間為目標的收集器,非常適用 B/S 系統。


          G1:一種兼顧吞吐量和停頓時間的 GC 實現,是 JDK 9 以后的默認 GC 選項。


          204、詳細介紹一下 CMS 垃圾回收器?


          CMS 是英文 Concurrent Mark-Sweep 的簡稱,是以犧牲吞吐量為代價來獲得最短回收停頓時間的垃圾回收器。對于要求服務器響應速度的應用上,這種垃圾回收器非常適合。在啟動 JVM 的參數加上“-XX:+UseConcMarkSweepGC”來指定使用 CMS 垃圾回收器。


          CMS 使用的是標記-清除的算法實現的,所以在 gc 的時候回產生大量的內存碎片,當剩余內存不能滿足程序運行要求時,系統將會出現 Concurrent Mode Failure,臨時 CMS 會采用 Serial Old 回收器進行垃圾清除,此時的性能將會被降低。


          205、新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么區別?


          新生代回收器:Serial、ParNew、Parallel Scavenge


          老年代回收器:Serial Old、Parallel Old、CMS


          整堆回收器:G1


          新生代垃圾回收器一般采用的是復制算法,復制算法的優點是效率高,缺點是內存利用率低;老年代回收器一般采用的是標記-整理的算法進行垃圾回收。


          206、簡述分代垃圾回收器是怎么工作的?


          分代回收器有兩個分區:老生代和新生代,新生代默認的空間占比總空間的 1/3,老生代的默認占比是 2/3。


          新生代使用的是復制算法,新生代里有 3 個分區:Eden、To Survivor、From Survivor,它們的默認占比是 8:1:1,它的執行流程如下:


          把 Eden + From Survivor 存活的對象放入 To Survivor 區;


          清空 Eden 和 From Survivor 分區;


          From Survivor 和 To Survivor 分區交換,From Survivor 變 To Survivor,To Survivor 變 From Survivor。


          每次在 From Survivor 到 To Survivor 移動時都存活的對象,年齡就 +1,當年齡到達 15(默認配置是 15)時,升級為老生代。大對象也會直接進入老生代。


          老生代當空間占用到達某個值之后就會觸發全局垃圾收回,一般使用標記整理的執行算法。以上這些循環往復就構成了整個分代垃圾回收的整體執行流程。


          207、說一下 JVM 調優的工具?


          JDK 自帶了很多監控工具,都位于 JDK 的 bin 目錄下,其中最常用的是 jconsole 和 jvisualvm 這兩款視圖監控工具。


          jconsole:用于對 JVM 中的內存、線程和類等進行監控;


          jvisualvm:JDK 自帶的全能分析工具,可以分析:內存快照、線程快照、程序死鎖、監控內存的變化、gc 變化等。


          208、常用的 JVM 調優的參數都有哪些?


          -Xms2g:初始化推大小為 2g;


          -Xmx2g:堆最大內存為 2g;


          -XX:NewRatio=4:設置年輕的和老年代的內存比例為 1:4;


          -XX:SurvivorRatio=8:設置新生代 Eden 和 Survivor 比例為 8:2;


          –XX:+UseParNewGC:指定使用 ParNew + Serial Old 垃圾回收器組合;


          -XX:+UseParallelOldGC:指定使用 ParNew + ParNew Old 垃圾回收器組合;


          -XX:+UseConcMarkSweepGC:指定使用 CMS + Serial Old 垃圾回收器組合;


          -XX:+PrintGC:開啟打印 gc 信息;


          -XX:+PrintGCDetails:打印 gc 詳細信息。


        由于“最常見的208道Java最新面試題及答案”內容太多,本文已滿,請看下文鏈接:


        1~30道Java最新面試題及答案請看鏈接:http://www.dabaquan.cn/javazixun/2143.html


        31~73道Java最新面試題及答案請看鏈接:http://www.dabaquan.cn/javazixun/2145.html


        74~124道Java最新面試題及答案請看鏈接:http://www.dabaquan.cn/javazixun/2146.html


        125~170道Java最新面試題及答案請看鏈接:http://www.dabaquan.cn/javazixun/2148.html


        相關Java面試題推薦


        java基礎面試題及答案


        2019最新java面試題含答案(基礎篇)


        2019年常見Java面試題及答案


        Java常見面試題匯總


        2019史上最全java面試題題庫大全800題


        2019年最新Java基礎面試題及面試技巧



        提交申請后,顧問老師會電話與您溝通安排學習

        免費課程推薦 >>
        技術文檔推薦 >>
        主站蜘蛛池模板: 日韩一级不卡 | 国产一区在线播放 | 国产欧美一区二区三区久久 | 久久国产精品久久国产片 | 久久伊人一区二区三区四区 | 男女很黄很色床视频网站免 | 婷婷色六月 | 国产伦精品一区二区三区免 | 狠狠色噜噜狠狠狠狠米奇777 | 99在线视频免费观看 | 免费观看日本a毛片 | 韩国爱情片免费大全 | 精品哟啊呦v视频在线观看 精品哟哟国产在线观看 | 精品综合一区二区三区 | 亚洲精品一区二区乱码在线观看 | 97黄网| 欧美成人精品 | 欧美成人视 | 亚洲图片综合网 | 成人黄色免费 | 五月婷婷亚洲 | 99久久香蕉国产综合影院 | 亚洲精品欧洲精品 | 中文字幕在线观看不卡 | 99久久精品在免费线18 | 黄色伊人 | 午夜精品国产 | 成人三级做爰在线观看男女 | 欧美专区一区二区三区 | 99热8| 看全色黄大色黄大片 视 | 国产精品久久久久久久久久免费 | 国语高清精品一区二区三区 | 中文成人在线 | 久久久精品久久视频只有精品 | 狠狠色噜噜狠狠色综合久 | 九色官网| 亚洲国产精品自产在线播放 | 国产伦码精品一区二区三区 | 久久精品女人毛片国产 | 大狠狠大臿蕉香蕉大视频 |