JVM相關問題

JVM相關問題

  • 一、Java繼承時父子類的初始化順序是怎樣的?
  • 二、JVM類加載的雙親委派模型?
  • 三、JDK為什么要設計雙親委派模型,有什么好處?
  • 四、可以打破JVM雙親委派模型嗎?如何打破JVM雙親委派模型?
  • 五、什么是內存溢出?什么是內存泄漏?
    • 內存溢出(OOM):OutOfMemory
    • 內存泄露:Memory Leak
  • 六、線上項目JVM都怎么設置的?
  • 七、線上Java項目服務器內存飆升怎么排查處理?
  • 八、線上Java項目服務器CPU飆到100%怎么排查?
  • 九、JVM發生OOM后,其他線程是否可以繼續工作?
  • 十、高并發系統的JVM如何優化?
    • 1、內存預估
    • 2、內存分配
    • 3、內存占用動態推算
    • 4、如何調優?

一、Java繼承時父子類的初始化順序是怎樣的?

  1. 父類–靜態變量
  2. 父類–靜態初始化塊
  3. 子類–靜態變量
  4. 子類–靜態初始化塊
  5. 父類–變量
  6. 父類–初始化塊
  7. 父類–構造器
  8. 子類–變量
  9. 子類–初始化塊
  10. 子類–構造器

二、JVM類加載的雙親委派模型?

在這里插入圖片描述

三、JDK為什么要設計雙親委派模型,有什么好處?

1、確保安全,避免Java核心類庫被修改;

2、避免重復加載;

3、保證類的唯一性;

如果你寫一個java.lang.String的類去運行,發現會拋出如下異常;
在這里插入圖片描述

四、可以打破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系統中使用命令:

#(查看系統Java相關的進程)
jps 

在Linux系統中使用命令:

# 查看進程內存占用情況
top

可使用快捷鍵排序:shift + m

在Linux系統中使用命令:

# 查看內存信息
jmap -histo pid
  • jmap 是Java虛擬機(JVM)自帶的一個命令行工具,用于生成Java進程的內存映像文件(heap dump),它通過與Java進程通信獲取內存信息,并將信息輸出到文件中,以便后續離線分析。
  • -histo 查看堆內存中的對象實例數目、內存占用大小、類名等;

在Linux系統中使用命令:

# 將內存信息轉存文件
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發生OOM后,其他線程是否可以繼續工作?

要分情況看,不一定;

  • 如果發生OOM,例如使用局部變量存放對象,方法執行后內存會釋放,那么其他線程可以繼續工作;
  • 如果發生OOM,例如使用全局變量存放對象,方法執行后內存不會釋放,那么其他線程不可以繼續工作;

使用 VisualVM 工具查看JVM堆內存變化情況

十、高并發系統的JVM如何優化?

如果每秒發生 583000 請求:

1、內存預估

  • 普通4核8G服務器,一臺機器抗300-400并發下單請求比較合理;

  • 583000 / 300 = 1943臺機器;

  • 一個訂單預估1KB;

  • 一臺機器,300KB * 20 * 10 = 60MB的內存開銷,一秒后60MB對象就成為垃圾;

2、內存分配

  • 4核8G的機器,JVM給4G,剩下幾個G會留給操作系統;
  • 堆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、內存占用動態推算

  • 一臺機器每秒抗300個訂單,300KB * 20 * 10 = 60MB,每秒占據新生代60MB內存空間,新生代總共有1.5G的內存空間;
  • 1.5G * 1024MB / 60MB = 25秒 新生代Eden占滿,觸發Minor GC;
  • 一般情況下一次可以回收掉90%的新生代對象,存活對象 = 1.5G * 1024MB * 10% = 150MB;
  • 如果 “-XX:SurvivorRatio” 參數默認值為8,那么:新生代Eden=1.2GB、S0 = 150MB、S1 = 150MB;
    在這里插入圖片描述

4、如何調優?

(1):

  • 1次Minor GC后,可能Survivor不足或者觸發動態年齡判斷,對象進入老年代,明顯是 Survivor 空間不足;

  • 新生代調整為2G,老年代為1G,此時Eden:1.6G,每個Survivor:200MB;

  • 解決 Survivor 不足或者觸發動態年齡判斷,降低新生代對象進入老年代的概率;

  • 此時JVM參數:

    -Xms3072M -Xmx3072M -Xmn2048M -Xss1M -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M
    

