下文鏈接比較多啊,都是我過整理的博客,不少答案都在博客裏有詳細說明,理解記憶是最紮實的記憶。並且個人答案不必定是最準確的,可是個人答案不會讓你失望,並且幾乎每一個答案都是問題的擴展答案。html
答:http://www.javashuo.com/article/p-kcjjmzmh-ba.html java
先通過類裝載子系統裝載,經由驗證,準備,解析,初始化四個過程。方法被調用,方法進棧,對象放在堆,棧內存的引用指向咱們的對象,方法逐行執行,由咱們的程序計數器來控制。元空間放置靜態方法,不佔用jvm內存,佔用的是實際內存空間。 面試
答:三種算法。http://www.javashuo.com/article/p-okvrsldl-by.html算法
複製算法,由一個內存塊複製到一個內存塊下,缺點是有一半的內存是留給複製用的,不用用於直接存儲apache
標記清理,掃逐個內存塊是否可被回收,能夠回收的就回收掉,缺點是會產生內存碎片服務器
標記整理,標記整理是是標記清除的升級版,優勢:解決內存碎片問題。缺點:整理階段,因爲移動了可用對象,須要去更新引用。併發
答:http://www.javashuo.com/article/p-okvrsldl-by.htmljvm
有五種垃圾回收器,分別是串行的Serial,並行的ParNew,高CPU的Parallel Scavenge,還有咱們的CMS和大內存的G1。函數
須要說的是CMS回收器的過程,初始標記(STW),併發標記,從新標記(STW,耗時70%),併發清理 ,併發重置。性能
G1回收器適合大內存的服務器,回收過程是,初始標記(STW),併發標記,最終標記(STW),篩選回收(STW)。
G1回收器的優勢是STW時間是能夠控制的。串行的Serial,自我以爲沒啥優勢,惟一的優勢就是清理的完全吧。並行的ParNew,開啓多個線程去回收,通常來講線程數和CPU的核數相等,但不建議用在老年代,在老年代兼容性差。高CPU的Parallel Scavenge可能會搶佔用戶線程的CPU。CMS回收器須要考慮到老年代擔保機制。
http://www.javashuo.com/article/p-nrinfuqy-dg.html
再就是G1三個GC都是什麼YoungGC優先判斷一下回收一次的工做效率,不值得不執行。MixedGC清理內存塊,複製算法,Full GC中止系統程序,而後採用單線程進行標記、清理和壓縮整理,好空閒出來一批Region來供下一次MixedGC使用
答案:http://www.javashuo.com/article/p-kcjjmzmh-ba.html
1.驗證:驗證咱們的編譯文件(字節碼文件)是否正確。
2.準備:給予類的靜態常量開闢堆空間。而且賦予默認值。對象也在這個時候放置在堆空間,而且給予空值。
3.解析:將符號引用替換爲直接引用,該階段會把一些靜態方法(符號引用,好比main()方法)替換爲指向數據所存內存的指針或句柄等(直接引用),這是所謂的靜態連接過程(類加載期間完成),動態連接是在程序運行期間完成的將符號引用替換爲直接引用。就像是咱們把main轉化爲001,將()轉化爲002,將這一系列的編碼存在堆上。
4.初始化,將第3步的靜態常量(或對象)賦值,執行靜態代碼塊。
5.簡述雙親委派
答:http://www.javashuo.com/article/p-kcjjmzmh-ba.html
這個簡單啦,別管幾層,下面給個人我一概無論,除非我是最頂層,上級交給個人,我看看我能夠作嗎?作不了我給我下級。
用技術一點的話就是類來了,交給咱們的自定義加載器,自定義加載器先不作處理,交給咱們的應用類加載器,應用類加載也先不處理,交給咱們的擴展類加載器,擴展類加載器也先不處理,交給咱們的啓動類加載器,啓動類加載器沒辦法了,先嚐試加載一下吧,加載不了,回退給擴展類加載器,擴展類加載器也嘗試一下加載吧,加載不了再交給咱們的應用類加載器,應用類加載器仍是處理不了只有回退給咱們的自定義加載器了。
自定咱們的類加載器,只要重寫com.sun.org.apache.bcel.internal.util包下的ClassLoader類的findClass方法,最後調用defineClass方法。就能夠實現咱們的自定義加載器。
答:http://www.javashuo.com/article/p-pvpovcun-eh.html
Eden區滿了後,不會當即作MinorGC,會判斷一下老年代的剩餘空間是否大於咱們要回收的對象,夠大就作MinorGC吧,若是老年代不夠大了,咱們會判斷時候配置了-XX:-HandlePromotionFailure (jdk8以上默認設置),沒配置,直接FullGC,若是配置了就去判斷老年代的剩餘空間是否小於咱們每次minorGC後每次要放在老年代對象大小的平均值,若是老年代小於minorGC了,那麼進行fullGC。
7.Java對象建立過程
答:爲對象分配存儲空間。開始構造對象。遞歸調用其超類的構造方法。進行對象實例初始化與變量初始化。執行構造方法體。使用完畢,計算GCRoot根,也就是對象不可達分析,進行垃圾回收,觸發finalize方法,方法運行結束,稍後進行垃圾回收。
8.類的生命週期
答:類的完整生命週期包括7個部分:加載——驗證——準備——解析——初始化——使用——卸載
9.如何判斷對象能夠被回收?
答:1,引用計數法(基本不用,循環引用對象永遠沒法銷燬,可能內存溢出)
2,可達性分析算法。GCRoots根節點通常爲線程棧的本地變量、靜態變量、本地方法棧的變量等等。
3,常見的引用類型(強軟弱虛)。
4,finalize最終判斷對象存活。
如何判斷一個類是無用的類
答:永生代也是能夠回收的,條件是
1.該類的實例都被回收。
2.加載該類的classLoader已經被回收
3.該類不能經過反射訪問到其方法,並且該類的java.lang.class沒有被引用 當知足這3個條件時,是能夠回收,但回不回收還得看jvm有沒有「時間」。
答:jmap -heap PID,jstat -gc PID,javap -c ***.class,線上盡力別用jvisualvm命令,消耗性能,想快速優化(徹底不熟悉業務)能夠直接經過調整eden,Survivor區來設置,記得爲何會發生fullGC,兩個重要的一個動態年齡計算,另外一個是老年代擔保機制,熟悉業務時,能夠結合業務來調整,並且在項目上線前,應該作提早的預估。
答:
棧相關
-Xss->設置單個線程棧大小,好比-Xss512K,數值越小,一個線程棧裏能分配的棧幀就越少,說明能夠開啓的線程數越多
方法區(元空間)
-XX:MetaspaceSize->設置方法區的大小,也是觸發GC的閾值,好比-XX:MetaspaceSize=256M
-XX:MaxMetaspaceSiz->設置方法區的最大值,好比-XX:MaxMetaspaceSize=256M
堆相關
-Xms->jvm啓動時分配的內存,好比‐Xms200m
-Xmx->jvm運行過程當中分配的最大內存,好比-Xmx500m
-Xmn->設置年輕代大小,好比-Xmn2g
-XX:NewSize->設置年輕代大小 好比-XX:NewSize=2g
-XX:PretenureSizeThreshold->能夠設置大對象的大小,好比-XX:PretenureSizeThreshold=100000000 單位爲btye。
-XX:-HandlePromotionFailure->老年代分配擔保機制參數,1.8默認開啓。
-XX:-UseAdaptiveSizePolicy->禁止JVM自動優化eden和Survivor默認比例8:1:1,反之JVM默認有這個參數-XX:+UseAdaptiveSizePolicy,會致使這個比例自動變化。
-XX:SurvivorRatio->設置Eden和Survivor大小好比 -XX:SurvivorRatio =8,注意Survivor區有兩個。表示Eden:Survivor=8:2,一個Survivor區佔整個年輕代的1/10。
-XX:NewRatio->設置老年代和年輕代的比值大小 好比-XX:NewRatio=4,表示年老代和年輕代比值爲4:1。
還有不少的命令就不依依列舉了,能夠去看個人博客http://www.javashuo.com/article/p-nrinfuqy-dg.html
答:Minor GC發生在年輕代,當eden區滿的時候會出發Minor GC。
Full GC發生在老年代,回收全部堆空間的內存,Minor GC前的老年代擔保機制可能出發FullGC。
答:http://www.javashuo.com/article/p-pvpovcun-eh.html
當咱們作完minorGC之後,對象放在to區域,也就是咱們Survivor的to區域,可能對象是放不下的,這時會來計算分類年齡,大體是這樣來算的將全部分代年齡爲1的相加,再加上分代年齡爲2的,再加分代年齡爲3的,依次相加,一直加到最大的分代年齡,但在相加過程當中,你會發現加到分代年齡爲m的對象,總大小已經放滿了to區域,這時就將m到n分代年齡的對象都移置到老年代,包含m。也就是大於Survivor區域的50%時,則後面的對象,包含該年齡的對象都放置在老年代。
答:當建立類對象時,先初始化靜態變量和靜態塊,而後是非靜態變量和非靜態代碼塊,而後是構造器。因爲靜態成員只會被初始化一次,因此若是靜態成員已經被初始化過,將不會被再次初始化。
16.簡述一下逃逸分析
答:-XX:+DoEscapeAnalysis
: 表示開啓逃逸分析。-XX:-DoEscapeAnalysis
: 表示關閉逃逸分析 從jdk 1.7開始已經默認開始逃逸分析,如需關閉,須要指定-XX:-DoEscapeAnalysis。逃逸是指在某個方法以內建立的對象,除了在方法體以內被引用以外,還在方法體以外被其它變量引用到;這樣帶來的後果是在該方法執行完畢以後,該方法中建立的對象將沒法被GC回收,因爲其被其它變量引用。正常的方法調用中,方法體中建立的對象將在執行完畢以後,將回收其中建立的對象;故因爲沒法回收,即成爲逃逸。
關注公衆號得到更多面試和學習資料。