一、什么是jvm java虛擬機,java之所以跨平臺通過jvm運行環(huán)境實現(xiàn)。 詳細(xì)jvm內(nèi)存結(jié)構(gòu) 其中,方法區(qū)和堆線程(共享區(qū)),其他是線程私有程序計數(shù)器 內(nèi)存空間小,線程私有。通過改變計數(shù)器的值來選取下一條需要執(zhí)行指令的字節(jié)碼指令,分支、異常處理、循環(huán)、跳轉(zhuǎn)、線程恢復(fù)等基礎(chǔ)功能需要依賴計數(shù)器完成。 java內(nèi)存泄漏、溢出場景 泄漏:對象一直被引用,但不會調(diào)用 溢出:內(nèi)存泄漏導(dǎo)致堆棧內(nèi)存增大 1、大量的jar、class文件加載,導(dǎo)致空間不足 2、操作大量的對象內(nèi)存空間 3、nio直接操作內(nèi)存 解決方法: 查看程序具體泄漏問題,設(shè)置參數(shù)加大空間,代碼是否存在死循環(huán),或循環(huán)產(chǎn)生過多重復(fù)對象實體 二、java線程池 線程池一般值虛擬機棧。 jvm規(guī)范讓每個java線程擁有獨立的jvm棧,也就是調(diào)用方法棧。 調(diào)用的時候,生成一個棧幀。棧幀保存在虛擬機棧中的,棧幀存儲局部變量表、操作數(shù)棧、動態(tài)連接和方法返回地址等信息。 當(dāng)線程運行時候,當(dāng)前活動始終是虛擬機棧的棧頂元素。 什么是java雙親委派模式,有什么場景打破這模式? 雙親委派模式為了解決類載入過程中的安全問題, 例子:自己寫了 java.lang.Object的類,欺騙jvm。通過雙親委派模式,JVM會優(yōu)先在 BootstrapClassLoader的路徑下找到 java.lang.Object類,并載入它 三、jvm完整的GC流程 1、YGC :對新生代堆進行g(shù)c。頻率比較高,因為大部分對象的存活壽命較短,在新生代里被回收。性能耗費較小。 2、FGC :全堆范圍的gc。默認(rèn)堆空間使用到達80%(可調(diào)整)的時候會觸發(fā)fgc。以我們生產(chǎn)環(huán)境為例,一般比較少會觸發(fā)fgc,有時10天或一周左右會有一次。 |
|