JVM相關概念總結

目錄

1.jvm內存結構

2.對象分配規則 

 3、解釋內存中的棧(stack)、堆(heap)和靜態區(static area)的用法

4、Perm Space中保存什麼數據?會引起OutOfMemory嗎?

5、什麼是類的加載

6、如何⾃定義⼀個類加載器?你使⽤過哪些或者你在什麼場景下需要⼀個⾃ 定義的類加載器嗎?

7、描述一下JVM加載class文件的原理機制?

8、Java對象創建過程

9、類的生命週期【加載過程】

10、Java 中會存在內存泄漏嗎,請簡單描述。

11、GC是什麼?爲什麼要有GC?

12、做GC時,⼀個對象在內存各個Space中被移動的順序是什麼?

13、你知道哪些垃圾回收算法?

14、垃圾回收器

15、如何判斷一個對象是否應該被回收

16、JVM的永久代中會發生垃圾回收麼?

17、引用的分類

18、調優命令

19、調優工具

20、jstack 是⼲什麼的? jstat 呢?如果線上程序週期性地出現卡頓,你懷疑可 能是 GC 導致的,你會怎麼來排查這個問題?線程⽇志⼀般你會看其中的什麼 部分?

21、Minor GC與Full GC分別在什麼時候發生?

22、你有沒有遇到過OutOfMemory問題?你是怎麼來處理這個問題的?處理 過程中有哪些收穫?

23、JDK 1.8之後Perm Space有哪些變動? MetaSpace⼤⼩默認是⽆限的麼? 還是你們會通過什麼⽅式來指定⼤⼩?

24、StackOverflow異常有沒有遇到過?⼀般你猜測會在什麼情況下被觸發?如何指定⼀個線程的堆棧⼤⼩?⼀般你們寫多少?

1.jvm內存結構 


 

方法區和對是所有線程共享的內存區域;而java棧、本地方法棧和程序員計數器是運行是線程私有的內存區域。

  • Java堆(Heap),是Java虛擬機所管理的內存中最大的一塊。Java堆是被所有線程共享的一塊內存區域,在虛擬機啓動時創建。此內存區域的唯一目的就是存放對象實例,幾乎所有的對象實例都在這裏分配內存
  • 方法區(Method Area),方法區(Method Area)與Java堆一樣,是各個線程共享的內存區域,它用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。
  • 程序計數器(Program Counter Register),程序計數器(Program Counter Register)是一塊較小的內存空間,它的作用可以看做是當前線程所執行的字節碼的行號指示器。
  • JVM棧(JVM Stacks),與程序計數器一樣,Java虛擬機棧(Java Virtual Machine Stacks)也是線程私有的,它的生命週期與線程相同。虛擬機棧描述的是Java方法執行的內存模型:每個方法被執行的時候都會同時創建一個棧幀(Stack Frame)用於存儲局部變量表、操作棧、動態鏈接、方法出口等信息。每一個方法被調用直至執行完成的過程,就對應着一個棧幀在虛擬機棧中從入棧到出棧的過程。
  • 本地方法棧(Native Method Stacks),本地方法棧(Native Method Stacks)與虛擬機棧所發揮的作用是非常相似的,其區別不過是虛擬機棧爲虛擬機執行Java方法(也就是字節碼)服務,而本地方法棧則是爲虛擬機使用到的Native方法服務

2.對象分配規則 

  • 對象優先分配在Eden區,如果Eden區沒有足夠的空間時,虛擬機執行一次Minor GC。
  • 大對象直接進入老年代(大對象是指需要大量連續內存空間的對象)。這樣做的目的是避免在Eden區和兩個Survivor區之間發生大量的內存拷貝(新生代採用複製算法收集內存)。
  • 長期存活的對象進入老年代。虛擬機爲每個對象定義了一個年齡計數器,如果對象經過了1次Minor GC那麼對象會進入Survivor區,之後每經過一次Minor GC那麼對象的年齡加1,知道達到閥值對象進入老年區。
  • 動態判斷對象的年齡。如果Survivor區中相同年齡的所有對象大小的總和大於Survivor空間的一半,年齡大於或等於該年齡的對象可以直接進入老年代。
  • 空間分配擔保。每次進行Minor GC時,JVM會計算Survivor區移至老年區的對象的平均大小,如果這個值大於老年區的剩餘值大小則進行一次Full GC,如果小於檢查HandlePromotionFailure設置,如果true則只進行Monitor GC,如果false則進行Full GC。

 3、解釋內存中的棧(stack)、堆(heap)和靜態區(static area)的用法

4、Perm Space中保存什麼數據?會引起OutOfMemory嗎?

5、什麼是類的加載

6、如何⾃定義⼀個類加載器?你使⽤過哪些或者你在什麼場景下需要⼀個⾃ 定義的類加載器嗎?

7、描述一下JVM加載class文件的原理機制?

8、Java對象創建過程

9、類的生命週期【加載過程】

10、Java 中會存在內存泄漏嗎,請簡單描述。

11、GC是什麼?爲什麼要有GC?

12、做GC時,⼀個對象在內存各個Space中被移動的順序是什麼?

13、你知道哪些垃圾回收算法?

14、垃圾回收器

15、如何判斷一個對象是否應該被回收

16、JVM的永久代中會發生垃圾回收麼?

17、引用的分類

18、調優命令

19、調優工具

20、jstack 是⼲什麼的? jstat 呢?如果線上程序週期性地出現卡頓,你懷疑可 能是 GC 導致的,你會怎麼來排查這個問題?線程⽇志⼀般你會看其中的什麼 部分?

21、Minor GC與Full GC分別在什麼時候發生?

22、你有沒有遇到過OutOfMemory問題?你是怎麼來處理這個問題的?處理 過程中有哪些收穫?

23、JDK 1.8之後Perm Space有哪些變動? MetaSpace⼤⼩默認是⽆限的麼? 還是你們會通過什麼⽅式來指定⼤⼩?

24、StackOverflow異常有沒有遇到過?⼀般你猜測會在什麼情況下被觸發?如何指定⼀個線程的堆棧⼤⼩?⼀般你們寫多少?

https://www.cnblogs.com/JesseP/p/11750847.html 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章