成人AV在线无码|婷婷五月激情色,|伊人加勒比二三四区|国产一区激情都市|亚洲AV无码电影|日av韩av无码|天堂在线亚洲Av|无码一区二区影院|成人无码毛片AV|超碰在线看中文字幕

java虛擬機操作 如何正確學會Java虛擬機調優(yōu)?

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

如何正確學會Java虛擬機調優(yōu)?

一點經驗僅供參考,:。

1)堆

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

這個堆由兩部分組成,:。

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

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

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

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

YG垃圾收集也稱為MinorGC,OG垃圾收集稱為MajorGC。這兩個內存集合互不干擾。

2)非堆內存

JVM有一個由所有線程共享的方法區(qū)域。方法區(qū)域屬于非堆內存。它存儲每個類的結構,比如運行時常量池、字段和方法數據,以及方法和構造函數的代碼。它是在Java虛擬機啟動時創(chuàng)建的。

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

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

3)恢復算法和過程

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

當訪問一個URL時,內存應用過程如下:

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

B.當Eden有足夠的空間時,內存應用程序就結束了。否則轉到下一步。

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

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

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

F.完成垃圾收集后,如果幸存者和舊區(qū)仍然可以 t存儲一些從Eden復制的對象,這樣JVM就可以 不要在Eden區(qū)域為新對象創(chuàng)建內存區(qū)域內存不足錯誤 "會出現。

物體的老化過程

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

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

下一部分解釋了當TOMCAT或其他服務器出現以下錯誤時:的分析。

1.首先:Java堆空間。

解釋:

堆大小設置

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

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

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

解決方案:

手動設置堆大小。

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

Java代碼

s:maxn:maxnewsize 256m

或者修改

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

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

2,其次是:PermGen空間。

原因:

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

解決方案:

1.手動設置MaxPermSize。

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

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

s:p:maxpermsize 512m

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

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

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

-Xmn設置年輕一代的堆大小。

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

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

jstat -gcutil pid 1000 20

異常情況的例子

jstat -gcutil pid 1000 20

S1和YGC,FGC和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

該數據表明,完全GC經常發(fā)生。

正常情況的例子

S1和YGC,FGC和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

參數含義:

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

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

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

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

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

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

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

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

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

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

2轉儲內存不足

2.1找出要轉儲的線程pid。

在Linux下,使用ps -aux。

2.2轉儲內存使用詳細信息

您可以使用以下命令:

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

正在附加到進程ID 2343,請稍候...

調試器已成功附加。

檢測到服務器編譯器。

JVM版本是11.0-b16

使用線程本地對象分配。

8線程并行GC

希普·Configuration:

最小自由比率40

MaxH:

PS年輕一代

伊登·Spac:

容量1260060672 (1201.6875MB)

已用64868288(61.6821484375 MB)

免費(1195192385

5.1428935546367%已使用

來自Spac:

容量85524480 (81.5625MB)

已用空間59457648(56.181152344 MB)

自由26066832(24.888476562 MB)

使用了69.5359195%

去Spac:

容量85852160 (81.875MB)

已用0 (0.0MB)

免費85852160 (81.875MB)

使用了0.0%

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

PS老一代

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

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

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

使用了76.2099989%

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

PS燙發(fā)一代

容量108265472 (103.25MB)

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

可用空間614760 (0.5862808227539062MB)

使用了99.3728436%

jstat

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

使用時需要添加查看流程的流程id和選擇的參數。下面詳細描述了每個參數的含義。

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

JSTAT-Compil:顯示VM實時編譯器的數量等信息。

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

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

jstat-gcn:新對象信息。

jstat-gcn:n:old object。

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

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

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

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

示例:

jstat -gcutil pid 1000 20

S1和YGC,FGC和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平均時間:22.734/680.334秒。

MinorGC平均時間:2058.691/208230.099秒。

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

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

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

為什么要使用類加載?

在我們學習的java語言中,類的加載是在我們的程序運行時完成的。盡管這種方法在加載類時會給主機增加一點性能開銷,但它可以為Java程序提供高度的靈活性。

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

當我們準備好使用這個類時,jvm Virtual將加載它的。類文件并創(chuàng)建相應的。類對象。我們將把這個類文件加載到jvm虛擬機的內存中。這個過程叫做類裝入。

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

驗證:在本模塊中,我們將驗證加載的結構是否符合Java語言規(guī)范和JVM規(guī)范的描述。在這個過程中,它是班級再版中最復雜的一塊,在時間上的花費也是最長的一塊。我們使用的大部分調試程序也在檢查這部分的錯誤。

準備:通過檢查后,我們將分配一個結構來存儲類的信息。在這個結構中,我們將存儲我們在類中定義的成員變量、方法和接口的數據信息。

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

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

這里我們應該把重點放在裝載上,剩下的過程應該明白了。

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

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

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

謝謝大家一直以來的關心~世界很大,感謝你們~

請在評論區(qū)留下你的疑問或困惑,我會每天和你分享我的看法和經驗。

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