卖逼视频免费看片|狼人就干网中文字慕|成人av影院导航|人妻少妇精品无码专区二区妖婧|亚洲丝袜视频玖玖|一区二区免费中文|日本高清无码一区|国产91无码小说|国产黄片子视频91sese日韩|免费高清无码成人网站入口

java虛擬機(jī)操作 如何正確學(xué)會Java虛擬機(jī)調(diào)優(yōu)?

如何正確學(xué)會Java虛擬機(jī)調(diào)優(yōu)?一點(diǎn)經(jīng)驗(yàn)僅供參考,:。1)堆運(yùn)行時(shí)數(shù)據(jù)區(qū),從中分配所有類實(shí)例和數(shù)組的內(nèi)存。在Java虛擬機(jī)啟動時(shí)創(chuàng)建。對象的堆內(nèi)存由一個(gè)稱為垃圾收集器的自動內(nèi)存管理系統(tǒng)回收。這個(gè)堆由兩

如何正確學(xué)會Java虛擬機(jī)調(diào)優(yōu)?

一點(diǎn)經(jīng)驗(yàn)僅供參考,:。

1)堆

運(yùn)行時(shí)數(shù)據(jù)區(qū),從中分配所有類實(shí)例和數(shù)組的內(nèi)存。在Java虛擬機(jī)啟動時(shí)創(chuàng)建。對象的堆內(nèi)存由一個(gè)稱為垃圾收集器的自動內(nèi)存管理系統(tǒng)回收。

這個(gè)堆由兩部分組成,:。

從一個(gè)空間到另一個(gè)空間的伊甸園也叫年輕一代,舊空間叫老一代。

其中有S1和S0(會在JDK ;的自帶工具),分別引用幸存者空間,存儲每次垃圾回收后幸存的對象。

老一代,主要存儲應(yīng)用程序中存活的生命周期長的對象。

垃圾回收主要回收年輕一代塊和老一代塊的內(nèi)存,YG用來放新生成的對象,幾次沒有回收的對象移到OG。

YG垃圾收集也稱為MinorGC,OG垃圾收集稱為MajorGC。這兩個(gè)內(nèi)存集合互不干擾。

2)非堆內(nèi)存

JVM有一個(gè)由所有線程共享的方法區(qū)域。方法區(qū)域?qū)儆诜嵌褍?nèi)存。它存儲每個(gè)類的結(jié)構(gòu),比如運(yùn)行時(shí)常量池、字段和方法數(shù)據(jù),以及方法和構(gòu)造函數(shù)的代碼。它是在Java虛擬機(jī)啟動時(shí)創(chuàng)建的。

除了方法區(qū)域,Java虛擬機(jī)實(shí)現(xiàn)可能需要內(nèi)存來進(jìn)行內(nèi)部處理或優(yōu)化,這也是非堆內(nèi)存。比如JIT編譯器需要內(nèi)存來存儲Java虛擬機(jī)代碼轉(zhuǎn)換來的原生代碼,從而獲得高性能。

永久代(圖中的永久空間)存儲JVM 自己的反射對象,比如類對象和方法對象。

3)恢復(fù)算法和過程

JVM采用分代收集策略,掃描收集年輕對象的頻率高,稱為次要收集,而檢查收集舊對象的頻率低得多,稱為主要收集。這樣,就沒有必要每次GC都檢查內(nèi)存中的所有對象。

當(dāng)訪問一個(gè)URL時(shí),內(nèi)存應(yīng)用過程如下:

A.JVM將嘗試在Eden中為相關(guān)的Java對象初始化一個(gè)內(nèi)存區(qū)域。

B.當(dāng)Eden有足夠的空間時(shí),內(nèi)存應(yīng)用程序就結(jié)束了。否則轉(zhuǎn)到下一步。

C.JVM試圖釋放Eden中所有不活動的對象(屬于1或更高的垃圾收集)。如果伊登被釋放了,n空間還是不夠放新的對象,所以我們嘗試把伊甸園里的一些活動對象放到幸存者區(qū)。