(2):

  • 一般系統里的@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的對象進入老年代,觸發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): 優化思路

  • 1、盡可能讓對象在新生代里分配和回收,避免對象頻繁進入老年代導致老年代頻繁垃圾回收;
  • 2、給系統充足的內存空間,避免新生代頻繁的垃圾回收;
  • 3、指定合適的垃圾收集器;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/717316.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/717316.shtml
英文地址,請注明出處:http://en.pswp.cn/news/717316.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Cloud Gateway-系統保護Sentinel集成

文章目錄 Sentinel介紹Spring Cloud Gateway集成Sentinelpom依賴Sentinel配置Sentinel集成Nacos作為數據源自定義降級響應 Sentinel介紹 ? 隨著微服務的流行,服務和服務之間的穩定性變得越來越重要。Sentinel 是面向分布式、多語言異構化服務架構的流量治理組件&a…

HTML5:七天學會基礎動畫網頁6

CSS3自定義字體 ①:首先需要下載所需字體 ②:把下載字體文件放入 font文件夾里,建議font文件夾與 css 和 image文件夾平級 ③:引入字體,可直接在html文件里用font-face引入字體,分別是字體名字和路徑 例…

Django官網項目

項目準備 使用VSCODE做IDE。 檢查Python版本。 sudo apt install sudo apt update python3 --version創建項目路徑,創建虛擬環境,創建項目 路徑 \mysite 進入路徑,運行VSCODE 運行 "code ." 創建虛擬環境。 選擇 >python: c…

【推薦算法系列十七】:GBDT+LR 排序算法

排序算法經典中的經典 參考 推薦系統之GBDTLR 極客時間 手把手帶你搭建推薦系統 課程 邏輯回歸(LR)模型 邏輯回歸(LR,Logistic Regression)是一種傳統機器學習分類模型,也是一種比較重要的非線性回歸模型&#xff…

AAAI2024-分享若干篇有代碼的優秀論文-圖神經網絡、時間序列預測、知識圖譜、大模型等

圖神經網絡、大模型優化方向系列文章目錄 為了方便大家根據自己的興趣查看自己的研究方向論文,在這里進行了細分。如果有對其中的論文感興趣的,可以查看對應的文章在論文相應的代碼,方便快速上手學習,也可以借助這些代碼的學習快…

16 Educational Codeforces Round 142 (Rated for Div. 2)C. Min Max Sort(遞歸、思維、dp)

C. Min Max Sort 很不錯的一道題目,不過腦電波和出題人每對上, q w q 。 qwq。 qwq。 正難則反。 我們考慮最后一步是怎么操作的。 最后一步一定是對 1 1 1和 n n n進行操作 那么上一步呢? 上一步應該是對 2 2 2和 n ? 1 n-1 n?1 以此類推…

AMD“高級洞察”系列揭示Epyc Naples和Rome原型CPU早期無法啟動問題

AMD在其新的YouTube視頻系列《高級洞察》第一集中,由AMD首席技術官Mark Papermaster擔任主持人,討論了AMD在數據中心領域的突破性進展及其持續增長。然而,AMD在服務器業務的發展并非一帆風順,兩位高管公開討論了早期Epyc Naples和…

【Python】環境管理怎么選擇【virtualenv】【pipenv】【 poetry】【 conda】

前言 剛入門Python,看到PyCharm的環境管理選擇有好幾個選擇,分別是virtualenv、pipenv、venv、conda,只知道這些都可以用來管理Python環境的,但不知道這些環境有什么區別,所以,本文將對這些環境管理進行總…

Avalonia學習(二十九)-儀表

Avalonia制作儀表盤&#xff0c;把控件給大家演示一下&#xff0c;Avalonia有三類自定義控件&#xff0c;分別是用戶控件、模版控件、自主控件。前面已經很多用戶控件了&#xff0c;這個是演示模版控件&#xff0c;另外一種不知道哪種情況下使用。 前端代碼&#xff1a; <…

想從事數據方向職場小白看過來, 數據方面的一些英文解釋

想從事數據方向職場小白看過來&#xff0c;一些英文名詞解釋 文章目錄 想從事數據方向職場小白看過來&#xff0c;一些英文名詞解釋 英文類解釋NoSQL&#xff1a;ESB&#xff1a;ACID &#xff1a;Data Vault&#xff1a;MDM&#xff1a;OLAP&#xff1a;SCD:SBA&#xff1a;MP…

