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

java虛擬機學(xué)習(xí)筆記 如何準確理解Java中的堆與棧?

如何準確理解Java中的堆與棧?謝邀!Java啟動時數(shù)據(jù)區(qū)中的棧有Java虛擬機棧和本地方法棧,全是應(yīng)用于方法的執(zhí)行;堆主要用于能保存對象實例和數(shù)組。Java虛擬機棧每個Java方法不能執(zhí)行的時候都會

如何準確理解Java中的堆與棧?

謝邀!

Java啟動時數(shù)據(jù)區(qū)中的棧有Java虛擬機棧和本地方法棧,全是應(yīng)用于方法的執(zhí)行;堆主要用于能保存對象實例和數(shù)組。

Java虛擬機棧

每個Java方法不能執(zhí)行的時候都會創(chuàng)建一個棧幀,棧幀用于存儲局部變量表、操作數(shù)棧、動態(tài)鏈表和方法出口等信息,每個Java方法從又開始調(diào)用到想執(zhí)行能夠完成的過程,都對應(yīng)著一個棧幀在Java虛擬機棧中入棧到出棧的過程。在Java虛擬機規(guī)范中規(guī)定,如果沒有線程請求的深度大于0虛擬機所容許的深度,將擲下StackOverflowError極其;假如虛擬機這個可以動態(tài)存儲,只不過在擴展時先申請不出來起碼的內(nèi)存,很快就會丟出OutOfMemoryError異常。Java虛擬機棧的生存周期是跟隨線程的,是線程土地所有權(quán)的。

本地方法棧

Java虛擬機棧是為負責(zé)執(zhí)行Java方法服務(wù)的,而本地方法棧是為先執(zhí)行本地方法服務(wù)吧的,它的作用與Java虛擬機棧相象,同時它也會丟出StackOverflowError異常和OutOfMemoryError無比。本地方法棧的生存周期確實是帶領(lǐng)線程的,也是線程公有土地的。

堆是Java虛擬機中內(nèi)存空間大的的一塊,基本都所有的對象實例及數(shù)組都在這里分配內(nèi)存空間,它是所有線程網(wǎng)絡(luò)共享的區(qū)域。在Java虛擬機規(guī)范中,堆可以進入物理上不在不的內(nèi)存空間,如果能邏輯上嘗試就行。當堆中沒有足夠內(nèi)存分配時,因此此時也根本無法再存儲,將會擲下OutOfMemoryError極其。

一種是棧內(nèi)存,一種是堆內(nèi)存。堆是單獨儲存時對象的,棧是單獨運行程序的。

堆要實際new等來創(chuàng)建角色;棧內(nèi)存的主要注意作用是儲存時基本數(shù)據(jù)類型和語句變量。棧的內(nèi)存管理是通過棧的后進先出模式來實現(xiàn)程序的。

棧以及一種數(shù)據(jù)結(jié)構(gòu),是一種不能在一端通過正在插到和刪掉你操作的特殊能量的線性表。它遵循后進先出的原則存儲數(shù)據(jù),先再次進入的數(shù)據(jù)被壓入棧底,到最后再次進入的數(shù)據(jù)在棧頂,必須讀取數(shù)據(jù)的時候從棧頂又開始彈出對話框數(shù)據(jù)(那一個直接進入的數(shù)據(jù)被另一個讀不出來)。

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

一點小經(jīng)驗皆有可能:

1)堆

運行時數(shù)據(jù)區(qū)域,所有類實例和數(shù)組的內(nèi)存均從此處分配。Java虛擬機啟動后時創(chuàng)建角色。對象的堆內(nèi)存由稱作垃圾回收器的自動內(nèi)存管理系統(tǒng)回收二手。

堆由兩部分橫列:

其中edenfromspacetospace也叫二十多歲代(young),oldspace叫舊生代.

其中也有S1,S0(在JDK的光盤驅(qū)動工具輸出中會見到),分別指的是Survivorspace,儲存時你每次垃圾回收后能夠存活的對象.

