-
當(dāng)前位置:首頁 > 創(chuàng)意學(xué)院 > 技術(shù) > 專題列表 > 正文
java快照實現(xiàn)(java數(shù)據(jù)快照)
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于java快照實現(xiàn)的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。
開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁版、PC客戶端
官網(wǎng):https://ai.de1919.com。
創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,如需了解SEO相關(guān)業(yè)務(wù)請撥打電話175-8598-2043,或添加微信:1454722008
本文目錄:
一、如何分析線程堆棧
JVM線程堆棧是一個給定時間的快照,它能向你提供所有被創(chuàng)建出來的Java線程的完整清單.
每一個被發(fā)現(xiàn)的Java線程都會給你如下信息:
– 線程的名稱;經(jīng)常被中間件廠商用來識別線程的標(biāo)識,一般還會帶上被分配的線程池名稱以及狀態(tài) (運行,阻塞等等.)
– 線程類型 & 優(yōu)先級,例如 : daemon prio=3 ** 中間件程序一般以后臺守護的形式創(chuàng)建他們的線程,這意味著這些線程是在后臺運行的;它們會向它們的用戶提供服務(wù),例如:向你的Java EE應(yīng)用程序 **
– Java線程ID,例如 : tid=0x000000011e52a800 ** 這是通過 java.lang.Thread.getId() 獲得的Java線程ID,它常常用自增長的長整形 1..n** 實現(xiàn)
– 原生線程ID,例如 : nid=0x251c** ,之所以關(guān)鍵是因為原生線程ID可以讓你獲得諸如從操作系統(tǒng)的角度來看那個線程在你的JVM中使用了大部分的CPU時間等這樣的相關(guān)信息. **
– Java線程狀態(tài)和詳細(xì)信息,例如: waiting for monitor entry [0xfffffffea5afb000] java.lang.Thread.State: BLOCKED (on object monitor)
** 可以快速的了解到線程狀態(tài)極其當(dāng)前阻塞的可能原因 **
– Java線程棧跟蹤;這是目前為止你能從線程堆棧中找到的最重要的數(shù)據(jù). 這也是你花費最多分析時間的地方,因為Java棧跟蹤向提供了你將會在稍后的練習(xí)環(huán)節(jié)了解到的導(dǎo)致諸多類型的問題的根本原因,所需要的90%的信息。
– Java 堆內(nèi)存分解; 從HotSpot VM 1.6版本開始,在線程堆棧的末尾處可以看到HotSpot的內(nèi)存使用情況,比如說Java的堆內(nèi)存(YoungGen, OldGen) & PermGen 空間。這個信息對分析由于頻繁GC而引起的問題時,是很有用的。你可以使用已知的線程數(shù)據(jù)或模式做一個快速的定位。
Heap
PSYoungGen total 466944K, used 178734K [0xffffffff45c00000, 0xffffffff70800000, 0xffffffff70800000)
eden space 233472K, 76% used [0xffffffff45c00000,0xffffffff50ab7c50,0xffffffff54000000)
from space 233472K, 0% used [0xffffffff62400000,0xffffffff62400000,0xffffffff70800000)
to space 233472K, 0% used [0xffffffff54000000,0xffffffff54000000,0xffffffff62400000)
PSOldGen total 1400832K, used 1400831K [0xfffffffef0400000, 0xffffffff45c00000, 0xffffffff45c00000)
object space 1400832K, 99% used [0xfffffffef0400000,0xffffffff45bfffb8,0xffffffff45c00000)
PSPermGen total 262144K, used 248475K [0xfffffffed0400000, 0xfffffffee0400000, 0xfffffffef0400000)
object space 262144K, 94% used [0xfffffffed0400000,0xfffffffedf6a6f08,0xfffffffee0400000)
線程堆棧信息大拆解
為了讓大家更好的理解,給大家提供了下面的這張圖,在這張圖中將HotSpot VM上的線程堆棧信息和線程池做了詳細(xì)的拆解,如下圖所示:
上圖中可以看出線程堆棧是由多個不同部分組成的。這些信息對問題分析都很重要,但對不同的問題模式的分析會使用不同的部分(問題模式會在后面的文章中做模擬和演示。)
現(xiàn)在通過這個分析樣例,給大家詳細(xì)解釋一下HoteSpot上線程堆棧信息中的各個組成部分:
# Full thread dump標(biāo)示符
“Full thread dump”是一個全局唯一的關(guān)鍵字,你可以在中間件和單機版本Java的線程堆棧信息的輸出日志中找到它(比如說在UNIX下使用:kill -3 <PID> )。這是線程堆??煺盏拈_始部分。
Full thread dump Java HotSpot(TM) 64-Bit Server VM (20.0-b11 mixed mode):
# Java EE 中間件,第三方以及自定義應(yīng)用軟件中的線程
這個部分是整個線程堆棧的核心部分,也是通常需要花費最多分析時間的部分。堆棧中線程的個數(shù)取決你使用的中間件,第三方庫(可能會有獨立線程)以及你的應(yīng)用程序(如果創(chuàng)建自定義線程,這通常不是一個很好的實踐)。
在我們的示例線程堆棧中,WebLogic是我們所使用的中間件。從Weblogic 9.2開始, 會使用一個用“’weblogic.kernel.Default (self-tuning)”唯一標(biāo)識的能自行管理的線程池
"[STANDBY] ExecuteThread: '414' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=3 tid=0x000000010916a800 nid=0x2613 in Object.wait() [0xfffffffe9edff000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0xffffffff27d44de0> (a weblogic.work.ExecuteThread)
at java.lang.Object.wait(Object.java:485)
at weblogic.work.ExecuteThread.waitForRequest(ExecuteThread.java:160)
- locked <0xffffffff27d44de0> (a weblogic.work.ExecuteThread)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:181)
# HotSpot VM 線程
這是一個有Hotspot VM管理的內(nèi)部線程,用于執(zhí)行內(nèi)部的原生操作。一般你不用對此操太多心,除非你(通過相關(guān)的線程堆棧以及 prstat或者原生線程Id)發(fā)現(xiàn)很高的CPU占用率.
"VM Periodic Task Thread" prio=3 tid=0x0000000101238800 nid=0x19 waiting on condition
# HotSpot GC 線程
當(dāng)使用 HotSpot 進行并行 GC (如今在使用多個物理核心的環(huán)境下很常見), 默認(rèn)創(chuàng)建的HotSpot VM 或者每個JVM管理一個有特定標(biāo)識的GC線程時. 這些GC線程可以讓VM以并行的方式執(zhí)行其周期性的GC清理, 這會導(dǎo)致GC時間的總體減少;與此同時的代價是CPU的使用時間會增加.
"GC task thread#0 (ParallelGC)" prio=3 tid=0x0000000100120000 nid=0x3 runnable
"GC task thread#1 (ParallelGC)" prio=3 tid=0x0000000100131000 nid=0x4 runnable
………………………………………………………………………………………………………………………………………………………………
這事非常關(guān)鍵的數(shù)據(jù),因為當(dāng)你遇到跟GC有關(guān)的問題,諸如過度GC、內(nèi)存泄露等問題是,你將可以利用這些線程的原生Id值關(guān)聯(lián)的操作系統(tǒng)或者Java線程,進而發(fā)現(xiàn)任何對CPI時間的高占用. 未來的文章你將會了解到如何識別并診斷這樣的問題.
# JNI 全局引用計數(shù)
JNI (Java 本地接口)的全局引用就是從本地代碼到由Java垃圾收集器管理的Java對象的基本的對象引用. 它的角色就是阻止對仍然在被本地代碼使用,但是技術(shù)上已經(jīng)不是Java代碼中的“活動的”引用了的對象的垃圾收集.
同時為了偵測JNI相關(guān)的泄露而留意JNI引用也很重要. 如果你的程序直接使用了JNI,或者像監(jiān)聽器這樣的第三方工具,就容易造成本地的內(nèi)存泄露.
JNI global references: 1925
# Java 堆棧使用視圖
這些數(shù)據(jù)被添加回了 JDK 1 .6 ,向你提供有關(guān)Hotspot堆棧的一個簡短而快速的視圖. 我發(fā)現(xiàn)它在當(dāng)我處理帶有過高CPU占用的GC相關(guān)的問題時非常有用,你可以在一個單獨的快照中同時看到線程堆棧以及Java堆的信息,讓你當(dāng)時就可以在一個特定的Java堆內(nèi)存空間中解析(或者排除)出任何的關(guān)鍵點. 你如在我們的示例線程堆棧中所見,Java 的堆 OldGen 超出了最大值!
Heap
PSYoungGen total 466944K, used 178734K [0xffffffff45c00000, 0xffffffff70800000, 0xffffffff70800000)
eden space 233472K, 76% used [0xffffffff45c00000,0xffffffff50ab7c50,0xffffffff54000000)
from space 233472K, 0% used [0xffffffff62400000,0xffffffff62400000,0xffffffff70800000)
to space 233472K, 0% used [0xffffffff54000000,0xffffffff54000000,0xffffffff62400000)
PSOldGen total 1400832K, used 1400831K [0xfffffffef0400000, 0xffffffff45c00000, 0xffffffff45c00000)
object space 1400832K, 99% used [0xfffffffef0400000,0xffffffff45bfffb8,0xffffffff45c00000)
PSPermGen total 262144K, used 248475K [0xfffffffed0400000, 0xfffffffee0400000, 0xfffffffef0400000)
object space 262144K, 94% used [0xfffffffed0400000,0xfffffffedf6a6f08,0xfffffffee0400000)
我希望這篇文章能對你理解Hotspot VM線程堆棧的基本信息有所幫助。
二、java虛擬機采用什么軟件體系結(jié)構(gòu)
JAVA虛擬機的生命周期
一個運行時的Java虛擬機實例的天職是:負(fù)責(zé)運行一個java程序。當(dāng)啟動一個Java程序時,一個虛擬機實例也就誕生了。當(dāng)該程序關(guān)閉退出,這個虛擬機實例也就隨之消亡。如果同一臺計算機上同時運行三個Java程序,將得到三個Java虛擬機實例。每個Java程序都運行于它自己的Java虛擬機實例中。
Java虛擬機實例通過調(diào)用某個初始類的main()方法來運行一個Java程序。而這個main()方法必須是共有的(public)、靜態(tài)的(static)、返回值為void,并且接受一個字符串?dāng)?shù)組作為參數(shù)。任何擁有這樣一個main()方法的類都可以作為Java程序運行的起點。
在上面的例子中,Java程序初始類中的main()方法,將作為該程序初始線程的起點,任何其他的線程都是由這個初始線程啟動的。
在Java虛擬機內(nèi)部有兩種線程:守護線程和非守護線程。守護線程通常是由虛擬機自己使用的,比如執(zhí)行垃圾收集任務(wù)的線程。但是,Java程序也可以把它創(chuàng)建的任何線程標(biāo)記為守護線程。而Java程序中的初始線程——就是開始于main()的那個,是非守護線程。
只要還有任何非守護線程在運行,那么這個Java程序也在繼續(xù)運行。當(dāng)該程序中所有的非守護線程都終止時,虛擬機實例將自動退出。假若安全管理器允許,程序本身也能夠通過調(diào)用Runtime類或者System類的exit()方法來退出。
JAVA虛擬機的體系結(jié)構(gòu)
下圖是JAVA虛擬機的結(jié)構(gòu)圖,每個Java虛擬機都有一個類裝載子系統(tǒng),根據(jù)給定的全限定名來裝入類型(類或接口)。同樣,每個Java虛擬機都有一個執(zhí)行引擎,負(fù)責(zé)執(zhí)行那些包含在被裝載類的方法中的指令。
當(dāng)JAVA虛擬機運行一個程序時,需要內(nèi)存來存儲許多東西,例如:字節(jié)碼、從已裝載的class文件中得到的其他信息、程序創(chuàng)建的對象、傳遞給方法的參數(shù),返回值、局部變量等等。Java虛擬機把這些東西都組織到幾個“運行時數(shù)據(jù)區(qū)”中,以便于管理。
某些運行時數(shù)據(jù)區(qū)是由程序中所有線程共享的,還有一些則只能由一個線程擁有。每個Java虛擬機實例都有一個方法區(qū)以及一個堆,是由該虛擬機實例中所有的線程共享的。當(dāng)虛擬機裝載一個class文件時,會從這個class文件包含的二進制數(shù)據(jù)中解析類型信息。然后把這些類型信息放到方法區(qū)中。當(dāng)程序運行時,虛擬機會把所有該程序在運行時創(chuàng)建的對象都放到堆中。
當(dāng)每一個新線程被創(chuàng)建時,都將得到它自己的PC寄存器(程序計數(shù)器)以及一個Java棧,如果線程正在執(zhí)行的是一個Java方法(非本地方法),那么PC寄存器的值將總是指向下一條將被執(zhí)行的指令,而Java棧則總是存儲該線程中Java方法調(diào)用的狀態(tài)——包括局部變量,被調(diào)用時傳進來的參數(shù)、返回值,以及運算的中間結(jié)果等等。而本地方法調(diào)用的狀態(tài),則是以某種依賴于具體實現(xiàn)的方法存儲在本地方法棧中,也可能是在寄存器或者其他某些與特定實現(xiàn)相關(guān)的內(nèi)存區(qū)中。
Java棧是由許多棧幀(stack frame)組成的,一個棧幀包含一個Java方法調(diào)用的狀態(tài)。當(dāng)線程調(diào)用一個Java方法時,虛擬機壓入一個新的棧幀到該線程的Java棧中,當(dāng)該方法返回時,這個棧幀被從Java棧中彈出并拋棄。
Java虛擬機沒有寄存器,其指令集使用Java棧來存儲中間數(shù)據(jù)。這樣設(shè)計的原因是為了保持Java虛擬機的指令集盡量緊湊、同時也便于Java虛擬機在那些只有很少通用寄存器的平臺上實現(xiàn)。另外,Java虛擬機這種基于棧的體系結(jié)構(gòu),也有助于運行時某些虛擬機實現(xiàn)的動態(tài)編譯器和即時編譯器的代碼優(yōu)化。
下圖描繪了Java虛擬機為每一個線程創(chuàng)建的內(nèi)存區(qū),這些內(nèi)存區(qū)域是私有的,任何線程都不能訪問另一個線程的PC寄存器或者Java棧。
上圖展示了一個虛擬機實例的快照,有三個線程正在執(zhí)行。線程1和線程2都正在執(zhí)行Java方法,而線程3則正在執(zhí)行一個本地方法。
Java棧都是向下生長的,而棧頂都顯示在圖的底部。當(dāng)前正在執(zhí)行的方法的棧幀則以淺色表示,對于一個正在運行Java方法的線程而言,PC寄存器總是指向下一條將被執(zhí)行的指令。比如線程1和線程2都是以淺色顯示的,由于線程3當(dāng)前正在執(zhí)行一個本地方法,因此,PC寄存器——以深色顯示的那個,其值是不確定的。
數(shù)據(jù)類型
Java虛擬機是通過某些數(shù)據(jù)類型來執(zhí)行計算的,數(shù)據(jù)類型可以分為兩種:基本類型和引用類型,基本類型的變量持有原始值,而引用類型的變量持有引用值。
Java語言中的所有基本類型同樣也都是Java虛擬機中的基本類型。但是boolean有點特別,雖然Java虛擬機也把boolean看做基本類型,但是指令集對boolean只有很有限的支持,當(dāng)編譯器把Java源代碼編譯為字節(jié)碼時,它會用int或者byte來表示boolean。在Java虛擬機中,false是由整數(shù)零來表示的,所有非零整數(shù)都表示true,涉及boolean值的操作則會使用int。另外,boolean數(shù)組是當(dāng)做byte數(shù)組來訪問的,但是在“堆”區(qū),也可以被表示為位域。
Java虛擬機還有一個只在內(nèi)部使用的基本類型:returnAddress,Java程序員不能使用這個類型,這個基本類型被用來實現(xiàn)Java程序中的finally子句。該類型是jsr, ret以及jsr_w指令需要使用到的,值是JVM指令的操作碼的指針。returnAddress類型不是簡單意義上的數(shù)值,不屬于任何一種基本類型,并且值是不能被運行中的程序所修改的。
Java虛擬機的引用類型被統(tǒng)稱為“引用(reference)”,有三種引用類型:類類型、接口類型、以及數(shù)組類型,值都是對動態(tài)創(chuàng)建對象的引用。類類型的值是對類實例的引用;數(shù)組類型的值是對數(shù)組對象的引用,在Java虛擬機中,數(shù)組是個真正的對象;而接口類型的值,則是對實現(xiàn)了該接口的某個類實例的引用。還有一種特殊的引用值是null,表示該引用變量沒有引用任何對象。
三、什么版本的Java可以玩minecraft快照19w04a?
用官方啟動器顯示有漏洞,可以試試第三方啟動器啟動例如hmcl(推薦2.3.5.4)
更換JAVA版本
64x可以試試32x的
或者改用java9嘗試或者改用java7
也可以調(diào)整成debug模式修改bug(難度高)
最簡單(刪了該版本重新下載)
通過這些方法應(yīng)該能達(dá)到正常游玩
拓展延伸
背景設(shè)定
Minecraft是一款沙盒游戲,整個游戲沒有劇情,玩家在游戲中自由建設(shè)和破壞,透過像積木一樣來對元素進行組合與拼湊,輕而易舉的就能制作出小木屋、城堡甚至城市,玩家可以通過自己創(chuàng)造的作品來體驗上帝一般的感覺。在這款游戲里,不僅可以單人娛樂,還可以多人聯(lián)機,玩家也可以安裝一些模組來增加游戲趣味性(比如身為肝帝的我喜歡玩格雷科技。
Minecraft著重于讓玩家去探索、交互,并且改變一個由一立方米大小的方塊動態(tài)生成的地圖。除了方塊以外,環(huán)境功能還包括植物、生物與物品。游戲里的一些活動包括采集礦石、與敵對生物戰(zhàn)斗、合成新的方塊與收集各種在游戲中找到的資源的工具。游戲中的無限制模式讓玩家在各種多人游戲服務(wù)器或他們的單人模式中進行創(chuàng)造建筑物、作品與藝術(shù)創(chuàng)作。其他功能包括邏輯運算與遠(yuǎn)程動作的紅石電路、礦車及軌道,,以及稱之為"下界"的神秘世界。最終,可以選擇前往一個叫做“末路之地”的維度旅行,并打倒末影龍。
四、
以上就是關(guān)于java快照實現(xiàn)相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進行咨詢,客服也會為您講解更多精彩的知識和內(nèi)容。
推薦閱讀:
java培訓(xùn)班學(xué)費一般多少(零基礎(chǔ)Java開發(fā)工程師培訓(xùn)收費標(biāo)準(zhǔn))
中國如何注冊chatGPT賬號(cheatninja要如何注冊)
如何創(chuàng)建ChatGPT賬號(cheatninja要如何注冊)