編程基礎,Java虛擬機和內(nèi)存優(yōu)化總結

編程基礎,Java虛擬機和內(nèi)存優(yōu)化總結

長沙一度軟件培訓      2022-05-01 14:42:01     29

編程基礎,Java虛擬機和內(nèi)存優(yōu)化總結,Java的整體運行結構和jvm的關系做個梳理,但是不再用大篇幅的文字敘述的內(nèi)容,這樣不容易記憶,而且容易產(chǎn)生厭看的情緒。所以小

課程價格 請咨詢

上課時段: 授課校區(qū):

詳細介紹

Java的整體運行結構和jvm的關系做個梳理,但是不再用大篇幅的文字敘述的內(nèi)容,這樣不容易記憶,而且容易產(chǎn)生厭看的情緒。所以小編決定使用采用繪圖+少部分文字描述為主。

一、弄明白Java的整體運行結構與jvm的關系

1.Jvm是什么?

Java虛擬機(英語:Java Virtual Machine,縮寫為JVM),一種能夠運行Java bytecode的虛擬機,以堆棧結構機器來進行實做。最早由太陽微系統(tǒng)所研發(fā)并實現(xiàn)第一個實現(xiàn)版本,是Java平臺的一部分,能夠運行以Java語言寫作的軟件程序Java虛擬機有自己完善的硬體架構,如處理器、堆棧、寄存器等,還具有相應的指令系統(tǒng)。JVM屏蔽了與具體操作系統(tǒng)平臺相關的信息,使得Java程序只需生成在Java虛擬機上運行的目標代碼-字節(jié)碼,就可以在多種平臺上不加修改地運行。通過對中央處理器CPU所執(zhí)行的軟件實現(xiàn),實現(xiàn)能執(zhí)行編譯過的Java程序碼與應用程序)。

作為一種編程語言的虛擬機,實際上不只是專用于Java語言,只要生成的編譯文件匹配JVM對加載編譯文件格式要求,任何語言都可以由JVM編譯運行。此外,除了甲骨文,也有其他開源或閉源的實現(xiàn)。--摘自維基百科

2.java運行過程與jvm關系

上圖能夠清晰的展示我們從新編譯一個java類到jvm中執(zhí)行的全部流程,

對堆棧等地方的功能做一個解釋:

堆:java的引用傳遞實現(xiàn),依靠的就是堆內(nèi)存,同一塊堆內(nèi)存可以被不同的棧內(nèi)存所指向;

棧:程序運行的單位,里面存儲的信息都與當前的線程有關系,包括局部變量,程序的運行狀態(tài),方法返回值等;

方法區(qū):在進行遞歸調用時,所保存的堆棧內(nèi)容,它由局部變量表,操作數(shù)棧,當前方法所屬的類的運行時常量的引用,返回地址等;

程序計數(shù)器:一塊非常小的內(nèi)存空間,主要用來做一個計數(shù)操作,對象的晉升問題(關系到垃圾回收(GC)).

二、堆內(nèi)存組織結構以及與內(nèi)存有關的參數(shù)設置(優(yōu)化)

在整個jvm運行時數(shù)據(jù)區(qū),要對jvm進行優(yōu)化,那么堆內(nèi)存是重點優(yōu)化對象。原因是棧本身所占的內(nèi)存比率很小,而java中所有new對象全部放在堆內(nèi)存區(qū)域。那么對這些對象的回收控制策略就非常重要。

1.堆內(nèi)存的內(nèi)部結構

上圖展示了堆內(nèi)存的內(nèi)部結構,值得注意的是,在1.8之前和之后,java的永久代被取消,被元空間所代替(元空間就是電腦本省的物理內(nèi)存),下面對各個區(qū)的作用做簡單的解釋:

年輕代:

Eden區(qū):新生的小對象,每當使用關鍵字new的時候,默認都會在此空間進行對象創(chuàng)建,如果創(chuàng)建的對象過多,那么最終的的結果就是Eden區(qū)的空間爆滿,此時會發(fā)生晉級操作(在經(jīng)歷若干次minorGC后還保留的對象,晉升到存活區(qū));

存活區(qū):minorGC存活的對象保存的區(qū)域,存活區(qū)有兩塊空間S0和S1,有一塊始終為空,該區(qū)域保存對象向老年代晉升(停止-復制算法);

老年代:經(jīng)歷了數(shù)次GC之后還保留的對象,這些對象經(jīng)歷了多次GC仍然存活,但是也有可能在接下來的某一次被清除掉,同時要注意,假如是new一個很大的對象,那么是直接保存到老年代來,如果老年代空間不夠了,會出現(xiàn)MajorGC(FullGC)進行老年代的清理,非常耗費性能(不建議使用system.gc()的原因);

在發(fā)生MajorGC的時候,jvm會檢查每次晉升入老年代的對象的大小是否大于老年代剩余空間的大小,若大于,直接觸發(fā)一次FullGC,否則可以自定義是否允許擔保失敗(關鍵字設置:XX:+HandlePromotionFailure)(標記-清理算法);

元空間(永久代):jdk1.8之后,取消了永久代,變成了元空間,不再在堆內(nèi)存里面保存類,字符串常量等,采用了元空間之后,不會再出現(xiàn)堆溢出的異常。

2.重要參數(shù)

通過調整jvm的相關參數(shù),可以優(yōu)化堆內(nèi)存,提高jvm的運行效率,下面對幾個重要參數(shù)做一下總結:

-Xms:設置初始化的內(nèi)存分配大小,,默認采用的大小為物理大小的1/64;

-Xmx:設置最大的內(nèi)存可用空間,,默認采用的大小為物理大小的1/4;

-Xmn:設置年輕代大小,默認采用的大小為物理大小的1/64;

-Xss:設置每一個線程所占用的棧的大小

三、GC算法

在jdk1.7之后,正式發(fā)布了G1回收算法;

在此之前,GC算法的發(fā)展進程如下:

Serial(串行)收集器

在jdk1.3.1之前,java虛擬機僅僅能使用Serial收集器。Serial收集器是一個單線程的收集器,但它的“單線程”的意義并不僅僅是說明它只會使用一個CPU或一條收集線程去完成垃圾收集工作,更重要的是在它進行垃圾收集時,必須暫停其他所有的工作線程,直到它收集結束。

Parallel(并行)收集器

Parallel收集器也稱吞吐量收集器,相比Serial收集器,Parallel最主要的優(yōu)勢在于使用多線程去完成垃圾清理工作,這樣可以充分利用多核的特性,大幅降低gc時間。

CMS(并發(fā))收集器

CMS收集器在Minor GC時會暫停所有的應用線程,并以多線程的方式進行垃圾回收。在Full GC時不再暫停應用線程,而是使用若干個后臺線程定期的對老年代空間進行掃描,及時回收其中不再使用的對象。

G1(并發(fā))收集器

G1收集器(或者垃圾優(yōu)先收集器)的設計初衷是為了盡量縮短處理超大堆(大于4GB)時產(chǎn)生的停頓。相對于CMS的優(yōu)勢而言是內(nèi)存碎片的產(chǎn)生率大大降低

以上就是長沙一度軟件培訓java培訓機構的小編針對“編程基礎,Java虛擬機和內(nèi)存優(yōu)化總結”的內(nèi)容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務。

培訓啦提醒您:交易時請核實對方資質,對于過大宣傳或承諾需謹慎!任何要求預付定金、匯款等方式均存在風險,謹防上當。