OldGeneration,通常能保存應(yīng)用程序中生命周期長的存活對象

垃圾回收要注意是對YoungGeneration塊和OldGeneration塊內(nèi)存接受回收,YG用來放新出現(xiàn)的對象,經(jīng)過幾次回收還沒回收掉的對象往OG中移動,

對YG并且垃圾回收又叫做什么MinorGC,對OG垃圾回收叫MajorGC,幾塊內(nèi)存回收不干涉

2)非堆內(nèi)存

JVM具有一個由所有線程鏈接共享的方法區(qū)。方法區(qū)屬于非堆內(nèi)存。它存儲文件每個類結(jié)構(gòu),如正常運行時常數(shù)池、字段和方法數(shù)據(jù),和方法和構(gòu)造方法的代碼。它是在Java虛擬機啟動時時創(chuàng)建角色的。

之外方法區(qū)外,Java虛擬機利用很有可能要主要是用于內(nèi)部處理或優(yōu)化的內(nèi)存,這種內(nèi)存也非堆內(nèi)存。.例如,JIT編譯器不需要內(nèi)存來讀取從Java虛擬機代碼轉(zhuǎn)換的疾飛的本機代碼,從而完成任務(wù)高性能。

Permanent Generation(圖中的PermanentSpace)貯存JVM自己的反射對象,比如說類對象和方法對象

3)回收算法和過程

JVM常規(guī)一種分代回收(generationalcollection)的策略,用較高的頻率對二十多歲的對象(younggeneration)通過掃描儀和回收二手,這種就是minorcollection,而對老對象(oldgeneration)的檢查回收頻率要低大部分,一般稱lionscollection。那樣就不是需要每次來GC都將內(nèi)存中所有對象都檢查一遍。

當一個URL被ftp訪問時,內(nèi)存申請過程::

A.JVM會借著為相關(guān)Java對象在Eden中初始化操作一塊內(nèi)存區(qū)域

B.當Eden空間足夠時,內(nèi)存再申請結(jié)束后。不然到然后再

C.JVM借著能量在Eden中所有不異?;钴S的對象(這不屬于1或更有高級的垃圾回收),釋放后若Eden空間始終絕對無法盛有新對象,則根本無法將部分Eden中活躍對象放入后Survivor區(qū)D. Survivor區(qū)被利用才是Eden及OLD的中間相互交換區(qū)域,當OLD區(qū)空間足夠時,Survivor區(qū)的對象會被移到Old區(qū),不然會被保留在Survivor區(qū)

E.當OLD區(qū)空間太差時,JVM會在OLD區(qū)進行已經(jīng)的垃圾收集(0級)

F.已經(jīng)垃圾收集后,若Survivor及OLD區(qū)仍舊不能儲存時從Eden圖片文件夾回來的部分對象,導(dǎo)致JVM根本無法在Eden區(qū)為新對象修改內(nèi)存區(qū)域,則會出現(xiàn)”out ofmemory錯誤”

對象衰老的過程

younggeneration的內(nèi)存,由一塊Eden(伊甸園,沒興趣)和兩塊Survivor Space(1.4文檔中一般稱semi-space)可以形成。新創(chuàng)建家族的對象的內(nèi)存都分配自eden。幾塊SurvivorSpace總有會那塊是空閑的,照相顯影劑copyingcollection的目標空間。Minorcollection的過程就是將eden和在用survivorspace中的活對象文件復(fù)制到閑下survivorspace中。所謂survivor,也就是大部分對象在伊甸園我屬兔后,根本不會活但三次GC。對象在younggeneration里有過了一定會次數(shù)的minorcollection后,年紀大了,可能會被移到oldgeneration中,稱為tenuring。(有無僅當survivorspace不足以的時候才會將老對象tenuring?目前資料中還沒有找不到請看)

其余內(nèi)存空間將近會觸發(fā)時GC,如eden空間夠了現(xiàn)在就要參與minorcollection,oldgeneration空間夠不夠要接受faceitcollection,permanentgeneration空間下降會引發(fā)fullGC。

