JVM主要分三塊:
類加載子系統
執行引擎
java運行時數據區
本地方法棧服務的對象是JVM執行的native方法,而虛擬機棧服務的是JVM執行的java方法
棧(虛擬機棧和本地方法棧)、程序計數器是線程私有的很好理解:每個線程執行都需要記錄代碼執行的位置和所需要的變量已經方法調用(主要是代碼的開始地址) 這樣當然需要爲每一個線程維護自己的棧和計數器了
虛擬機棧的每個方法棧楨都包括: javap的指令就用到
局部變量表、操作數棧、動態鏈接和方法返回地址
局部變量表: 保存棧楨中定義的局部變量
操作樹棧:棧楨中操作數據的時候使用的棧空間 配置局部變量表實現變量賦值操作
方法返回地址:棧楨操作完畢後將結果返回 例如main中調用其他方法 棧楨完成後將返回結果返回main方法中 並賦值到局部變量表中
動態鏈接:保存指向運行時常量池中該棧幀所屬方法的 引用 在編譯到運行期間 使符號引用(此時並不知道對象的實際內存地址 只是用符號代表引用這個對象)變成 對象加載到內存後的直接引用(通過指針 相對偏移量或者句柄)
java源文件給程序員看
java class文件給jvm看 通過執行引擎(javap指令就看到 每條指令前有程序計數器需要檢索的數字–行號 來記錄接來下執行哪行代碼)來執行代碼 完成跨平臺
要知道 java引用有 強引用 軟引用 弱引用 虛引用
堆:
eden區滿了 觸發輕gc ------ minor GC
minorGC有用幾個過程 (1)從eden進入from age+!
(2)從from進去to age+1 並且from to對調
15次minor GC對象都不清除會進入老年代
老年代內存足夠大後會引發full GC
性能調優目的就是爲了減少STW的次數:儘量避免老年代的full gc--- --- ----而full gc很容易引發jvm stop the world
是在執行垃圾收集算法時,Java應用程序的其他所有線程都被掛起(除了垃圾收集幫助器之外)。Java中一種全局暫停現象,全局停頓,所有Java代碼停止,native代碼可以執行,但不能與JVM交互;這些現象多半是由於gc引起
=======爲什麼需要from 和 to
和底層垃圾回收算法有關
=======jvm內存體積大小
可以用java自帶的visual lvm工具查看堆內存和GC的過程, visual lvm可以實時查看進程的cpu、堆、線程等參數,也可以查看哪裏有死鎖 ---deadlockdemo
用dump查看
jmap -heap [pid] 查看jvm內存運行狀態
jmap -histo [pid] 查看jvm堆中詳細運行情況
jmap -dump:file=文件名.dump [pid] 生成dump 文件 可以用visuallvm進行分析
Reference
Rederence包下面主要有這些類
StrongReference:平常new生成相對並賦值的方法都是強引用 不會被GC回收 出問題之際拋異常 除非方法棧結束/引用置null纔會被垃圾回收
SoftReference :軟引用 jvm空間不足需要回收的時候纔會回收 會在出現 OOM 錯誤之前被回 SoftReference 調用 get() 方法獲取該對象的強引用。如果這個softReference對象沒有被 gc 回收,則返回此對象,否則返回 null 。
WeakReference:下一次垃圾回收只要找到這個類就直接回收
PhantomReference:虛引用 無法直接get獲取對象的強引用 主要用來標誌對象被銷燬的過程 用來在對象銷燬時候執行任務
FinalReference
通過對象可達性進行判斷:
從根節點出發 經過的節點引用有上述幾個 強引用對象不會被GC 其他的按照上面的規則進行GC 而強引用斷裂置空的對象 孤立的對象就會被回收(還需要經過兩次標記 涉及F-QUEUE隊列 和 finalie方法----可以在此方法中也就是第二次標記中復活對象 第一此標記是判斷沒引用的對象時是否需要調用fialzie方法 需要的進入F-queue 第二次標記是判斷對象是否能逃離垃圾回收而復活)