php成品網(wǎng)站推廣網(wǎng)站排名
文章目錄
- 1.JDK、JRE、JVM關(guān)系?
- 2.啟動程序如何查看加載了哪些類,以及加載順序?
- 3. class字節(jié)碼文件10個主要組成部分?
- 4.畫一下jvm內(nèi)存結(jié)構(gòu)圖?
- 5.程序計數(shù)器
- 6.Java虛擬機(jī)棧
- 7.本地方法棧
- 8.Java堆
- 9.方法區(qū)
- 10.運(yùn)行時常量池?
- 11.什么時候拋出StackOverflowError?
- 12.Java7和Java8在內(nèi)存模型上有什么區(qū)別?
- 13.程序員最關(guān)注的兩個內(nèi)存區(qū)域?
- 14.直接內(nèi)存是什么?
- 15.除了哪個區(qū)域外,虛擬機(jī)內(nèi)存其他運(yùn)行時區(qū)域都會發(fā)生OutOfMemoryError?
- 16.什么情況下會出現(xiàn)堆內(nèi)存溢出?
- 17.如何實(shí)現(xiàn)一個堆內(nèi)存溢出?
- 18.空間什么情況下會拋出OutOfMemoryError?
- 19.如何實(shí)現(xiàn)StrackOverflowError?
- 20.如何設(shè)置直接內(nèi)存容量?
- 21.Java堆內(nèi)存組成?
- 22.Edem : from : to默認(rèn)比例是?
- 23.垃圾標(biāo)記階段?
- 24.引用計數(shù)法?
- 25.根搜索算法?
- 26.JVM中三種常見的垃圾收集算法?
- 27.標(biāo)記-清除算法?
- 28.復(fù)制算法?
- 29.標(biāo)記-整理算法?
- 30.分代收集算法?
- 31.垃圾收集器?
- 32.Stop The World?
- 33.Serial收集器?
- 34.PartNew收集器?
- 36.Parallel Scavenge?
- 37.Parallel Old收集器?
- 38.CMS 收集器?
- 39.CMS垃圾回收的步驟?
- 41.CMS收集器優(yōu)點(diǎn)?缺點(diǎn)?
- 42.G1收集器?
- 42. G1收集器是如何改進(jìn)收集方式的?
- 43.虛擬機(jī)進(jìn)程狀況工具?
- 44.虛擬機(jī)統(tǒng)計信息工具?
- 45.jstat 工具主要選項(xiàng)?
- 45.配置信息工具?
- 46.內(nèi)存映像工具?
- 47.虛擬機(jī)堆轉(zhuǎn)存儲快照分析工具?
- 48.堆棧跟蹤工具?
- 49.除了命令行,還有什么可視化工具?
- 50.類加載過程?
1.JDK、JRE、JVM關(guān)系?
Jdk (Java Development Kit) : java語言的軟件開發(fā)包。包括Java運(yùn)行時環(huán)境Jre。
Jre (Java Runtime Environment) :Java運(yùn)行時環(huán)境,包括Jvm。
Jvm (Java Virtual Machine) :
- 一種用于計算機(jī)設(shè)備的規(guī)范。
- Java語言在不同平臺上運(yùn)行時不需要重新編譯。Java語言使用Java虛擬機(jī)屏蔽了與具體平臺相關(guān)的信息,使得Java語言編譯程序只需生成在Java虛擬機(jī)上運(yùn)行的目標(biāo)代碼(字節(jié)碼),就可以在多種平臺上不加修改地運(yùn)行。
Jdk包括Jre,Jre包括jvm。
2.啟動程序如何查看加載了哪些類,以及加載順序?
java -XX:+TraceClassLoading 具體類
Java -verbose 具體類
3. class字節(jié)碼文件10個主要組成部分?
- MagicNumber
- Version
- Constant_pool
- Access_flag
- This_class
- Super_class
- Interfaces
- Fields
- Methods
- Attributes
4.畫一下jvm內(nèi)存結(jié)構(gòu)圖?
5.程序計數(shù)器
屬于線程私有內(nèi)存。占用一塊非常小的空間,它的作用可以看作是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器。字節(jié)碼解釋器工作時就是通過改變這個計數(shù)器的值來選取下一條需要執(zhí)行的指令的字節(jié)碼,分支、循環(huán)、跳轉(zhuǎn)、異常處理、線程恢復(fù)等基礎(chǔ)功能都依賴這個計數(shù)器來完成。
6.Java虛擬機(jī)棧
屬于線程私有內(nèi)存。它的生命周期與線程相同,虛擬機(jī)棧描述的是Java方法執(zhí)行內(nèi)存模型;每個方法被執(zhí)行的時候都會同時創(chuàng)建一個棧楨用于存儲局部變量表、操作棧、動態(tài)鏈接、方法出口信息等。每一個方法被調(diào)用直至執(zhí)行完成的過程,就對應(yīng)著一個棧幀再虛擬機(jī)中從入棧到出棧的過程。
7.本地方法棧
本地方法棧與虛擬機(jī)棧所發(fā)揮的作用是非常相似的,只不過虛擬機(jī)棧對虛擬機(jī)執(zhí)行Java方法服務(wù),而本地棧是為虛擬機(jī)使用到Native方法服務(wù)。
8.Java堆
是Java虛擬機(jī)所管理的內(nèi)存中最大的一塊。Java堆事被所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機(jī)啟動時創(chuàng)建。此內(nèi)存區(qū)域的唯一目的就是存放對象實(shí)例,幾乎所有的對象實(shí)例都在這里分配內(nèi)存。
Tips:但隨著JIT編譯器的發(fā)展與逃逸分析技術(shù)的逐漸成熟,棧上分配、標(biāo)亮替換優(yōu)化技術(shù)將會導(dǎo)師一些微妙的變化發(fā)生,所有的對象都分配在堆上就不那么絕對了。
9.方法區(qū)
是各個線程共享的內(nèi)存區(qū)域,它用于存儲已被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù)。
10.運(yùn)行時常量池?
是方法區(qū)的一部分,Class文件中除了有類的版本、字段、方法、接口等描述信息,還有一項(xiàng)是常量池(Constant PoolTable)用于存放編譯期生成的各種字面量和符號引用,這部分內(nèi)容將在類加載后存放道方法區(qū)的運(yùn)行時常量池中。
11.什么時候拋出StackOverflowError?
如果線程請求的棧深度大于虛擬機(jī)所允許的深度,則拋出StackOverflowError。
12.Java7和Java8在內(nèi)存模型上有什么區(qū)別?
Java8取消了永久代,用元空間(Metaspace)代替了,元空間是存在本地內(nèi)存(Native memory)中。
13.程序員最關(guān)注的兩個內(nèi)存區(qū)域?
堆(Heap)和棧(Stack),一般大家會把Java內(nèi)存分為堆內(nèi)存和棧內(nèi)存,這是一種比較粗糙的劃分方式,但實(shí)際上Java內(nèi)存區(qū)域是很復(fù)雜的。
14.直接內(nèi)存是什么?
直接內(nèi)存并不是虛擬機(jī)運(yùn)行時數(shù)據(jù)區(qū)的一部分,也不是Java虛擬機(jī)規(guī)范中定義的內(nèi)存區(qū)域,但這部分內(nèi)存也頻繁被實(shí)用,也有OutOfMemoryError異常的出現(xiàn)的可能。
Tips:JDK1.4中加入了NIO(new input/output)類,引入了一種基于通道(Channe)與緩沖區(qū)(Buffer)的I/O方式,也可以使用Native函數(shù)庫直接分配堆外內(nèi)存,然后通過一個存儲在Java堆里面的DirectByteBuffer的對象作為這塊內(nèi)存的引用進(jìn)行操作。
15.除了哪個區(qū)域外,虛擬機(jī)內(nèi)存其他運(yùn)行時區(qū)域都會發(fā)生OutOfMemoryError?
程序計數(shù)器。
16.什么情況下會出現(xiàn)堆內(nèi)存溢出?
堆內(nèi)存存儲對象實(shí)例。我們只要不斷地創(chuàng)建對象。并保證gc roots到對象之間有可達(dá)路徑來避免垃圾回收機(jī)制清除這些對象。就會在對象數(shù)量到達(dá)最大。堆容量限制后,產(chǎn)生內(nèi)存溢出異常。
17.如何實(shí)現(xiàn)一個堆內(nèi)存溢出?
public class Cat {public static void main(String[] args) {List list = new ArrayList();while (true) {list.add(new Cat());}}}
18.空間什么情況下會拋出OutOfMemoryError?
如果虛擬機(jī)在擴(kuò)展棧時無法申請到足夠的內(nèi)存空間,則拋出OutOfMemoryError。
19.如何實(shí)現(xiàn)StrackOverflowError?
public static void main(String[] args) {eat();}public static void eat () {eat();}
20.如何設(shè)置直接內(nèi)存容量?
通過 -XX:MaxDirectMemorySize指定,如果不指定,則默認(rèn)與Java堆的最大值一樣。
21.Java堆內(nèi)存組成?
堆大小 = 新生代 + 老年代。如果是Java8則沒有Permanent Generation。
其中新生代(Young) 被分為 Eden和S0(from)和S1(to)。
22.Edem : from : to默認(rèn)比例是?
Edem : from : to = 8 : 1 : 1
此比例可以通過 –XX:SurvivorRatio 來設(shè)定
23.垃圾標(biāo)記階段?
在GC執(zhí)行垃圾回收之前,為了區(qū)分對象存活與否,當(dāng)對象被標(biāo)記為死亡時,GC才回執(zhí)行垃圾回收,這個過程就是垃圾標(biāo)記階段。
24.引用計數(shù)法?
比如對象a,只要任何一個對象引用了a,則a的引用計數(shù)器就加1,當(dāng)引用失效時,引用計數(shù)器就減1,當(dāng)計數(shù)器為0時,就可以對其回收。
但是無法解決循環(huán)引用的問題。
25.根搜索算法?
跟搜索算法是以跟為起始點(diǎn),按照從上到下的方式搜索被根對象集合所連接的目標(biāo)對象是否可達(dá)(使用根搜索算法后,內(nèi)存中 的存活對象都會被根對象集合直接或間接連接著),如果目標(biāo)對象不可達(dá),就意味著該對象己經(jīng)死亡,便可以在 instanceOopDesc的 Mark World 中將其標(biāo)記為垃圾對象。
在根搜索算法中, 只有能夠被根對象集合直接或者間接連接的對象才是存活對象。
26.JVM中三種常見的垃圾收集算法?
標(biāo)記-清除算法(Mark_Sweep)
復(fù)制算法(Copying)
標(biāo)記-壓縮算法(Mark-Compact)
27.標(biāo)記-清除算法?
首先標(biāo)記出所有需要回收的對象,在標(biāo)記完成后統(tǒng)一回收掉所有的被標(biāo)記對象。
缺點(diǎn):
- 標(biāo)記和清除的效率都不高。
- 空間問題,清除后產(chǎn)生大量不連續(xù)的內(nèi)存隨便。如果有大對象會出現(xiàn)空間不夠的現(xiàn)象從而不得不提前觸發(fā)另一次垃圾收集動作。
28.復(fù)制算法?
他將可用內(nèi)存按容量劃分為大小相等的兩塊,每次只使用其中的一塊,當(dāng)這一塊內(nèi)存用完了,就將還存活的對象復(fù)制到另外一塊上面,然后再把已使用過的內(nèi)存空間一次清理掉。
優(yōu)點(diǎn):
解決了內(nèi)存碎片問題。
缺點(diǎn):
將原來的內(nèi)存縮小為原來的一半,存活對象越多效率越低。
29.標(biāo)記-整理算法?
先標(biāo)記出要被回收的對象,然后讓所有存活的對象都向一端移動,然后直接清理掉邊界以外的內(nèi)存。解決了復(fù)制算法和標(biāo)記清理算法的問題。
30.分代收集算法?
當(dāng)前商業(yè)虛擬機(jī)的垃圾收集都采用“分代手機(jī)算法”,其實(shí)就根據(jù)對象存活周期的不同將內(nèi)存劃分為幾塊,一般是新老年代。根據(jù)各個年代的特點(diǎn)采用最適當(dāng)?shù)氖占惴ā?/p>
31.垃圾收集器?
如果說垃圾收集算法是方法論,那么垃圾收集器就是具體實(shí)現(xiàn)。連線代表可以搭配使用。
32.Stop The World?
進(jìn)行垃圾收集時,必須暫停其他所有工作線程,Sun將這種事情叫做"Stop The World"。
33.Serial收集器?
單線程收集器,單線程的含義在于它會 stop the world。垃圾回收時需要stop the world ,直到它收集結(jié)束。所以這種收集器體驗(yàn)比較差。
34.PartNew收集器?
Serial收集器的多線程版本,除了使用采用并行收回的方式回收內(nèi)存外,其他行為幾乎和Serial沒區(qū)別。
可以通過選項(xiàng)“-XX:+UseParNewGC”手動指定使用 ParNew收集器執(zhí)行內(nèi)存回收任務(wù)。
36.Parallel Scavenge?
是一個新生代收集器,也是復(fù)制算法的收集器,同時也是多線程并行收集器,與PartNew 不同是,它重點(diǎn)關(guān)注的是程序達(dá)到一個可控制的吞吐量(Thoughput,CPU 用于運(yùn)行用戶代碼 的時間/CPU 總消耗時間,即吞吐量=運(yùn)行用戶代碼時間/(運(yùn)行用戶代碼時間+垃圾收集時間)), 高吞吐量可以最高效率地利用 CPU 時間,盡快地完成程序的運(yùn)算任務(wù),主要適用于在后臺運(yùn)算而不需要太多交互的任務(wù)。
他可以通過2個參數(shù)精確的控制吞吐量,更高效的利用cpu。
分別是: -XX:MaxCcPauseMillis 和 -XX:GCTimeRatio
37.Parallel Old收集器?
Parallel Scavenge收集器的老年代版本,使用多線程和標(biāo)記-整理算法。JDK 1.6中才開始提供。
38.CMS 收集器?
Concurrent Mar Sweep 收集器是一種以獲取最短回收停頓時間為目標(biāo)的收集器。重視服務(wù)的響應(yīng)速度,希望系統(tǒng)停頓時間最短。采用標(biāo)記-清除的算法來進(jìn)行垃圾回收。
39.CMS垃圾回收的步驟?
-
初始標(biāo)記 (stop the world)
-
并發(fā)標(biāo)記
-
重新標(biāo)記 (stop the world)
-
并發(fā)清除
初始標(biāo)記僅僅只是標(biāo)記一下GC Roots能直接關(guān)聯(lián)到的對象,速度很快。
并發(fā)標(biāo)記就是進(jìn)行Gc Roots Tracing的過程。
重新標(biāo)記則是為了修正并發(fā)標(biāo)記期間,因用戶程序繼續(xù)運(yùn)行而導(dǎo)致的標(biāo)記產(chǎn)生變動的那一部分對象的標(biāo)記記錄,這個階段停頓時間一般比初始標(biāo)記時間長,但是遠(yuǎn)比并發(fā)標(biāo)記時間短。
整個過程中并發(fā)標(biāo)記時間最長,但此時可以和用戶線程一起工作。
41.CMS收集器優(yōu)點(diǎn)?缺點(diǎn)?
優(yōu)點(diǎn):
并發(fā)收集、低停頓
缺點(diǎn):
- 對cpu資源非常敏感。
- 無法處理浮動垃圾。
- 內(nèi)存碎片問題。
42.G1收集器?
Garbage First 收集器是當(dāng)前收集器技術(shù)發(fā)展的最前沿成果。jdk 1.6_update14中提供了 g1收集器。
G1收集器是基于標(biāo)記-整理算法的收集器,它避免了內(nèi)存碎片的問題。
可以非常精確控制停頓時間,既能讓使用者明確指定一個長度為 M毫秒的時間片段內(nèi),消耗在垃圾收集上的時間不多超過N毫秒,這幾乎已經(jīng)是實(shí)時java(rtsj)的垃圾收集器特征了。
42. G1收集器是如何改進(jìn)收集方式的?
極力避免全區(qū)域垃圾收集,之前的收集器進(jìn)行收集的范圍都是整個新生代或者老年代。而g1將整個Java堆(包括新生代、老年代)劃分為多個大小固定的獨(dú)立區(qū)域,并且跟蹤這些區(qū)域垃圾堆積程度,維護(hù)一個優(yōu)先級李彪,每次根據(jù)允許的收集時間,優(yōu)先回收垃圾最多的區(qū)域。從而獲得更高的效率。
43.虛擬機(jī)進(jìn)程狀況工具?
jps (Jvm process status tool ),他的功能與ps類似。
可以列出正在運(yùn)行的虛擬機(jī)進(jìn)程,并顯示執(zhí)行主類(Main Class,main()函數(shù)所在的類)的名稱,以及浙西進(jìn)程的本地虛擬機(jī)的唯一ID。
語法 : jps [options] [hostid]
-q 主輸出lvmid,省略主類的名稱
-m 輸出虛擬機(jī)進(jìn)程啟動時傳遞給主類main()函數(shù)的參數(shù)
-l 輸出主類全名,如果進(jìn)程執(zhí)行是Jar包,輸出Jar路徑
-v 輸出虛擬機(jī)進(jìn)程啟動時JVM參數(shù)
44.虛擬機(jī)統(tǒng)計信息工具?
jstat(JVM Statistics Montoring Tool)是用于監(jiān)視虛擬機(jī)各種運(yùn)行狀態(tài)信息命令行工機(jī)具。他可以顯示本地或遠(yuǎn)程虛擬機(jī)進(jìn)程中的類裝載、內(nèi)存、垃圾收集、jit編譯等運(yùn)行數(shù)據(jù)。
jstat [option vmid [interval[s|ms] [count]] ]
interval 查詢間隔
count 查詢次數(shù)
如果不用這兩個參數(shù),就默認(rèn)查詢一次。
option代表用戶希望查詢的虛擬機(jī)信息,主要分3類:
- 類裝載
- 垃圾收集
- 運(yùn)行期編譯狀況
45.jstat 工具主要選項(xiàng)?
-class 監(jiān)視類裝載、卸載數(shù)量、總空間及類裝載鎖消耗的時間
-gc 監(jiān)視Java堆狀況,包括Eden區(qū),2個survivor區(qū)、老年代
-gccapacity 監(jiān)視內(nèi)容與-gc基本相同,但輸出主要關(guān)注Java堆各個區(qū)域使用的最大和最小空間
-gcutil 監(jiān)視內(nèi)容與-gc基本相同,主要關(guān)注已經(jīng)使用空間站空間百分比
-gccause 與-gcutil 功能一樣,但是會額外輸出導(dǎo)致上一次GC產(chǎn)生的原因
-gcnew 監(jiān)視新生代的GC的狀況
-gcnewcapacity 監(jiān)視內(nèi)容與 -gcnew基本相同,輸出主要關(guān)注使用到的最大最小空間
-gcold 監(jiān)視老年代的GC情況
-gcoldcapacity 監(jiān)控內(nèi)容與 -gcold基本相同,主要關(guān)注使用到的最大最小空間
-compiler 輸出jit 編譯器編譯過的方法、耗時等信息
45.配置信息工具?
jinfo(Configuration Info for Java)的作用是實(shí)時地查看和調(diào)整虛擬機(jī)的各項(xiàng)參數(shù)。
使用jps 命令的 -v 參數(shù)可以查看虛擬機(jī)啟動時顯示指定的參數(shù)列表。
jinfo 語法: jinfo [option] pid
46.內(nèi)存映像工具?
jmap(Memory Map for Java) 命令用于生成堆轉(zhuǎn)儲快照(一般稱為heapdump或dump文件)。
語法 :jmap [option] vmid
它還可以查詢finalize執(zhí)行隊列,Java堆和永久代的詳細(xì)信息,如果空間使用率、當(dāng)前用的是哪種收集器等。
- -dump 生成Java堆轉(zhuǎn)儲快照,其中l(wèi)ive自參數(shù)說明是否只dump出存活對象
- -finalizerinfo 顯示在F -Queue 中等待Finalizer線程執(zhí)行finalize方法的對象。只在Linux/Solaris平臺下有效
- -heap 顯示Java堆詳細(xì)信息,如使用哪種回收器、參數(shù)配置、分代狀況。
- -histo 顯示堆中對象統(tǒng)計信息、包括類、實(shí)例數(shù)量和合計容量。
- -F 當(dāng)虛擬機(jī)進(jìn)程對-dump選項(xiàng)沒有響應(yīng)時,可使用這個選項(xiàng)強(qiáng)制生成dump快照。
47.虛擬機(jī)堆轉(zhuǎn)存儲快照分析工具?
jhat ( JVM Heap Analysis Tool) 用來分析jmap生成的堆轉(zhuǎn)儲快照。
48.堆棧跟蹤工具?
jstack(Stack Trace for Java) 命令用于生成虛擬機(jī)當(dāng)前時刻的線程快照(一般稱為thread dump 或javacore文件)。線程快照就是當(dāng)前虛擬機(jī)內(nèi)每一條線程正在執(zhí)行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現(xiàn)長時間停頓的原因。
jstack [option] vmid
-F 當(dāng)正常輸出的請求不被響應(yīng)時,強(qiáng)制輸出線程堆棧
-l 除堆棧外,顯示關(guān)于鎖的附加信息
-m 如果調(diào)用本地方法的花,可以顯示C/C++ 的堆棧
49.除了命令行,還有什么可視化工具?
JConsole 和 VisualVM,這兩個工具是JDK的正式成員。
50.類加載過程?
加載-》驗(yàn)證-》準(zhǔn)備-》解析-》初始化-》使用-》卸載
時間不會回頭感情豈會有如果