JVM面試和學習中需要注意的部分

音風水發表於2023-05-08

在學習jvm的時候許多人處於迷茫的狀態,對一些基礎的知識反而聽過就忘了,這篇筆記是我在學習jvm的時候隨手記的一些,適合已經學過或者瞭解過的小夥伴複習回顧一下,當然知識的覆蓋是沒有的,主要記錄了我覺得容易忘記或者記錯的知識點,這些有很多是基石知識,希望大家不要忘記,大家看到就當正好複習一下,對大家的面試可能會有一點小小的幫助

記憶體結構

  • 1.方法區用來儲存類載入的資料,例如類的名稱,方法入口
  • 2.JVM虛擬機器棧用於儲存執行緒,包括區域性變數和方法引數
  • 3.堆記憶體用來儲存物件
  • 4.方法區的規範實現:永久代和元空間
  • 5.方法區 JVM棧 堆 都會發生記憶體溢位的問題 程式計數器不會
  • 6.程式計數器用來儲存程式執行到哪裡 因為執行緒是不斷切換的

垃圾回收演演算法

  • 標記清除演演算法:會產生大量記憶體碎片,很多虛擬機器不再使用
  • 標記整理演演算法:適用於老年代的垃圾回收,老年代的無法被回收的物件多,需要被回收的垃圾少,標記整理的效率高
  • 標記複製演演算法:適用於新生代的垃圾回收,無法被回收的物件少,標記複製效率高
  • 新生代的垃圾回收:在對新生代進行垃圾回收時,會標記伊甸園區中的被引用的物件將其複製到倖存區的to中,然後將伊甸園的所有物件回收,from和to交換位置,如果一個物件經常被引用,到達一個次數後會晉升老年代
  • 新生代老年代差別:新生代可以頻繁的回收,速度快 老年代應儘量避免,時間較長

類載入

  • 1.類的位元組碼檔案儲存在方法區,類名.class即類物件儲存在堆記憶體中
  • 2.靜態變數屬於類,隨著類的載入而載入,普通成員變數屬於例項物件
  • 3.final修飾的變數在載入連結階段就已經賦值,而在此階段靜態變數只被分配了空間,沒有賦值,靜態變數的賦值是在初始化階段完成的
  • 4.在類的初始化階段,靜態程式碼塊和靜態變數的賦值是在一個方法中完成的
  • 5.類的載入和初始化都是懶惰的,非必要不載入,例如訪問普通成員變數

Spring框架

Spring_refresh

  • 1.Applicationcontext 是beanfactory 衍生來的用於管理bean
  • 2.spring容器啟動時會建立IOC容器applicationcontext,建立容器時會呼叫refresh方法,透過這個方法完成bean的建立和初始化
  • 3.Environment 主要用於解析@value註解中的${},#{}
  • 4.applicationcontext內部仍借用了beanfactory的功能
  • 5.Beanfactory 建立和管理bean並不是一瞬間的,需要藉助beandefinition,BeanDefinition來源多種多樣主要有XML,配置類,元件掃描三種
  • 6.透過@configuration註解把一個類宣告為配置類,spring會管理配置類,但是beanfactory無法檢測到配置類中的@bean註解,這時需要一個後處理器postprocess 幫助beanfinition識別@bean
  • 7.透過@component 或者其他註解 將一個類宣告為受spring管理的bean spring會透過元件掃描的方式獲取這個bean
  • 8.Bean的後處理器 用於解析註解例如@Autowired @Resource@Value
  • 9.Refresh完成的最後會將beanfinitionmap中的bean放到singletonobjects單例池中,物件建立有三個不同階段,每個階段都有不同的bean後處理器參與進來

Spring_bean

1.bean的生命週期 透過refresh方法可以獲取singleton中的單例物件,透過getbean方法獲取bean 多例物件需要手動getbean
2.依賴注入的優先順序@autowired最低 其次是按名稱匹配AUTOWIRE_BY_NAME 優先順序最高的是精確指定注入bean

相關文章