您好,登錄后才能下訂單哦!
如何理解JAVA JVM,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用于計算設備的規范,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。
市面上是有很多虛擬機
了解JVM的結構,通過合理的參數配置,有助于我們更好的發揮JVM的性能。
內存空間的主要組成
方法區
方法區(Method Area),是各個線程共享的內存區域,它用于存儲已被虛擬機加載的類型信息、常量、靜態變量、即時編譯器編譯后的代碼緩存等數據
堆
對于Java應用程序來說,Java堆(Java Heap)是虛擬機所管理的內存中最大的一塊。Java堆是被所有線程共享的一塊內存區域,在虛擬機啟動時創建。此內存區域的唯一目的就是存放對象實例,Java世界里“幾乎”所有的對象實例都在這里分配內存
虛擬機棧
線程私有的,它的生命周期與線程相同。虛擬機棧描述的是Java方法執行的線程內存模型:每個方法被執行的時候,Java虛擬機都會同步創建一個棧幀(Stack Frame)用于存儲局部變量表、操作數棧、動態連接、方法出口等信息。每一個方法被調用直至執行完畢的過程,就對應著一個棧幀在虛擬機棧中從入棧到出棧的過程
本地方法棧
本地方法棧(Native Method Stacks)與虛擬機棧所發揮的作用是非常相似的,其區別只是虛擬機棧為虛擬機執行Java方法(也就是字節碼)服務,而本地方法棧則是為虛擬機使用到的本地(Native)方法服務
程序計數器
程序計數器(Program Counter Register)是一塊較小的內存空間,它可以看作是當前線程所執行的字節碼的行號指示器。可以理解為標記程序下一行執行什么。
方法區,堆,線程共享
虛擬機棧,本地方法棧,程序計數器,線程私有,創建一個線程時(可以理解為運行一個方法),創建一個棧幀,專門服務與此線程
堆內存是我們主要使用的內存,堆內存組成如下
包括,年輕代,老年代(默認比例是 1:2)
年輕代:
1.1 包含一個Eden,二個Survivor(默認比例 8:1:1),年輕代用于保存新創建的對象,如果年輕代的內存不夠,會進行一次MinorGC,如果經歷15次MinorGC(默認值),還存活的,會被轉移到老年代(如果新對象年輕代,放不下,會被直接放到老年代)
1.2 年輕代使用復制算法,把內存區域分為兩塊(Eden+Survivor,另一個Survivor),每次使用一塊,GC的時候把一塊中的內容移動到另一塊中,原始內存中的對象就可以被回收了
老年代:
2.1 老年代內存不夠時,會進行一次MajorGC(也有說法是FullGC)
因為GC會造成"Stop the world",線程暫停,所以要合理調整堆內存大小,并分配年輕代,老年代的比例,以達到減少GC頻率,降低GC時間的目的
在堆里面存放著Java世界中幾乎所有的對象實例,垃圾收集器在對堆進行回收前,第一件事情就是要確定這些對象之中哪些還“存活”著,哪些已經“死去”(“死去”即不可能再被任何途徑使用的對象)了。
一般采用“引用計數算法”來判定引用
總結以上,內存調優的目的是,提高代碼的執行效率,減少GC頻率,降低GC時間,這就需要合理的分配堆內存(堆的總大小,年輕代的大小)
下載安裝工具 使用工具:JDK Mission Control 簡稱JMC
下載安裝參考 https://www.cnblogs.com/jhxxb/p/13279286.html
本地程序可以直接在工具中看到,也可以遠程連接到JVM,一般在服務器生成飛行數據,下載到本地,再用工具打開
啟動程序
一般先設置JVM參數,運行程序(-Xms1024m -Xmx1024m -Xmn512m)
Xms: 初始堆大小,默認無聊內存的1/64
Xmx: 最大堆大小,默認物理內存的1/4
Xmn: 新生代大小(新建對象,建議堆的25%-50%),默認整個堆的1/3
收集程序的飛行數據
jcmd <pid> JFR.start delay=10s duration=15m filename=log.jfr
說明: pid: 服務的進程號. 使用ps -ef | grep java 查詢. (使用時去除尖括號)
delay: 延遲開啟配置. delay=10s 代表延遲10秒開啟.
duration: 指收集的日志時長. duration=15m, 代表收集15分鐘的JVM信息.
filename: 指將收集的日志存在指定的日志文件中. filename=log.jfr, 代表將收集的日志存放在log.jfr中.
看完上述內容,你們掌握如何理解JAVA JVM的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。