4接下來的這部分回答的是TOMCAT或者其他服務(wù)器出現(xiàn)如下錯誤時的分析:

1、簡單是:Javaheapspace

請解釋:

Heapsize設(shè)置中

JVM堆的設(shè)置是指java程序運行過程中JVM可以不調(diào)配使用的內(nèi)存空間的設(shè)置.JVM在啟動的時候會自動出現(xiàn)設(shè)置Heapsize的值,其精靈召喚空間(即-Xms)是物理內(nèi)存的1/64,最大空間(-Xmx)是物理內(nèi)存的1/4。是可以借用JVM能提供的-Xmn-Xms-Xmx等選項可參與設(shè)置。Heapsize的大小是YoungGeneration和TenuredGeneraion之和。

提示:在JVM中假如98%的時間是主要用于GC且和用的Heapsize下降2%的時候?qū)G出此十分信息。

提示:HeapSize大最好別超過可用物理內(nèi)存的80%,就像的要將-Xms和-Xmx選項設(shè)置為相同,而-Xmn為1/4的-Xmx值。

解決方法:

手動系統(tǒng)設(shè)置Heapsize

改TOMCAT_,在“echoUsingCATALINA_BASE:$CATALINA_BASE”上面加入到200以內(nèi)行:

Java代碼

setJAVA_OPTS%JAVA_OPTS%-server-Xms800m-Xmx800m-XX:MaxNewSize256m

setJAVA_OPTS%JAVA_OPTS%-server-Xms800m-Xmx800m-XX:MaxNewSize256m

或可以修改

在“echoUsingCATALINA_BASE:$CATALINA_BASE”上面參加以下行:

JAVA_OPTS$JAVA_OPTS -server -Xms800m-Xmx800m-XX:MaxNewSize256m

2、比如是:PermGenspace

原因:

PermGenspace的全稱是Permanent Generation space,是指內(nèi)存的永久保存區(qū)域,這塊內(nèi)存主要是被JVM貯存Class和Meta信息的,Class在被Loader時變會被放在PermGenspace中,它和存放類實例(Instance)的Heap區(qū)域不同,GC(Garbage Collection)不會在主程序運行期對PermGen space進行清理,所以我如果不是你的應(yīng)用中有很CLASS的話,就很肯定出現(xiàn)PermGenspace錯誤,這種錯誤最常見在web服務(wù)器對JSP通過precompile的時候。假如你的WEBAPP下都用了大量的第三方j(luò)ar,其大小將近了jvm設(shè)置的大小(4M)這樣的話變會再產(chǎn)生此錯誤信息了。

解決方法:

1.不自動可以設(shè)置MaxPermSize大小

直接修改TOMCAT_(Linux下為),在Java代碼

“echoUsingCATALINA_BASE:$CATALINA_BASE”上面組建以下行:

setJAVA_OPTS%JAVA_OPTS%-server-XX:PermSize128M-XX:MaxPermSize512m

“echoUsingCATALINA_BASE:$CATALINA_BASE”上面一并加入200元以內(nèi)行:

setJAVA_OPTS%JAVA_OPTS%-server-XX:PermSize128M-XX:MaxPermSize512m

下為:

Java代碼

JAVA_OPTS$JAVA_OPTS-server-XX:PermSize128M-XX:MaxPermSize512m

JAVA_OPTS$JAVA_OPTS-server-XX:PermSize128M-XX:MaxPermSize512m

JVM的默認設(shè)置

堆(heap)(NewsGeneration和OldGeneraion之和)的設(shè)置

葉綠里分配的內(nèi)存由-Xms委托,默認是物理內(nèi)存的1/64但小于等于1G。

最大分配的內(nèi)存由-Xmx更改,默認是物理內(nèi)存的1/4但小于等于1G。

設(shè)置成剩余的空間堆內(nèi)存小于等于40%時,JVM可能會大小改變堆等到-Xmx的比較大限制,也可以由-XX:MinHeapFreeRatio更改。

