亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

首頁 Java Java面試題 順豐科技面試

順豐科技面試

Aug 15, 2023 pm 03:52 PM
面試題

本來約的三點(diǎn)的面試,但是面試官提前上線看到我在線就說提前開始吧。

先看問題

  1. 自我介紹
  2. 說一個(gè)你認(rèn)為有挑戰(zhàn)的項(xiàng)目
  3. 怎么學(xué)習(xí)Java的
  4. 說一下抽象類和接口
  5. 說一下HashMap和Hashtable
  6. HashMap添加一個(gè)元素的流程
  7. 什么是紅黑樹,特點(diǎn)是什么 ? ?
  8. B+樹的特點(diǎn),有幾層,最大可以存放多少條數(shù)據(jù)
  9. MySQL的索引為什么使用B+樹而不使用跳表?MySQL的索引為什么使用B+樹而不使用跳表?
  10. Redis
  11. Redis為什么使用跳表而不使用B+樹或二叉樹呢?
  12. 創(chuàng)建索引需要注意些什么?
  13. 如果單表數(shù)據(jù)量過千萬,怎么優(yōu)化?
  14. 一個(gè)500w條數(shù)據(jù)的表 a,一個(gè)300w數(shù)據(jù)的表 b,通過外鍵 tid 關(guān)聯(lián),如何最快的查詢出滿足條件的第50000到第50200中的這200條數(shù)據(jù)記錄?
  15. 說說JVM的內(nèi)存模型
  16. 為什么需要Survivor區(qū)?
你有什么想問我的嗎?

試題解析

自我介紹

????菜鳥的回答:??

面試官你好,我叫張三,河南人,畢業(yè)于XX大學(xué),從XX年畢業(yè)后就一直從事java開發(fā),差不多 3年了吧。來貴公司面試,尋求一份java開發(fā)工作。

自我介紹要說幾個(gè)點(diǎn):你是誰,你的優(yōu)點(diǎn)是什么?這么多年你干了啥?在學(xué)校獲得過什么獎(jiǎng)?對(duì)哪些技術(shù)有深入研究?是否有高并發(fā)系統(tǒng)的設(shè)計(jì)?是否參與過什么大型項(xiàng)目?

總之,把你有的家底都亮出來,讓人家知道你哪方面相對(duì)比較強(qiáng)。

說一個(gè)你認(rèn)為有挑戰(zhàn)的項(xiàng)目

這個(gè)問題其實(shí)是因人而異的,對(duì)于剛?cè)腴T的朋友,叫他搭建個(gè)項(xiàng)目就覺得很有挑戰(zhàn)性。

而對(duì)于大牛來說,“挑戰(zhàn)性”已經(jīng)不在是技術(shù)。更多的是何如包裝項(xiàng)目哄好老板,如何壓榨自己的下屬才是項(xiàng)目有挑戰(zhàn)性的點(diǎn)。

而在面試環(huán)節(jié),有“挑戰(zhàn)性”是對(duì)于面試官而言的一個(gè)標(biāo)準(zhǔn)。如果這個(gè)項(xiàng)目業(yè)務(wù)這個(gè)技術(shù)點(diǎn)面試官?zèng)]接觸過,聽起來很難,那這個(gè)就是一個(gè)“有挑戰(zhàn)”的項(xiàng)目。

如果面試官對(duì)你所說的挑戰(zhàn)項(xiàng)目很熟悉,此時(shí)可能對(duì)你來說是個(gè)機(jī)會(huì)也是個(gè)挑戰(zhàn),回答出面試官?zèng)]遇到的問題,已經(jīng)如何解決的,那面試官妥妥的佩服你,反之,面試官知道的這個(gè)項(xiàng)目的問題,問你你答不上來,那就回面試大打折扣了。

比如說:五六年前,你的技術(shù)棧中有dubbo、Spring Boot 那是很吃香的,但是現(xiàn)在已經(jīng)是標(biāo)配了。

但是有大數(shù)據(jù)、高并發(fā)、架構(gòu)改造經(jīng)驗(yàn)的開發(fā)者還是少,因?yàn)榻^大部分公司都沒法發(fā)展成為大公司。但。這個(gè)也是隨著軟件工程怎么發(fā)展都無法改變的事。

所以對(duì)于有挑戰(zhàn)的項(xiàng)目具有以下幾個(gè)特點(diǎn):

1、大數(shù)據(jù)量

2、高并發(fā)

