孝感有做網站的公司嗎代寫軟文
JVM相關問題
- 一、Java繼承時父子類的初始化順序是怎樣的?
- 二、JVM類加載的雙親委派模型?
- 三、JDK為什么要設計雙親委派模型,有什么好處?
- 四、可以打破JVM雙親委派模型嗎?如何打破JVM雙親委派模型?
- 五、什么是內存溢出?什么是內存泄漏?
- 內存溢出(OOM):OutOfMemory
- 內存泄露:Memory Leak
- 六、線上項目JVM都怎么設置的?
- 七、線上Java項目服務器內存飆升怎么排查處理?
- 八、線上Java項目服務器CPU飆到100%怎么排查?
- 九、JVM發(fā)生OOM后,其他線程是否可以繼續(xù)工作?
- 十、高并發(fā)系統(tǒng)的JVM如何優(yōu)化?
- 1、內存預估
- 2、內存分配
- 3、內存占用動態(tài)推算
- 4、如何調優(yōu)?
一、Java繼承時父子類的初始化順序是怎樣的?
- 父類–靜態(tài)變量
- 父類–靜態(tài)初始化塊
- 子類–靜態(tài)變量
- 子類–靜態(tài)初始化塊
- 父類–變量
- 父類–初始化塊
- 父類–構造器
- 子類–變量
- 子類–初始化塊
- 子類–構造器
二、JVM類加載的雙親委派模型?
三、JDK為什么要設計雙親委派模型,有什么好處?
1、確保安全,避免Java核心類庫被修改;
2、避免重復加載;
3、保證類的唯一性;
如果你寫一個java.lang.String的類去運行,發(fā)現(xiàn)會拋出如下異常;
四、可以打破JVM雙親委派模型嗎?如何打破JVM雙親委派模型?
答案:可以;
想要打破這種模型,那么就自定義一個類加載器,重寫其中的loadClass
方法,使其不進行雙親委派即可;
五、什么是內存溢出?什么是內存泄漏?
內存溢出(OOM):OutOfMemory
指程序在申請內存時,沒有足夠的內存空間供其使用,拋出OutOfMemory
錯誤;
比如申請了一個8MB空間,但是當前內存可用空間只有5MB,那么就是內存溢出;
即:OutOfMemoryError,是指沒有空閑內存,垃圾收集器回收后也不能提供更多的內存空間;
內存泄露:Memory Leak
指程序運行后,沒有釋放所占用的內存空間,一次內存泄漏可能不會有很大的影響,但長時間的內存泄漏,堆積到一定程度就會產生內存溢出;
(1)單例對象,生命周期和應用程序一樣長,如果單例對象持有對外部對象的引用的話,那么這個外部對象是不能被回收的,則會產生內存泄露;
(2)一些資源未關閉也會導致內存泄漏,比如數據庫連接,網絡連接socket和IO流的連接都必須在 finally 中 close,否則不能被回收的;
六、線上項目JVM都怎么設置的?
假設線上:4核8G機器;
JVM:棧、堆、元空間;
1、棧: 1m(默認大小),-Xss512k,一個線程是1m,一個線上項目 Tomcat 可能有300個線程,300m;
2、堆:大概把機器的一半內存給堆,4G(新生代、老年代);
- CMS:1/3 、2/3
- G1: 6:4
3、元空間: 一般512M肯定夠了;
此時JVM參數如下:-Xms4096M -Xmx4096M -Xss1M -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M -XX:+UseG1GC
七、線上Java項目服務器內存飆升怎么排查處理?
在Linux系統(tǒng)中使用命令:
#(查看系統(tǒng)Java相關的進程)
jps
在Linux系統(tǒng)中使用命令:
# 查看進程內存占用情況
top
可使用快捷鍵排序:shift + m
在Linux系統(tǒng)中使用命令:
# 查看內存信息
jmap -histo pid
- jmap 是Java虛擬機(JVM)自帶的一個命令行工具,用于生成Java進程的內存映像文件(heap dump),它通過與Java進程通信獲取內存信息,并將信息輸出到文件中,以便后續(xù)離線分析。
- -histo 查看堆內存中的對象實例數目、內存占用大小、類名等;
在Linux系統(tǒng)中使用命令:
# 將內存信息轉存文件
jmap -dump:format=b,file=heap.hprof pid
通過使用 MemoryAnalyzer(MAT)工具分析轉存下來的文件。
八、線上Java項目服務器CPU飆到100%怎么排查?
# 查看進程內存占用情況
top# 打印線程棧信息,輸出到fileName.txt文件中
jstack pid > fileName.txt# 查看pid進程中的線程內存占用情況
top -H -p pid# 把十進制線程ID轉換為十六進制
printf '%x' tid
九、JVM發(fā)生OOM后,其他線程是否可以繼續(xù)工作?
要分情況看,不一定;
- 如果發(fā)生OOM,例如使用局部變量存放對象,方法執(zhí)行后內存會釋放,那么其他線程可以繼續(xù)工作;
- 如果發(fā)生OOM,例如使用全局變量存放對象,方法執(zhí)行后內存不會釋放,那么其他線程不可以繼續(xù)工作;
使用 VisualVM 工具查看JVM堆內存變化情況
十、高并發(fā)系統(tǒng)的JVM如何優(yōu)化?
如果每秒發(fā)生 583000 請求:
1、內存預估
-
普通4核8G服務器,一臺機器抗300-400并發(fā)下單請求比較合理;
-
583000 / 300 = 1943臺機器;
-
一個訂單預估1KB;
-
一臺機器,300KB * 20 * 10 = 60MB的內存開銷,一秒后60MB對象就成為垃圾;
2、內存分配
- 4核8G的機器,JVM給4G,剩下幾個G會留給操作系統(tǒng);
- 堆3G(新生代1.5G,老年代1.5G)
- 棧1MB,JVM里大概會有300-500個線程,大概300-500MB;
- 元空間/永久代512MB;
- -Xms3072M -Xmx3072M -Xmn1536M -Xss1M
- -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M
- -XX:+PrintGCDetails
- -XX:+PrintGCDateStamps
- -Xloggc:d:/gc.log
- -XX:+HeapDumpOnOutOfMemoryError
- -XX:HeapDumpPath=d:/heap.hprof
3、內存占用動態(tài)推算
- 一臺機器每秒抗300個訂單,300KB * 20 * 10 = 60MB,每秒占據新生代60MB內存空間,新生代總共有1.5G的內存空間;
- 1.5G * 1024MB / 60MB = 25秒 新生代Eden占滿,觸發(fā)Minor GC;
- 一般情況下一次可以回收掉90%的新生代對象,存活對象 = 1.5G * 1024MB * 10% = 150MB;
- 如果 “-XX:SurvivorRatio” 參數默認值為8,那么:新生代Eden=1.2GB、S0 = 150MB、S1 = 150MB;
4、如何調優(yōu)?
(1):
-
1次Minor GC后,可能Survivor不足或者觸發(fā)動態(tài)年齡判斷,對象進入老年代,明顯是 Survivor 空間不足;
-
新生代調整為2G,老年代為1G,此時Eden:1.6G,每個Survivor:200MB;
-
解決 Survivor 不足或者觸發(fā)動態(tài)年齡判斷,降低新生代對象進入老年代的概率;
-
此時JVM參數:
-Xms3072M -Xmx3072M -Xmn2048M -Xss1M -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M
(2):
- 一般系統(tǒng)里的@Service、@Controller之類的注解需要長期存活,這些對象一般也不會很多,可能幾十兆,應該讓它們盡快進入老年代;
- 此時JVM參數:
-Xms3072M -Xmx3072M -Xmn2048M -Xss1M -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -XX:MaxTenuringThreshold=5
(3):
-
一般情況下,大對象可能需要長期存活和使用,讓它直接進入老年代;(根據項目實際情況來確定)
-
此時JVM參數如下:
-Xms3072M -Xmx3072M -Xmn2048M -Xss1M -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -XX:MaxTenuringThreshold=5 -XX:PretenureSizeThreshold=1M
(4):
- 指定合適的垃圾回收器;
- 此時JVM參數 :
-Xms3072M -Xmx3072M -Xmn2048M -Xss1M -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -XX:MaxTenuringThreshold=5 -XX:PretenureSizeThreshold=1M -XX:+UseParNewGC -XX:+UseConcMarkSweepGC
- 小堆內存不使用G1垃圾收集器;
(5):
- 大概每隔幾分鐘Minor GC之后有大概200MB左右對象進入老年代,推算可能差不多1小時后,才會有接近1GB的對象進入老年代,觸發(fā)Full GC,然后高峰期一過,可能需要幾個小時才會一次Full GC;
-Xms3072M -Xmx3072M -Xmn2048M -Xss1M -XX:-UseCompressedClassPointers -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=5 -XX:PretenureSizeThreshold=1M -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:d:/gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/heap.hprof
(6): 優(yōu)化思路
- 1、盡可能讓對象在新生代里分配和回收,避免對象頻繁進入老年代導致老年代頻繁垃圾回收;
- 2、給系統(tǒng)充足的內存空間,避免新生代頻繁的垃圾回收;
- 3、指定合適的垃圾收集器;