系統(tǒng)默認剩余的空間堆內(nèi)存為070%時,JVM會下降堆直到-Xms的最大值限制,可以不由-XX:MaxHeapFreeRatio委托。

服務(wù)器好象設(shè)置-Xms、-Xmx成比例以以免在每次GC后調(diào)整堆的大小,所以上面的兩個參數(shù)也沒啥用。

-Xmn可以設(shè)置younggeneration的heap大小

-XX:MinHeapFreeRatio與-XX:MaxHeapFreeRatio設(shè)置多余的時間內(nèi)存占總內(nèi)存的比例范圍,這兩個參數(shù)會引響GC的頻率和單次GC的耗時。-XX:NewRatio做出決定young與oldgeneration的比例。Younggeneration空間越大,minorcollection頻率越低,不過sillygeneration空間小了,又很可能可能導(dǎo)致lionscollection頻率增加。-XX:NewSize和-XX:MaxNewSize再指定了younggeneration的缺省大小和大的大小。

非堆內(nèi)存的設(shè)置

系統(tǒng)默認分配為64M

-XX:PermSize可以設(shè)置最小分配空間,-XX:MaxPermSize設(shè)置中最大分配空間。象把這兩個數(shù)值設(shè)為是一樣的,以減少先申請內(nèi)存空間的時間。

再回答和筆記下,JDK下的一些具體看內(nèi)存管理工具的使用:

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

jstat-gcutilpid100020

發(fā)現(xiàn)有異常的例子

jstat-gcutilpid100020

S0S1EOPYGCYGCTFGCFGCTGCT

0.000.0099.9982.5153.1124091.205101177250.3937251.598

0.000.0083.4282.5553.1024091.205101187252.6507253.855

0.000.0056.0682.4653.1024101.205101207254.4677255.672

0.000.0032.1182.5553.1024111.205101217256.6737257.877

0.000.0099.9982.5553.1024121.205101237257.0267258.231

0.000.0076.0082.5053.1024121.205101247259.2417260.446

這個數(shù)據(jù)顯示wideGC頻繁發(fā)生了什么。

正常嗎情況的例子

S0S1EOPYGC YGCT FGC FGCT GCT

0.000.000.2455.3999.601710.6671339393.364394.031

0.000.000.2455.3999.601710.6671339393.364394.031

0.000.000.2455.3999.601710.6671339393.364394.031

0.000.000.2455.3999.601710.6671339393.364394.031

0.000.000.2455.3999.601710.6671339393.364394.031

0.000.000.2455.3999.601710.6671339393.364394.031

參數(shù)含義:

S0:Heap上的Survivorspace0段已可以使用空間的百分比

S1:Heap上的Survivorspace1段已建議使用空間的百分比

E:Heap上的Eden space段已建議使用空間的百分比

O:Heap上的Old space段已建議使用空間的百分比

P:Permspace已建議使用空間的百分比

YGC:從程序啟動到采樣時突然發(fā)生YoungGC的次數(shù)

YGCT:YoungGC所帶的時間(單位秒)

FGC:從程序啟動到采樣時不可能發(fā)生largeGC的次數(shù)

FGCT:fullGC所得用時間(單位秒)

GCT:應(yīng)用于垃圾回收的總時間(單位秒)

2Dump出內(nèi)存

2.1得出答案要dump的線程pid

在Linux下,不使用ps–aux

2.2Dump出內(nèi)存在用詳情

也可以是從命令:

jmap-dump:filea.hprofpid

比如:jmap-heap2343,看的到

AttachingtoprocessID2343,pleasewait...

Debuggerattachedsuccessfully.

Servercompilerdetected.

JVMversionare11.0-b16

usingthread-localobjectallocation.

ParallelGCwith8thread(s)

HeapConfiguration:

MinHeapFreeRatio40

MaxHeapFreeRatio70

MaxHeapSize4294967296(4096.0MB)

NewSize2686976(2.5625MB)