3、架構(gòu)改造

只要你的項(xiàng)目能和這幾個(gè)東西沾一點(diǎn)邊,那你的項(xiàng)目level就高至少一級(jí)。

這里,我給你一個(gè)回答的模板:

1、我負(fù)責(zé)的是這個(gè)xxx業(yè)務(wù)項(xiàng)目,這個(gè)業(yè)務(wù)的是用來xxx的。

2、前期為了快速試錯(cuò),快速響應(yīng)市場(chǎng),前期使用了簡(jiǎn)單的xxxx方案。

3、隨著業(yè)務(wù)的發(fā)展,這個(gè)方案在xxx方面出現(xiàn)xxx的技術(shù)問題。

4、為了解決這些技術(shù)難點(diǎn),最終用了xxx方案,然后介紹這些方案,同時(shí)這些方案是怎么解決這些技術(shù)問題的。

平時(shí)都是怎么學(xué)習(xí)Java的

就如實(shí)的說自己的學(xué)習(xí)歷程,但要注意,學(xué)習(xí)要體現(xiàn)出自己是主動(dòng)的,另外,標(biāo)注自己有個(gè)好習(xí)慣:記筆記,好幾下不如爛筆頭。

推薦看官網(wǎng),看書,看視頻。

學(xué)習(xí)過程中,不斷實(shí)踐,不斷反思,不斷總結(jié)。

說一下抽象類和接口

  • 抽象類要被子類繼承,接口要被子類實(shí)現(xiàn)。
  • 抽象類可以有構(gòu)造方法,接口中不能有構(gòu)造方法。
  • 抽象類中可以有普通成員變量,接口中沒有普通成員變量,它的變量只能是公共的靜態(tài)的常量
  • 一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,但是只能繼承一個(gè)父類,這個(gè)父類可以是抽象類。
  • 抽象類中可以作方法聲明,也可以做方法實(shí)現(xiàn)。接口中可以做方法聲明,也可以定義default方法。
  • 抽象級(jí)別(從高到低):接口>抽象類>實(shí)現(xiàn)類
  • 抽象類主要是用來抽象類別,接口主要是用來抽象方法功能。
  • 抽象類的關(guān)鍵字是abstract,接口的關(guān)鍵字是interface

說一下HashMap和Hashtable

我們可以從五個(gè)方面來回答:

  1. 線程是否安全:HashMap 是非線程安全的, HashTable 是線程安全的。因?yàn)?HashTable 內(nèi)部的方法基本都經(jīng)過 synchronized 修飾。(如果你要保證線程安全的話就使用 ConcurrentHashMap);

  2. 效率:因?yàn)榫€程安全的問題, HashMap 要比 HashTable 效率高一點(diǎn)。另外, HashTable基本被淘汰,不要在代碼中使用它;

  3. 對(duì) Null key 和 Null value 的支持:HashMap 可以存儲(chǔ) null 的 key 和 value,但 null 作為鍵只能有一個(gè),null 作為值可以有多個(gè);HashTable 不允許有 null 鍵和 null 值,否則會(huì)拋出NullPointerException 。

  4. 初始容量帶下和每次擴(kuò)充容量大小的不同 :

    ① 創(chuàng)建時(shí)如果不指定容量初始值, Hashtable默認(rèn)的初始大小為 11,之后每次擴(kuò)充,容量變?yōu)樵瓉淼?2n+1。HashMap 默認(rèn)的初始化大小為 16。之后每次擴(kuò)充,容量變?yōu)樵瓉淼?2 倍。

    ② 創(chuàng)建時(shí)如果給定了容量初始值,那么Hashtable 會(huì)直接使用你給定的大小,而 HashMap 會(huì)將其擴(kuò)充為 2 的冪次方大小( HashMap 中的tableSizeFor()方法保證)。tableSizeFor()方法保證)。

  5. 底層數(shù)據(jù)結(jié)構(gòu):JDK1.8 以后的 HashMap 在解決哈希沖突時(shí)有了較大的變化,當(dāng)鏈表長(zhǎng)度大于閾值(默認(rèn)為 8)(將鏈表轉(zhuǎn)換成紅黑樹前會(huì)判斷,如果當(dāng)前數(shù)組的長(zhǎng)度度大于 64,那么會(huì)選擇先進(jìn)行數(shù)組擴(kuò)容,而不是轉(zhuǎn)換為紅黑樹)時(shí),將鏈表轉(zhuǎn)化為紅黑樹,以減少搜索時(shí)間。Hashtable 沒有這樣的機(jī)制。