【Django】執行查詢——比較、刪除、復制、批量修改對象

以下述模型為基礎&#xff0c;討論檢索對象的方式方法&#xff1a; from datetime import datefrom django.db import modelsclass Blog(models.Model):name models.CharField(max_length100)tagline models.TextField()def __str__(self):return self.nameclass Author(mod…

【vue】v-if、v-show、v-for 相關所有面試題總結

v-if 和 v-show 的區別 兩個重點【dom】和【生命周期】 v-if 惰性指令&#xff0c;false 不會被編譯、渲染不會存在 DOM 中切換開銷大&#xff0c;需要重新創建元素值變化&#xff0c;使用 v-if 的組件生命周期執行順序 true 變為 false【組件的銷毀】 beforeDestroy / befor…

[Flutter]shared_preferences基本用法以及可視化管理存儲的key和value類型

shared_preferences 是一個Flutter插件&#xff0c;它提供了一種簡單的方式來在應用程序中存儲和獲取持久化的鍵值對數據。它可以用于存儲應用程序的配置信息、用戶偏好設置、登錄狀態等。 使用 shared_preferences 插件&#xff0c;你可以在應用程序中輕松地保存和讀取數據&a…

Java中線程相關的知識

創建子線程的三種方式: 1.自定義線程任務類繼承線程類&#xff0c;以便繼承其功能,重寫其run方法(里面寫自己需要實現的功能)&#xff0c;在main方法調用時創建其任務類實例化對象&#xff0c;然后調用對象的start方法(繼承自父類)&#xff0c;即成功創建線程 優點:創建方式簡…

Pandas DataFrame 基本操作實例100個

Pandas 是一個基于NumPy的數據分析模塊&#xff0c;最初由AQR Capital Management于2008年4月開發&#xff0c;并于2009年底開源。Pandas的名稱來源于“Panel Data”&#xff08;面板數據&#xff09;和“Python數據分析”&#xff08;data analysis&#xff09;。這個庫現在由…

來不及了!大學必須完成的四件事!

老師們常說&#xff0c;上大學就輕松了 其實不然 大學不是人生的終點&#xff0c;而是新的起跑線 不是休息站&#xff0c;而是進入社會的最后沖刺跑道 大學生活苦樂參半&#xff0c;成人世界即將來臨 出了校門&#xff0c;你會發現社會復雜多變&#xff0c;需要不斷學習 稍…

excel中如何使用VLOOKUP和EXACT函數實現區分大小寫匹配數據

在 Excel 中&#xff0c;VLOOKUP 函數默認情況下是不區分大小寫的&#xff1a; 比如下面的案例&#xff0c;直接使用VLOOKUP函數搜索&#xff0c;只會搜索匹配到不區分大小寫的第一個 如果我們想要實現區分大小寫的精確匹配&#xff0c;可以使用 EXACT 函數結合 VLOOKUP 函數 …

【簡說八股】Redisson的守護線程是怎么實現的

Redisson Redisson 是一個 Java 語言實現的 Redis SDK 客戶端&#xff0c;在使用分布式鎖時&#xff0c;它就采用了「自動續期」的方案來避免鎖過期&#xff0c;這個守護線程我們一般也把它叫做「看門狗」線程。 Redission是一個在Java環境中使用的開源的分布式緩存和分布式鎖實…

PyTorch-卷積神經網絡

卷積神經網絡 基本結構 首先解釋一下什么是卷積&#xff0c;這個卷積當然不是數學上的卷積&#xff0c;這里的卷積其實表示的是一個三維的權重&#xff0c;這么解釋起來可能不太理解&#xff0c;我們先看看卷積網絡的基本結構。 通過上面的圖我們清楚地了解到卷積網絡和一般網…

【Javascript】設計模式之發布訂閱模式

文章目錄 1、現實中的發布&#xff0d;訂閱模式2、DOM 事件3、簡單的發布-訂閱模式4、通用的發布-訂閱模式5、先發布再訂閱6、小結 發布—訂閱模式又叫觀察者模式&#xff0c;它定義對象間的一種一對多的依賴關系&#xff0c;當一個對象的狀態發生改變時&#xff0c;所有依賴于…