MaxNewSize-65536(-0.0625MB)

OldSize5439488(5.1875MB)

NewRatio2(YG,OG大小比為1:2)

SurvivorRatio8

PermSize21757952(20.75MB)

MaxPermSize 268435456 (256.0MB)

HeapUsage:

PSYoungGeneration

EdenSpace:

capacity1260060672(1201.6875MB)

commonly64868288(61.86322021484375MB)

go1195192384(1139.8242797851562MB)

5.148028935546367%employed

fromSpace: capacity 85524480 (81.5625MB)

used59457648(56.70323181152344MB)

fun26066832(24.859268188476562MB)

69.52120375359195%commonly

needSpace:

capacity85852160(81.875MB)

utilized0(0.0MB)

cool85852160(81.875MB)

0.0%used

~~~~~~~~~~~~~~~~~~~~~~~~~~這三塊為上面所說的YG大小和在用情況

PS Old Generation capacity 2291138560 (2185.0MB)

utilized1747845928(1666.8757705688477MB)

fun543292632(518.1242294311523MB)

76.28722062099989%employed

~~~~~~~~~~~~~~~~~~~~~~~~~~OG大小和可以使用情況

PS Perm Generation capacity 108265472 (103.25MB)

employed107650712(102.6637191772461MB)

go614760(0.5862808227539062MB)

99.43217353728436%needed

jstat

jstat是vm的狀態(tài)監(jiān)控工具,監(jiān)控的內(nèi)容有類加載、不運行時編譯程序及GC。

使用時,需再加查找進程的進程id,和所選參數(shù)。以下詳細可以介紹各個參數(shù)的意義。

jstat-classpid:總是顯示打開程序class的數(shù)量,及所占空間等信息。

jstat-compilerpid:總是顯示VM實時編譯器的數(shù)量等信息。

jstat-gcpid:是可以顯示gc的信息,欄里點gc的次數(shù),及時間。其中最后五項,共有是younggc的次數(shù),younggc的時間,widegc的次數(shù),widegc的時間,gc的總時間。

jstat-gccapacity:這個可以會顯示,VM內(nèi)存中三代(young,old,perm)對象的使用和占用資源大小,如:PGCMN沒顯示的是最大時perm的內(nèi)存不使用量,PGCMX顯示的是perm的內(nèi)存比較大不使用量,PGC是當前新化合的perm內(nèi)存占用量,PC是但前perm內(nèi)存占用量。其他的是可以根據(jù)這個以此類推,OC是old內(nèi)純的占用帶寬量。

jstat-gcnewpid:next對象的信息。

jstat-gcnewcapacitypid:fun對象的信息船舶概論電腦資源量。

jstat-gcoldpid:old對象的信息。

jstat-gcoldcapacitypid:old對象的信息教材習(xí)題解答占用量。

jstat-gcpermcapacitypid:perm對象的信息非盈利組織會計占用帶寬量。

jstat-utilpid:統(tǒng)計gc信息統(tǒng)計。

jstat-printcompilationpid:當前VM先執(zhí)行的信息。

除開以上一個參數(shù)外,還這個可以同時再加兩個數(shù)字,如:jstat-printcompilation30242506是每250毫秒可以打印第二次,一共有多少可以打印6次,還這個可以另外-h3每三行總是顯示看看標題。

例子:

jstat-gcutilpid100020

S0S1EOPYGC YGCT FGC FGCT GCT

47.490.0064.8246.0847.69208222058.6316822.7342081.365

0.0037.9138.5746.1347.69208232058.6916822.7342081.425這里再一次發(fā)生了四次YGGC,也就是MinorGC,工程巨大0.06s

46.690.0015.1946.1847.69208242058.7766822.7342081.510

46.690.0074.5946.1847.69208242058.7766822.7342081.510

0.0040.2919.9546.2447.69208252058.8486822.7342081.582

MajorGC總平均時間:22.734/680.334秒

MinorGC平均時間:2058.691/208230.099秒