盡管是普通不能再普通的面試題了,可面試中,照樣很大部分人同學(xué)回答的不好?;卮鹬刑岬搅?的n次冪,面試官很有可能會(huì)繼續(xù)追問相關(guān)的問題,如果還不清楚的,建議對(duì)HashMap進(jìn)行系統(tǒng)的學(xué)習(xí)。

我的博客上之前發(fā)過兩篇文章:

HashMap添加一個(gè)元素的流程

HashMap

  • 底層數(shù)據(jù)結(jié)構(gòu):JDK1.8 以后的 HashMap 在解決哈希沖突時(shí)有了較大的變化,當(dāng)鏈表長(zhǎng)度大于閾值(默認(rèn)為 8)(將鏈表轉(zhuǎn)換成紅黑樹前會(huì)判斷,如果當(dāng)前數(shù)組的長(zhǎng)度度大于 64,那么會(huì)選擇先進(jìn)行數(shù)組擴(kuò)容,而不是轉(zhuǎn)換為紅黑樹)時(shí),將鏈表轉(zhuǎn)化為紅黑樹,以減少搜索時(shí)間。Hashtable 沒有這樣的機(jī)制。??
  • 盡管是普通不能再普通的面試題了,可面試中,照樣很大部分人同學(xué)回答的不好。回答中提到了2的n次冪,面試官很有可能會(huì)繼續(xù)追問相關(guān)的問題,如果還不清楚的,建議對(duì)HashMap進(jìn)行系統(tǒng)的學(xué)習(xí)。??

    我的博客上之前發(fā)過兩篇文章:??

    HashMap添加一個(gè)元素的流程

    HashMap在put添加元素過程可以分為下面9個(gè)步驟:??

    • 1.使用put()方法時(shí),直接調(diào)putVal()方法
    • 2.在put的時(shí)候先判斷數(shù)組是否為空,如果為空則進(jìn)行resize操作
    • 3.以hash索引數(shù)組的長(zhǎng)度-1與key的hash值進(jìn)行與運(yùn)算,得出在數(shù)組中的索引,如果索引指定的位置為空,則代表可以插入,直接插入一個(gè)新的node
    • 4.判斷當(dāng)前的key是否存在,如果存在則進(jìn)行替換,如果替換成功則返回老的值
    • 5.如果key不存在,則判斷當(dāng)前節(jié)點(diǎn)是否為樹類型,如果是樹類型的話,則按照樹的操作去追加新節(jié)點(diǎn)內(nèi)容
    • 6.如果出現(xiàn)hash沖突的節(jié)點(diǎn)不是樹類型,則說明當(dāng)前發(fā)生的碰撞在鏈表里面,則這個(gè)時(shí)候就進(jìn)入循環(huán)處理邏輯
    • 7.進(jìn)入循環(huán)邏輯之后先判斷被碰撞節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)是否為空,如果為空就將新節(jié)點(diǎn)放入
    • 8.放入后判斷當(dāng)前鏈表是否超過最大允許鏈表長(zhǎng)度8,如果超過則轉(zhuǎn)為紅黑樹進(jìn)行插入
    • 9.如果map的索引表為空或者當(dāng)前索引表長(zhǎng)度還小于64(最大轉(zhuǎn)紅黑樹的索引數(shù)組表長(zhǎng)度),那么進(jìn)行resize操作就行了;否則,如果被碰撞節(jié)點(diǎn)不為空,那么就順著被碰撞節(jié)點(diǎn)這條樹往后新增該節(jié)點(diǎn)插入

    可以看看我博客上的博文:三年必備HashMap源碼:http://www.woaijava.cc/blog/211

    什么是紅黑樹,特點(diǎn)是什么?

    紅黑樹(Red Black Tree)是一種特化的AVL樹(平衡二叉樹),都是在進(jìn)行插入和刪除操作時(shí)通過特定操作保持二叉查找樹的平衡,從而獲得較高的查找性能。

    紅黑樹的特點(diǎn)有5個(gè):

    • 結(jié)點(diǎn)是紅色或黑色。

    • 根結(jié)點(diǎn)是黑色。

    • 所有葉子都是黑色(葉子是NIL結(jié)點(diǎn))

    • 每個(gè)紅色結(jié)點(diǎn)的兩個(gè)子結(jié)點(diǎn)都是黑色。(從每個(gè)葉子到根的所有路徑上不能有兩個(gè)連續(xù)的紅色結(jié)點(diǎn))

    • 從任一結(jié)點(diǎn)到其每個(gè)葉子的所有路徑都包含相同數(shù)目的黑色結(jié)點(diǎn)。

    其實(shí)這個(gè)問題不難,難得是可能有的面試官會(huì)問紅黑樹的操作,左旋轉(zhuǎn)右旋轉(zhuǎn)...,我面試過幾百人,能說出來寥寥無幾。

    B+樹的特點(diǎn),有幾層,最大可以存放多少條數(shù)據(jù)

    B+樹的特點(diǎn)有兩個(gè):

    • 1.非葉子節(jié)點(diǎn)]僅具有索引作用,也就是說,非葉子節(jié)點(diǎn)只能存儲(chǔ)Key,不能存儲(chǔ)value
    • 2.樹的所有葉節(jié)點(diǎn)構(gòu)成一個(gè)有序鏈表,可以按照key排序的次序依次遍歷全部數(shù)據(jù)。

    B+樹一般是1道3層。

    InnoDB頁的大小默認(rèn)是16KB

    • 假設(shè)一條記錄大小為1KB,則一個(gè)數(shù)據(jù)頁中可以存16條數(shù)據(jù)(忽略頁中的其他數(shù)據(jù)結(jié)構(gòu))
    • 假設(shè)主鍵為int,又指針大小為6B,則一個(gè)索引頁中可以存儲(chǔ)16KB/(4B+6B)≈1638個(gè)索引16KB/(4B+6B)≈1638個(gè)索引

    所以,兩層的B+樹可以存儲(chǔ):16*1638=26208條數(shù)據(jù);三層的B+樹可以存儲(chǔ):16*1638*1638=42928704條數(shù)據(jù)。

    MySQL的索引為什么使用B+樹而不使用跳表?

    B+樹是多叉樹結(jié)構(gòu),每個(gè)結(jié)點(diǎn)都是一個(gè)16k的數(shù)據(jù)頁,能存放較多索引信息,所以扇出很高三層左右就可以存儲(chǔ)2kw

    所以,兩層的B+樹可以存儲(chǔ):16*1638=26208條數(shù)據(jù);三層的B+樹可以存儲(chǔ):16*1638*1638=42928704條數(shù)據(jù)。????????MySQL的索引為什么使用B+樹而不使用跳表???????????B+樹??是多叉樹結(jié)構(gòu),每個(gè)結(jié)點(diǎn)都是一個(gè)16k的數(shù)據(jù)頁,能存放較多索引信息,所以??扇出很高??。??三層??左右就可以存儲(chǔ)2kw左右的數(shù)據(jù)。也就是說查詢一次數(shù)據(jù),如果這些數(shù)據(jù)頁都在磁盤里,那么最多需要查詢??三次磁盤IO??。??

    跳表是鏈表結(jié)構(gòu),一條數(shù)據(jù)一個(gè)結(jié)點(diǎn),如果最底層要存放2kw數(shù)據(jù),且每次查詢都要能達(dá)到2kw數(shù)據(jù),且每次查詢都要能達(dá)到二分查找的效果,2kw大概在2的24次方左右,所以,跳表大概高度在24層左右。最壞情況下,這24層數(shù)據(jù)會(huì)分散在不同的數(shù)據(jù)頁里,也即是查一次數(shù)據(jù)會(huì)經(jīng)歷24次磁盤IO。

    因此存放同樣量級(jí)的數(shù)據(jù),B+樹的高度比跳表的要少,如果放在MySQL數(shù)據(jù)庫上來說,就是磁盤IO次數(shù)更少,因此B+樹查詢更快

    而針對(duì)寫操作,B+樹需要拆分合并索引數(shù)據(jù)頁,跳表則獨(dú)立插入,并根據(jù)隨機(jī)函數(shù)確定層數(shù),沒有旋轉(zhuǎn)和維持平衡的開銷,因此跳表的寫入性能會(huì)比B+樹要好。

    其實(shí),MySQL的存儲(chǔ)引擎是可以換的,以前mysql 5.5是myisam,后來才有的innodb,它們底層索引用的都是B+樹。也就是說,你完全可以造一個(gè)索引為跳表的存儲(chǔ)引擎裝到MySQL里。事實(shí)上,facebook造了個(gè)rocksDB的存儲(chǔ)引擎,里面就用了跳表。直接說結(jié)論,它的寫入性能確實(shí)是比innodb要好,但讀性能確實(shí)比innodb要差不少。感興趣的話,可以在文章最后面的參考資料里看到他們的性能對(duì)比數(shù)據(jù)。

    Redis二分查找的效果,2kw大概在2的24次方左右,所以,跳表大概高度在24層

    左右。最壞情況下,這24層數(shù)據(jù)會(huì)分散在不同的數(shù)據(jù)頁里,也即是查一次數(shù)據(jù)會(huì)經(jīng)歷

    24次磁盤IO

    。????因此存放同樣量級(jí)的數(shù)據(jù),B+樹的高度比跳表的要少,如果放在MySQL數(shù)據(jù)庫上來說,就是??磁盤IO次數(shù)更少,因此B+樹查詢更快??。????而針對(duì)??寫操作??,B+樹需要拆分合并索引數(shù)據(jù)頁,跳表則獨(dú)立插入,并根據(jù)隨機(jī)函數(shù)確定層數(shù),沒有旋轉(zhuǎn)和維持平衡的開銷,因此??跳表的寫入性能會(huì)比B+樹要好。??????其實(shí),MySQL的??存儲(chǔ)引擎是可以換的??,以前mysql 5.5是myisam,后來才有的innodb,它們底層索引用的都是??B+樹??。也就是說,你完全可以造一個(gè)索引為跳表的存儲(chǔ)引擎裝到MySQL里。事實(shí)上,facebook造了個(gè)rocksDB的存儲(chǔ)引擎,里面就用了??跳表??。直接說結(jié)論,它的??寫入性能??確實(shí)是比innodb要好,但??讀性能??確實(shí)比innodb要差不少。感興趣的話,可以在文章最后面的??參考資料??里看到他們的性能對(duì)比數(shù)據(jù)。??

    ????Redis為什么使用跳表而不使用B+樹或二叉樹呢?????????因?yàn)锽+樹的原理是 葉子節(jié)點(diǎn)存儲(chǔ)數(shù)據(jù),非葉子節(jié)點(diǎn)存儲(chǔ)索引,B+樹的每個(gè)節(jié)點(diǎn)可以存儲(chǔ)多個(gè)關(guān)鍵字,它將節(jié)點(diǎn)大小設(shè)置為磁盤頁的大小,充分利用了磁盤預(yù)讀的功能。每次讀取磁盤頁時(shí)就會(huì)讀取一整個(gè)節(jié)點(diǎn),每個(gè)葉子節(jié)點(diǎn)還有指向前后節(jié)點(diǎn)的指針,為的是最大限度的降低磁盤的IO。因?yàn)閿?shù)據(jù)在內(nèi)存中讀取耗費(fèi)的時(shí)間是從磁盤的IO讀取的百萬分之一,而Redis是 內(nèi)存中操作數(shù)據(jù),不涉及IO,因此使用了跳表;??

    創(chuàng)建索引需要注意些什么?

    這道題,也可以用在問你會(huì)哪些SQL優(yōu)化的時(shí)候。

    • 最適合索引的列是出現(xiàn)在 WHERE 子句中的列,或連接子句中的列,而不是出現(xiàn)在 SELECT 關(guān)鍵字后的列。
    • 索引列的基數(shù)越大,索引效果越好。
    • 根據(jù)情況創(chuàng)建復(fù)合索引,復(fù)合索引可以提高查詢效率。
    • 避免創(chuàng)建過多的索引,索引會(huì)額外占用磁盤空間,降低寫操作效率。
    • 主鍵盡可能選擇較短的數(shù)據(jù)類型,可以有效減少索引的磁盤占用提高查詢效率。
    • 對(duì)字符串進(jìn)行索引,應(yīng)該定制一個(gè)前綴長(zhǎng)度,可以節(jié)省大量的索引空間。

    如果單表數(shù)據(jù)量過千萬,怎么優(yōu)化?

    1、數(shù)據(jù)庫設(shè)計(jì)和表創(chuàng)建時(shí),考慮性能問題,比如:?jiǎn)伪聿灰刑嘧侄?,建議在20以內(nèi)、索引并不是越多越好,要根據(jù)查詢有針對(duì)性的創(chuàng)建,考慮在WHERE和ORDER BY命令上涉及的列建立索引,可根據(jù)EXPLAIN來查看是否用了索引還是全表掃描、選擇合適的數(shù)據(jù)類型、選擇合適索引類型等。

    2、SQL編寫時(shí)需要注意,比如:列表數(shù)據(jù)不要拿全表,要使用LIMIT來分頁,每頁數(shù)量也不要太大、可通過開啟慢查詢?nèi)罩緛碚页鲚^慢的SQL、避免select *,將需要查找的字段列出來等。

    3,存儲(chǔ)引擎選擇,MyISAM適合SELECT密集型的表,而InnoDB適合INSERT和UPDATE密集型的表 。

    4、分庫分表,比如:分庫把一個(gè)數(shù)據(jù)庫分成多個(gè),建議做個(gè)讀寫分離就行了,真正的做分庫也會(huì)帶來大量的開發(fā)成本,得不償失!不推薦使用、分表就是把一張大表,按照如上過程都優(yōu)化了,還是查詢卡死,那就把這個(gè)表分成多張表,把一次查詢分成多次查詢,然后把結(jié)果組合返回給用戶。分表分為垂直拆分和水平拆分,通常以某個(gè)字段做拆分項(xiàng)。比如以id字段拆分為100張表:表名為 tableName_id%100。但:分表需要修改源程序代碼,會(huì)給開發(fā)帶來大量工作,極大的增加了開發(fā)成本,故:只適合在開發(fā)初期就考慮到了大量數(shù)據(jù)存在,做好了分表處理,不適合應(yīng)用上線了再做修改,成本太高等。

    5、硬件升級(jí),這辦法是最簡(jiǎn)單的,相對(duì)的成本也高,老板就不愿意了。

    6、數(shù)據(jù)庫升級(jí),比如:把MySQL數(shù)據(jù)庫換成大數(shù)據(jù)引擎處理數(shù)據(jù)、換成阿里云POLARDB,POLARDB 是阿里云自研的下一代關(guān)系型分布式云原生數(shù)據(jù)庫,100%兼容MySQL,存儲(chǔ)容量最高可達(dá) 100T,性能最高提升至 MySQL 的 6 倍。

    一個(gè)500w條數(shù)據(jù)的表 a,一個(gè)300w數(shù)據(jù)的表 b,通過外鍵 tid 關(guān)聯(lián),如何最快的查詢出滿足條件的第50000到第50200中的這200條數(shù)據(jù)記錄?

    方法一:如果 a 表 tid 是自增長(zhǎng),并且是連續(xù)的,b表的id為索引。SQL語句如下。

    select * from a,b where a.tid = b.id and a.tid>500000 limit 200;

    方法二:如果 a 表的 tid 不是連續(xù)的,那么就需要使用覆蓋索引,tid 要么是主鍵,要么是輔助索引,b 表 id 也需要有索引。SQL語句如下。

    select * from b, (select tid from a limit 50000,200) a where b.id = a.tid;

    說說JVM的內(nèi)存模型

    JVM內(nèi)存結(jié)構(gòu)有:程序計(jì)數(shù)器 、堆內(nèi)存 、 方法區(qū) 和 棧 (java虛擬機(jī)棧和本地方法棧)。

    程序計(jì)數(shù)器(Program Counter Register)是一塊較小的內(nèi)存空間,它的作用可以看做是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器。在虛擬機(jī)的概念模型里(僅是概念模型,各種虛擬機(jī)可能會(huì)通過一些更高效的方式去實(shí)現(xiàn)),字節(jié)碼解釋器工作時(shí)就是通過改變這個(gè)計(jì)數(shù)器的值來選取下一條需要執(zhí)行的字節(jié)碼指令,分支、循環(huán)、跳轉(zhuǎn)、異常處理、線程恢復(fù)等基礎(chǔ)功能都需要依賴這個(gè)計(jì)數(shù)器來完成。

    堆內(nèi)存是JVM中最大的一塊由年輕代和老年代組成,而年輕代內(nèi)存又被分成三部分, Eden空間 、 From Survivor空間 、 To Survivor空間 ,默認(rèn)情況下年輕代按照 8:1:1 的比例來分配;

    方法區(qū)存儲(chǔ)類信息、常量、靜態(tài)變量等數(shù)據(jù),是線程共享的區(qū)域,為與Java堆區(qū)分,方法區(qū)還有一個(gè)別名Non-Heap(非堆);棧又分為java虛擬機(jī)棧和本地方法棧主要用于方法的執(zhí)行。方法區(qū)可理解為一種規(guī)范,其實(shí)現(xiàn)比如永久代、元空間。

    Java虛擬機(jī)棧(Java Virtual Machine Stacks)也是線程私有的,它的生命周期與線程相同。虛擬機(jī)棧描述的是Java方法執(zhí)行的內(nèi)存模型:每個(gè)方法被執(zhí)行的時(shí)候都會(huì)同時(shí)創(chuàng)建一個(gè)棧幀(Stack Frame)用于存儲(chǔ)局部變量表、操作棧、動(dòng)態(tài)鏈接、方法出口等信息。每一個(gè)方法被調(diào)用直至執(zhí)行完成的過程,就對(duì)應(yīng)著一個(gè)棧幀在虛擬機(jī)棧中從入棧到出棧的過程。

    本地方法棧(Native Method Stacks)與虛擬機(jī)棧所發(fā)揮的作用是非常相似的,其區(qū)別不過是虛擬機(jī)棧為虛擬機(jī)執(zhí)行Java方法(也就是字節(jié)碼)服務(wù),而本地方法棧則是為虛擬機(jī)使用到的Native方法服務(wù)。虛擬機(jī)規(guī)范中對(duì)本地方法棧中的方法使用的語言、使用方式與數(shù)據(jù)結(jié)構(gòu)并沒有強(qiáng)制規(guī)定,因此具體的虛擬機(jī)可以自由實(shí)現(xiàn)它。

    為什么需要Survivor區(qū)?

    如果沒有Survivor,Eden區(qū)每進(jìn)行一次Minor GC ,并且沒有年齡限制的話, 存活的對(duì)象就會(huì)被送到老年代。這樣一來,老年代很快被填滿,觸發(fā)Major GC(因?yàn)镸ajor GC一般伴隨著Minor GC,也可以看做觸發(fā)了Full GC)。老年代的內(nèi)存空間遠(yuǎn)大于新生代,進(jìn)行一次Full GC消耗的時(shí)間比Minor GC長(zhǎng)得多。

    面試官可能會(huì)問:執(zhí)行時(shí)間長(zhǎng)有什么壞處?

    頻發(fā)的Full GC消耗的時(shí)間很長(zhǎng),會(huì)影響大型程序的執(zhí)行和響應(yīng)速度。

    假如增加老年代空間,更多存活對(duì)象才能填滿老年代。雖然降低Full GC頻率,但是隨著老年代空間加大,一旦發(fā)生Full GC,執(zhí)行所需要的時(shí)間更長(zhǎng)。

    假如減少老年代空間,雖然Full GC所需時(shí)間減少,但是老年代很快被存活對(duì)象填滿,Full GC頻率增加。

    所以Survivor的存在意義,就是減少被送到老年代的對(duì)象,進(jìn)而減少Full GC的發(fā)生,Survivor的預(yù)篩選保證,只有經(jīng)歷16 次Minor GC還能在新生代中存活的對(duì)象,才會(huì)被送到老年代。

    你有什么想問我的嗎?

    這問題有的面試官是禮貌性的問,也不是很注意你回答什么,因?yàn)榇藭r(shí)估計(jì)面試就是涼涼啦。

    但是,有反問的機(jī)會(huì),大部分還是覺得你不錯(cuò),被錄取的概率非常大,所以還是得慎重回答

    不管ta是怎么樣的心態(tài),咱們表現(xiàn)好自己就行。

    這個(gè)問題看上去可有可無,其實(shí)很關(guān)鍵,一般面試官不喜歡說“沒問題”的人,因?yàn)槠浜茏⒅貑T工的個(gè)性和創(chuàng)新能力。企業(yè)不喜歡求職者問個(gè)人福利之類的問題,如果有人這樣問:貴公司對(duì)新入公司的員工有沒有什么培訓(xùn)項(xiàng)目,我可以參加嗎?或者說貴公司的晉升機(jī)制是什么樣的?企業(yè)將很歡迎,因?yàn)轶w現(xiàn)出你對(duì)學(xué)習(xí)的熱情和對(duì)公司的忠誠(chéng)度以及你的上進(jìn)心。

    以上是順豐科技面試的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

    本站聲明
    本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

    熱AI工具

    Undress AI Tool

    Undress AI Tool

    免費(fèi)脫衣服圖片

    Undresser.AI Undress

    Undresser.AI Undress

    人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用于從照片中去除衣服的在線人工智能工具。

    Clothoff.io

    Clothoff.io

    AI脫衣機(jī)

    Video Face Swap

    Video Face Swap

    使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

    熱工具

    記事本++7.3.1

    記事本++7.3.1

    好用且免費(fèi)的代碼編輯器

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用

    禪工作室 13.0.1

    禪工作室 13.0.1

    功能強(qiáng)大的PHP集成開發(fā)環(huán)境

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網(wǎng)頁開發(fā)工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神級(jí)代碼編輯軟件(SublimeText3)

    熱門話題

    Laravel 教程
    1597
    29
    PHP教程
    1488
    72
    五個(gè)常見的Go語言面試題及解答 五個(gè)常見的Go語言面試題及解答 Jun 01, 2023 pm 08:10 PM

    作為近年來備受熱捧的一門編程語言,Go語言已經(jīng)成為眾多公司與企業(yè)的面試熱點(diǎn)。對(duì)于Go語言初學(xué)者而言,在面試過程中遇到相關(guān)問題時(shí),如何回答是一個(gè)值得探討的問題。下面列舉五個(gè)常見的Go語言面試題及解答,供初學(xué)者參考。請(qǐng)介紹一下Go語言的垃圾回收機(jī)制是如何工作的?Go語言的垃圾回收機(jī)制基于標(biāo)記-清除算法和三色標(biāo)記算法。當(dāng)Go程序中的內(nèi)存空間不夠用時(shí),Go垃圾回收器

    2023年前端React面試題大匯總(收藏) 2023年前端React面試題大匯總(收藏) Aug 04, 2020 pm 05:33 PM

    php中文網(wǎng)作為知名編程學(xué)習(xí)網(wǎng)站,為您整理了一些React面試題,幫助前端開發(fā)人員準(zhǔn)備和清除React面試障礙。

    2023年精選Web前端面試題大全及答案(收藏) 2023年精選Web前端面試題大全及答案(收藏) Apr 08, 2021 am 10:11 AM

    本篇文章給大家總結(jié)一些值得收藏的精選Web前端面試題(附答案)。有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)大家有所幫助。

    50個(gè)你必須掌握的Angular面試題(收藏) 50個(gè)你必須掌握的Angular面試題(收藏) Jul 23, 2021 am 10:12 AM

    本篇文章給大家分享50個(gè)必須掌握的Angular面試題,會(huì)從初學(xué)者-中級(jí)-高級(jí)三個(gè)部分來解析這50個(gè)面試題,帶大家吃透它們!

    2023年vue高頻面試題分享(附答案分析) 2023年vue高頻面試題分享(附答案分析) Aug 01, 2022 pm 08:08 PM

    本篇文章給大家總結(jié)一些值得收藏的2023年精選vue高頻面試題(附答案)。有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)大家有所幫助。

    面試官:你對(duì)高并發(fā)了解多少?我:emmm... 面試官:你對(duì)高并發(fā)了解多少?我:emmm... Jul 26, 2023 pm 04:07 PM

    高并發(fā),幾乎是每個(gè)程序員都想擁有的經(jīng)驗(yàn)。原因很簡(jiǎn)單:隨著流量變大,會(huì)遇到各種各樣的技術(shù)問題,比如接口響應(yīng)超時(shí)、CPU load升高、GC頻繁、死鎖、大數(shù)據(jù)量存儲(chǔ)等等,這些問題能推動(dòng)我們?cè)诩夹g(shù)深度上不斷精進(jìn)。

    分享2023年最新的28道PHP面試題(附答案) 分享2023年最新的28道PHP面試題(附答案) Mar 03, 2022 pm 01:20 PM

    本篇文章給大家整理分享28道PHP面試題(附答案分享),帶你梳理基礎(chǔ)知識(shí),有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)大家有所幫助。

    看看這些前端面試題,帶你搞定高頻知識(shí)點(diǎn)(四) 看看這些前端面試題,帶你搞定高頻知識(shí)點(diǎn)(四) Feb 20, 2023 pm 07:19 PM

    每天10道題,100天后,搞定所有前端面試的高頻知識(shí)點(diǎn),加油?。?!,在看文章的同時(shí),希望不要直接看答案,先思考一下自己會(huì)不會(huì),如果會(huì),自己的答案是什么?想過之后再與答案比對(duì),是不是會(huì)更好一點(diǎn),當(dāng)然如果你有比我更好的答案,歡迎評(píng)論區(qū)留言,一起探討技術(shù)之美。

    See all articles