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