D.幸存者區(qū)被用作伊甸園和舊世界的中間交換區(qū)。當(dāng)舊區(qū)的空間足夠時(shí),幸存者區(qū)的對象將被移到舊區(qū),否則它們將被保留在幸存者區(qū)。

E.當(dāng)舊區(qū)域中沒有足夠的空間時(shí),JVM將在舊區(qū)域中進(jìn)行完整的垃圾收集(0級)。

F.完成垃圾收集后,如果幸存者和舊區(qū)仍然可以 t存儲一些從Eden復(fù)制的對象,這樣JVM就可以 不要在Eden區(qū)域?yàn)樾聦ο髣?chuàng)建內(nèi)存區(qū)域內(nèi)存不足錯(cuò)誤 "會出現(xiàn)。

物體的老化過程

年輕一代的記憶由一個(gè)伊甸園(Eden,有趣)和兩個(gè)幸存者空間(1.4文檔中稱為半空間)組成。新創(chuàng)建的對象的內(nèi)存是從eden分配的。兩個(gè)幸存空間中的一個(gè)將總是空閑的,并用作復(fù)制集合的目標(biāo)空間。Minor收集的過程是將現(xiàn)有幸存者空間中的eden和活體對象復(fù)制到空閑的幸存者空間中。所謂的幸存者,也就是大部分被實(shí)驗(yàn)者在伊甸園出生后,根本一次GC都活不下來。在年輕一代進(jìn)行一定數(shù)量的未成年人收集后,當(dāng)一個(gè)對象年老時(shí),它將被移動到老一代,這就是所謂的保有權(quán)。(是不是只有在幸存者空間不足的情況下,舊對象才會終身保有?在當(dāng)前數(shù)據(jù)中沒有找到描述)

剩余內(nèi)存空間不足會觸發(fā)GC,比如eden空間不足,minor收集,old代空間不足,major收集,永久代空間不足會觸發(fā)full GC。

下一部分解釋了當(dāng)TOMCAT或其他服務(wù)器出現(xiàn)以下錯(cuò)誤時(shí):的分析。

1.首先:Java堆空間。

解釋:

堆大小設(shè)置

JVM堆的設(shè)置是指在java程序運(yùn)行過程中,JVM可以分配和使用的內(nèi)存空間的設(shè)置。JVM啟動時(shí)會自動設(shè)置堆大小的值,其初始空間(-Xms)為物理內(nèi)存的1/64,最大空間(-Xmx)為物理內(nèi)存的1/4。可以使用JVM提供的-Xmn -Xms -Xmx等選項(xiàng)。進(jìn)行設(shè)置。堆大小是年輕一代和終身通用Aion的總和。

提示:如果JVM中98%的時(shí)間用于GC,而可用堆的大小小于2%,就會拋出這個(gè)異常消息。

提示:堆大小最多不應(yīng)該超過可用物理內(nèi)存的80%。通常,-Xms和-Xmx選項(xiàng)應(yīng)該設(shè)置為相同,并且-Xmn是-Xmx值的1/4。

解決方案:

手動設(shè)置堆大小。

修改TOMCAT_并在上面添加下面一行 "回聲使用CATALINA_BAS: $卡特琳娜基地 ":

Java代碼

s:maxn:maxnewsize 256m

或者修改

在上面加上下面一行 "回聲使用CATALINA_BAS: $卡特琳娜基地 ":

JAVA _ OPTS $ JAVA _ OPTS-s:max newsize 256m

2,其次是:PermGen空間。

原因:

PermGen空間的全稱是永久生成空間,指的是內(nèi)存的永久存儲區(qū)域。這個(gè)內(nèi)存主要由JVM用來存儲類和元信息。當(dāng)類被加載時(shí),它將被放在PermGen空間中,這個(gè)空間不同于存儲類實(shí)例的堆區(qū)域。GC(垃圾收集)在主程序運(yùn)行過程中不會清理PermGen空間,所以如果你的應(yīng)用非常類,很可能會出現(xiàn)PermGen空間錯(cuò)誤,這是web服務(wù)器預(yù)編譯JSP時(shí)常見的。如果您在WEB應(yīng)用程序下使用大量的第三方j(luò)ar,并且它們的大小超過了jvm的默認(rèn)大小(4M ),就會生成這個(gè)錯(cuò)誤消息。

解決方案:

1.手動設(shè)置MaxPermSize。

修改TOMCAT _(Linux在x)下,在Java代碼中

在上面加上下面一行 "回聲使用CATALINA_BAS: $卡特琳娜基地 ":

s:p:maxpermsize 512m

在上面加上下面一行 "回聲使用CATALINA_BAS: $卡特琳娜基地 ":

s:p:maxp:p:maxp:p:maxp:minh:ma堆比來指定。

服務(wù)器一般會將-Xms和-Xmx設(shè)置為相等,以避免在每次GC后調(diào)整堆的大小,因此上述兩個(gè)參數(shù)沒有用。

-Xmn設(shè)置年輕一代的堆大小。

-xx echo 22-@ 。comminheapfreeratio和-xx echo 23-@ 。Commaxheapfreeratio設(shè)置空閑內(nèi)存占總內(nèi)存的比例范圍。這兩個(gè)參數(shù)將影響GC的頻率和單個(gè)GC的時(shí)間消耗。-XX:N:N:MaxN:P:MaxP: JDK下的內(nèi)存管理工具的使用。

查看jvm內(nèi)存狀態(tài):

jstat -gcutil pid 1000 20

異常情況的例子

jstat -gcutil pid 1000 20

S1和YGC,F(xiàn)GC和GCT

0.00 0.00 99.99 82.51 53.11 2409 1.205 10117 7250.393 7251.598

0.00 0.00 83.42 82.55 53.10 2409 1.205 10118 7252.650 7253.855

0.00 0.00 56.06 82.46 53.10 2410 1.205 10120 7254.467 7255.672

0.00 0.00 32.11 82.55 53.10 2411 1.205 10121 7256.673 7257.877

0.00 0.00 99.99 82.55 53.10 2412 1.205 10123 7257.026 7258.231

0.00 0.00 76.00 82.50 53.10 2412 1.205 10124 7259.241 7260.446

該數(shù)據(jù)表明,完全GC經(jīng)常發(fā)生。

正常情況的例子

S1和YGC,F(xiàn)GC和GCT

0.00 0.00 0.24 55.39 99.60 171 0.667 1339 393.364 394.031

0.000.00 0.24 55.39 99.60 171 0.667 1339 393.364 394.031

0.00 0.00 0.24 55.39 99.60 171 0.667 1339 393.364 394.031

0.00 0.00 0.24 55.39 99.60 171 0.667 1339 393.364 394.031

0.00 0.00 0.24 55.39 99.60 171 0.667 1339 393.364 394.031

0.00 0.00 0.24 55.39 99.60 171 0.667 1339 393.364 394.031

參數(shù)含義:

S0:堆上幸存者空間0段的已用空間百分比。

S1:堆上幸存者空間1段的已用空間百分比。

e:堆上Eden空間段的已用空間百分比。

O:舊空間段的已用空間百分比O:堆。

perm空間中已用空間的百分比。

YGC:從程序啟動到采樣,年輕GC發(fā)生的次數(shù)。

YCT:年輕GC所用時(shí)間(單位秒)

FGC:從程序啟動到采樣的全GC次數(shù)。

FGCT:完全GC所用的時(shí)間(單位秒)

GCT:垃圾收集的總時(shí)間(單位秒)

2轉(zhuǎn)儲內(nèi)存不足

2.1找出要轉(zhuǎn)儲的線程pid。

在Linux下,使用ps -aux。

2.2轉(zhuǎn)儲內(nèi)存使用詳細(xì)信息

您可以使用以下命令:

jmap-dump: fil:jmap -heap 2343,大家可以看到。

正在附加到進(jìn)程ID 2343,請稍候...

調(diào)試器已成功附加。

檢測到服務(wù)器編譯器。

JVM版本是11.0-b16

使用線程本地對象分配。

8線程并行GC

希普·Configuration:

最小自由比率40

MaxH:

PS年輕一代

伊登·Spac:

容量1260060672 (1201.6875MB)

已用64868288(61.6821484375 MB)

免費(fèi)(1195192385

5.1428935546367%已使用

來自Spac:

容量85524480 (81.5625MB)

已用空間59457648(56.181152344 MB)

自由26066832(24.888476562 MB)

使用了69.5359195%

去Spac:

容量85852160 (81.875MB)

已用0 (0.0MB)

免費(fèi)85852160 (81.875MB)

使用了0.0%

~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~這三塊就是上面說的YG大小和用法。

PS老一代

容量2291138560(2185.0兆字節(jié))

使用了1747845928(17478兆字節(jié))的內(nèi)存。17687.888686866687

免費(fèi)的543292632(18.23兆字節(jié))54329253326

使用了76.2099989%

~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~

PS燙發(fā)一代

容量108265472 (103.25MB)

用過的107650712(102.667191772461兆字節(jié))

可用空間614760 (0.5862808227539062MB)

使用了99.3728436%

jstat

Jstat是一個(gè)針對vm的狀態(tài)監(jiān)控工具,包括類加載、運(yùn)行時(shí)編譯和GC。

使用時(shí)需要添加查看流程的流程id和選擇的參數(shù)。下面詳細(xì)描述了每個(gè)參數(shù)的含義。

JSTAT-class pid:顯示諸如加載的類的數(shù)量和占用的空間等信息。

JSTAT-Compil:顯示VM實(shí)時(shí)編譯器的數(shù)量等信息。

JSTAT-gc pid:可以顯示gc的信息,查看GC的次數(shù),以及時(shí)間。后五項(xiàng)分別是年輕gc數(shù)、年輕gc時(shí)間、滿gc數(shù)、滿gc時(shí)間、gc總時(shí)間。

JSTAT -gccapacity:可以顯示VM內(nèi)存中三代(年輕、年老、perm)對象的使用情況和占用大小,如:PGCMN顯示最小perm內(nèi)存使用情況,PGCMX顯示最大perm內(nèi)存使用情況,PGC顯示新生成的perm內(nèi)存使用情況,PC顯示之前的perm內(nèi)存使用情況。其他的可以據(jù)此類推,OC是old中的純占位。

jstat-gcn:新對象信息。

jstat-gcn:n:old object。

jstat-gcoldpactivity PID : old對象的信息及其占用情況。

pid: P:統(tǒng)計(jì)gc信息統(tǒng)計(jì)。

打印pid:當(dāng)前VM執(zhí)行的編譯信息。

除了上面的參數(shù),還可以同時(shí)加兩個(gè)數(shù),比如jstat -printcompilation 3024 250 6每250毫秒打印一次,一共打印6次,還可以加-H3每隔三行顯示一次標(biāo)題。

示例:

jstat -gcutil pid 1000 20

S1和YGC,F(xiàn)GC和GCT

47.49 0.00 64.82 46.08 47.69 20822 2058.631 68 22.734 2081.365

YG GC或MinorGC花了0.06秒

46.69 0.00 15.19 46.18 47.69 20824 2058.776 68 22.734 2081.510

46.69 0.00 74.59 46.18 47.69 20824 2058.776 68 22.734 2081.510

0.00 40.29 19.95 46.24 47.69 20825 2058.848 68 22.734 2081.582

MajorGC平均時(shí)間:22.734/680.334秒。

MinorGC平均時(shí)間:2058.691/208230.099秒。

作為一名程序員,了解java虛擬機(jī)類加載機(jī)制,有什么用?

這是一個(gè)非常重要的課題。昨天剛寫了一篇文章,樓主可以找找看。

Java類加載機(jī)制Java中的類加載機(jī)制是Java技術(shù)體系中相對核心的部分,雖然我們不 t通常接觸不多,類裝入器也不會。;我不經(jīng)常和大多數(shù)軟件開發(fā)人員打交道。但是我們在這里學(xué)習(xí)Java的累加器背后的機(jī)制,可以幫助我們理解和排除程序中類加載失敗等技術(shù)問題,就像上一篇文章中的輻射一樣。學(xué)完這些,你回頭看的時(shí)候就容易明白了。

為什么要使用類加載?

在我們學(xué)習(xí)的java語言中,類的加載是在我們的程序運(yùn)行時(shí)完成的。盡管這種方法在加載類時(shí)會給主機(jī)增加一點(diǎn)性能開銷,但它可以為Java程序提供高度的靈活性。

在我們寫完帶后綴的文件后,類加載過程。java,這些。java文件將被編譯成帶后綴的文件。由編譯器在java中初始化。在我們走進(jìn)。類文件,我們可以看到它存儲了編譯轉(zhuǎn)換后的java代碼的虛擬指令。

當(dāng)我們準(zhǔn)備好使用這個(gè)類時(shí),jvm Virtual將加載它的。類文件并創(chuàng)建相應(yīng)的。類對象。我們將把這個(gè)類文件加載到j(luò)vm虛擬機(jī)的內(nèi)存中。這個(gè)過程叫做類裝入。

加載:加載是指我們從文件中獲取類信息,然后加載到JVM虛擬機(jī)的方法/常量區(qū)域,也就是內(nèi)存。

驗(yàn)證:在本模塊中,我們將驗(yàn)證加載的結(jié)構(gòu)是否符合Java語言規(guī)范和JVM規(guī)范的描述。在這個(gè)過程中,它是班級再版中最復(fù)雜的一塊,在時(shí)間上的花費(fèi)也是最長的一塊。我們使用的大部分調(diào)試程序也在檢查這部分的錯(cuò)誤。

準(zhǔn)備:通過檢查后,我們將分配一個(gè)結(jié)構(gòu)來存儲類的信息。在這個(gè)結(jié)構(gòu)中,我們將存儲我們在類中定義的成員變量、方法和接口的數(shù)據(jù)信息。

Resolving: Resolution意味著我們將這個(gè)類中常量池中的所有符號引用都改為直接引用。

初始化:一旦解析完成,我們就可以提取類中的變量,并將它們初始化為適當(dāng)?shù)闹?。通過執(zhí)行靜態(tài)初始化程序,可以將靜態(tài)變量初始化為指定的值。

這里我們應(yīng)該把重點(diǎn)放在裝載上,剩下的過程應(yīng)該明白了。

與其他階段相比,加載階段,也就是說獲取類的二進(jìn)制字節(jié)流的階段,是我們程序開發(fā)周期中最可控的階段。原因是在加載階段,我們可以使用我們系統(tǒng)提供的ClassLoader來獲取類的二進(jìn)制字節(jié)流。當(dāng)然,這也可以通過我們的自定義類加載器來獲得。

當(dāng)我們加載完成后,jvm虛擬機(jī)外的二進(jìn)制字節(jié)流會按照jvm要求的格式存儲在方法區(qū),數(shù)據(jù)存儲格式由jvm自己定義和實(shí)現(xiàn)。然后在Java堆中實(shí)例化一個(gè)類對象,這是我們的程序訪問方法區(qū)數(shù)據(jù)的外部接口。

這是java中的類加載器。如果對樓主有幫助,就關(guān)注一下。

謝謝大家一直以來的關(guān)心~世界很大,感謝你們~

請?jiān)谠u論區(qū)留下你的疑問或困惑,我會每天和你分享我的看法和經(jīng)驗(yàn)。

聚焦最新科技資訊,探索未來智能領(lǐng)域。我 馬里奧先生。