日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jconsole工具检测堆内存变化

發布時間:2024/4/13 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jconsole工具检测堆内存变化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
關于垃圾回收機制講的都是比較底層了,你們有沒有用Jmeter經過實戰測試過沒有,這個下去多練習,通過Jmeter去測試參數的調優,你測百度是不準的,因為他有很多限制的,這個不準其實,一般真正測試是怎么測試呢,這個測試跟你電腦有關系,我的電腦請求可能稍微慢一點,很難測試出來的,像我們之前的時候,我就看別人去做一下測試,別人都是特別清楚的,你的服務器是多少G的,是單核還是雙核,目前它的堆內存大小是多少,后臺有個工具直接檢測出來的,比如你測之前肯定能夠實時知道你當前堆內存是多少,達到多少是會堆內存溢出的,我們都是通過工具可以檢測出來的,這是我們今天要講的兩個工具,第一個工具叫做jconsole,還有一種叫做visual VM,這兩個工具都是針對于什么,對JVM性能做一個監控,比如最基本的,堆內存多少,包括你當前加載多少個類啊,包括對你系統的分析,可視化界面的,通過一些命令查,那命令很少用到,你知道有那幾個命令就行了,但是我就不講了,我就講在公司里比較實用的,基本上都是通過控制臺分析的,記不記得我當時給你們說過一個問題,當初說了什么問題,死鎖是通過什么工具進行診斷出來的,我當時說過這個問題吧,等一會我通過這個工具給大家演示一下,我們寫段代碼有個死鎖現象,通過jconsole,給大家演示一下,死鎖的一個診斷,但是他不能夠幫你解決,代碼哪一行出現死鎖現象,還給你們講一下,比如今后您們到大一點的公司,或者你們自己開公司,你們要知道,很多人訪問比較慢,我會告訴大家,訪問慢的原因,不是我們服務器的原因,調用別人第三方的接口,因為他們看視頻卡的原因,卡不卡和我沒關系,我沒辦法解決,很多人以為是我沒有解決好,跟我沒關系,為什么呢,像阿里云,一般賣視頻軟件的,平均下來都是8毛一個G,我4毛一個G就是便宜一半的錢了,如果按照目前來說,用大概5,6千的,只要花2,3千塊錢,如果換成阿里云比較好的提供商的話,費用至少提高了幾倍,2倍以上,所以這個卡的原因,沒任何影響,你們有沒有發現,像我們在初創階段,我們沒有去測試高并發量有多少,但是關于網站安全的都是做了防御的,包括腳本注入的問題都是做過的,一般來說,為什么要講到這個呢,如果你自己想創建公司的時候,想做一個比較好的系統,這個時候我可以告訴大家,你們在上線之前,一般都會做壓力測試的,你們都聽說過壓力測試的吧,如果自己開公司想測一下并發量,想測一下我的性能有多好,或者是什么呢,你們今后如果進互聯網公司,他一般在項目上線之前,做個壓力測試,比如測一下我的網站的性能,到底能夠達到多少,他首先會準備一個測試服務器,在這個時候我們就給你講一下,個人能力只是把你的業務能力提升,個人能力取決于你自己本身的一個專研,讓你們知道知識點,一般在做壓力測試的時候,怎么測試的,準備一臺測試服務器,但是大家要記住,測試服務器和生產服務器是相同的,為什么要相同啊,我們來講一下,如果你搞得不同的情況下,導致測試的情況你在生產環境是不一樣的,所以一般情況下,絕大多數在做壓力測試的時候,測試環境的測試和生產環境一般來說都是相同的,比如說在正常情況下,像生產環境的服務器,基本上都是8個G,有的公司默認是配置4個G,可能有些會調到8個G,但是一般來說,一般會大于一半的內存,服務器在8個G,因為有些項目他比較小,正常情況下如果你的服務器,如果是tomcat服務器的話,只裝tomcat的情況下,內存可能就和你的內存就是相同的,這是大家要區分的一個概念,我給你們說配置一半是什么意思呢,一般來說正常情況下,都先配一半的,因為有一半會給其他的應用程序,會占內存,如果你們把內存全部配置給JVM的話,導致其他的程序不能夠申請內存了,一般像大的公司,要么TOMCAT是tomcat的服務器,要么就是數據庫服務器,每個服務器之間是互不影響的,不是在單個服務器上面,這個時候服務器的配置是8個G的,他的8G內存,他的JVM最大堆內存大小,就是為8個G,但是最終原因是什么,取決于項目,這個不完全是規定出來的,就是你們在做壓力測試之前,都會怎么樣呢,應用程序占內存,我明明是4個G,但是我們查出來只有3.8G左右,你配置4個G是沒關系的,他最終申請的時候,你設置大點總比設置小點好嗎,有一部分確實是被其他程序占用,但是這個內存占用具體占多少,這個也不好說是不是,配大點總比配小點有好處的,是不是這樣的,這個大家知道就行了,不要太糾結于這些,那這個時候我就和你們說一下,我要講一下什么呢,一般在生產環境里面的時候,他如果要去調優的時候,怎么調優呢,會怎么樣呢,會寫一個測試報告,有的地方有另外一種叫法,叫性能檢測報告,尤其大家去一些比較大的公司,性能檢測報告,這是什么意思呢,這是我們在后面有一個專題,這個專題講什么呢,講互聯網安全架構,我們專門講互聯網架構,互聯網安全架構的時候,其實性能檢測報告其實也包含了安全的,比如我們通過一些掃描工具,檢測你的代碼哪里寫的有問題,通過一些基本的語法去判斷,掃描一下哪些代碼是有缺陷的,找出來,但是基本的都是通過腳本注入,SQL注入的問題,所以這些都是測試做的,但是為什么要講呢,如果去做架構師的時候,聊到安全的時候,能夠聊得非常深,從最基本的安全架構原理,去訪問最基本的安全,一般是有測試人員去安排好的,他們會有專門的測試工具,做壓力測試的,做壓力測試的時候,他們自己會寫個測試報告,一般以吞吐量為標準,來進行請求響應,就是他們請求響應的時候,首先給你們講一下,客戶端去模擬的時候,他也會做報告記錄的,客戶端模擬也會取決網絡傳輸的,你可能在局域網做通訊的時候,可能往往會比外網要快,所以一般在局域網測試的時候,他只測個大概,如果你局域網達到這個也掛,我們之前的那個項目,能夠達到7,8千,其實那個很假,正常項目里面,代碼是非常復雜的,不可能吞吐量7,8千的,很少很少,除非你的服務器非常好,所以當時我們寫那個項目,代碼本身來說要查很多資源的,所以當時的吞吐量是2,3千,到了2,3千之后,內存滿了的情況下,會導致雪崩效應,其他服務器就全部訪問不了了,別人一般訪問的時候,還有基本的防御系統,網關,你們可以把雪崩效應理解為不斷的去請求,你就可以這樣理解就行了,就表示服務器訪問不了了,掛了,你們可以先這么去理解,我會專門取講的,熔斷策略,不是特別高達上的東西,網關系統,它會做安全處理,包括權限處理,它會預測一下,比如我明天做活動的時候,會突破一百萬的訪問量,那我會在專門做測試的時候,我至少要能達到一百萬,能夠不掛就行了,如果達到100萬掛了,你要做優化,一般通過代碼到服務器層面,基本的高并發解決方案,高并發解決方案其實蠻多,不光是在服務器層面的,在代碼層面,在數據庫層面,還有可能在整個網站架構層面,這是我會詳細講到的高并發解決方案,壓力測試其實也是相當于做一個高并發的測試,但是壓力測試往往不會特別精準,壓力測試往往是一個人在做請求,不可能是很多電腦去請求,所以他不一樣的,一般公司在做壓力測試的時候,最基本的,要寫個測試報告的,它會通過這個報告基本的預測一下,最高峰能夠達到多少,模擬請求,DOS,XXS,上傳漏洞,這些大家不要擔心,就是別人都會有防御的,最基本的請求,公網IP只有一個,偽造IP要改請求,那個是比較麻煩的,我們有沒有到過12306網站,他其實不是通過偽造IP去解決高并發的,其實你會發現,像我去搶的時候,大概4,5百個員工用同一個IP去搶票,整個公司都不能搶票了,大家都用了同一個IP地址,所以搶不了了,根本搶不了了,所以我們會有一些第三方的軟件,因為它會把請求交給第三方,通過第三方搶票軟件,他會到12306上去做了一個搶票的功能,他可能會買了很多服務器,給你做模擬搶票,我會講互聯網安全架構,企業黑名單白名單啊,檢測報告一般不是你們寫的,一般是測試人員寫的,它會告訴開發審核一下,項目經理才會知道,我的服務器達到多少的時候會怎么怎么樣 在這里講兩個可視化的工具,一個叫jconsole,還有一個叫visual VM,這個是專門做JVM棧和堆的檢測的,包括還有死鎖現象,都會檢測出來的,這個時候我給你們講一下,jconsole是干嘛用的呢,你們有沒有了解過jps,jmap,這些命令其實也是檢測jvm的性能的一些指令,一些語句,但是這個東西用起來會比較麻煩,你們可能也用過,我打開cmd,我輸入jps,他主要是什么目的啊,我在這邊演示一把,jps的命令相當于怎么樣呢,我能夠去讀到,有多少JAVA程序在運行的

比如我先做用002程序,其實他是死鎖現象,我就不去說死鎖現象,你們看一下,我把它運行一下的時候,你就可以找到Test002

以后也是用可視化工具去查的,jconsole怎么用呢,他其實是一個可視化命令的,如果你們之前的時候,在你們安裝JDK目錄,這個軟件是JDK自帶的,在哪個目錄呢,在JDK安裝目錄的bin文件夾里面,雙擊jconsole就行了,這個時候大家就可以去看一下,怎么連呢,雙擊一下jconsole.exe,而且他還有一個特別高大上的一個功能,他可以直接遠程連接哪個服務器,你要知道生產環境的服務器是linxu版本的,可以直接聯系到生產環境的jvm信息,為什么這里會顯示兩個,第一個是jconsole本來就是一個java程序,我再來講一下,這個jconsole主要是做什么目的呢,只要是java寫的應用程序,他都是可以監控到的 package com.learn.test;public class Test006 {static Object o1 = new Object();static Object o2 = new Object();public static void main(String[] args) {new Thread(new Runnable() {public void run() {synchronized (o1) {System.out.println("線程1鎖o1");try {Thread.sleep(1000);//讓當前線程睡眠,保證讓另一線程得到o2,防止這個線程啟動一下連續獲得o1和o2兩個對象的鎖。synchronized (o2) {System.out.println("線程1鎖o2");}} catch (InterruptedException e) { e.printStackTrace();}}}}).start();new Thread(new Runnable() {public void run() {synchronized (o2) {System.out.println("線程2鎖o2");synchronized (o1) {System.out.println("線程2鎖o1");}}}}).start();}}

他這邊你們可以不去連接SSL,因為我們沒有這個證書,就用不安全連接進行連接,這個時候他就會展示一個界面

這個界面你們可以看到,為什么說他比較占內存呢,因為它很多數據都是實時的,他后臺需要實時讀取新數據,肯定是比較耗內存的,就好比我現在寫一個while循環,一直去刷新數據的情況下,是比較占內存的,所以不要太去糾結這個軟件占不占內存,只要這個軟件實用就行了,他這里會顯示你這個堆的使用信息,我們現在已經使用了21M,最大40M,你們有沒有印象我之前是怎么講的,一般默認是4個G,但是我們查的時候只有3.8G左右,可能還有0.2G被其他程序給占用了,所以記住啊,這個值大致相同,你也可以看到我們的堆內存發生變化,都是實時監控的,比如我可以知道這個程序去年的情況是怎么樣,都可以知道的,你比如這個時候我講一下,如果是在做壓力測試的時候,怎么做呢,別人在做壓力測試,你要看一下你堆內存的情況,然后看到一些變化,CPU的占用情況,以及線程數,你們待會就知道了,我們不光是GC線程,還有很多很多線程,至少10幾個線程,這里線程非常多,但是大家知道一個概念就行了,你們如果有興趣,如果你們的程序跑的非常長的時間的話,可以看看一年之前的變化,一個月之前的,我這個因為是2我當前的電腦,我們可以看看12個小時的變化,你們發現問題沒有,這個堆內存是不是一直在變高,你們看到變化沒有,是不是一直在增高,他可以監控TOMCAT,都是可以監控的,這都是沒問題的,你看它是一直在增高,為什么呢,因為我這個程序是一個死循環,不過現在已經死鎖了,你們可以去查一下內存變化

主要查的是堆內存,這些東西是不是我都講過的,新生代,這是什么,在堆內存里面是不是有一個eden區,from區和to區,我們也可以去分析到eden區的內存發生變化

你們發現沒有,這個eden區,我們可以看一個變化好嗎,堆內存大致是55M,接著我們看一下eden區里面的,eden區大概是使用了10M,那我給你們講一下,還有相差40M在哪個地方呢,你們有沒有發現from區和to區沒數據啊

這個其實就是展示from區和to區的,根本就沒數據的,為什么呢,因為垃圾回收機制只有在5,6次之后才會到S0區,或者S1區,但是如果進入到老年代看一下,至少要達到15次之后

這個程序沒有定義非常大的內存的,反正這個大體我給你們說一下,這里面已經查到非堆內存,你們知道非堆內存是什么嗎,你們有沒有誰知道,堆內存指的是什么,我之前講過的,不知道你們有沒有聽說過,一般非堆內存是指方法區的內存

當前有多少個類,你們看一下,加載的類總數4020個,已加載4020個,你們有沒有發現一個問題,我們這個程序怎么可能加載這么多類呢,你們沒有發現問題嗎,我們這么簡單一個程序,加載這么多類呢,記住我們的項目都是引用了JDK的,他可能有一些類是被JDK所占用的,而且講一下,你們以后整合到Spring的,或者整合一些常用框架的,1千都不算什么,有幾萬個的,我們之前項目一個萬多個類,一個jar包就是幾百個,我們的項目至少有40,50個jar包,有的jar已經達到上千個了,所以4000個還好,我之前的項目是1萬多,默認就是占用1千5百左右,因為項目比較大的時候表都有100多個,這個我就不細說了,這里又基本的信息,連接的名稱

這是虛擬機版本信息,供應商是ORACLE公司,然后運行時間是44分鐘時間,進程CPU時間是1分鐘左右,總編譯時間是37.9秒,活動線程是34,峰值40個,守護線程28個,線程總數92個,有人說我們怎么可能這么多個,你不會發現有問題嗎,我們怎么會有這么多線程的,不光是GC線程

不只是GC線程,默認的幾個,待會會看一下的,我們待會進入項目測一下,應用程序不光有GC線程,RMI線程特別特別多,當前版本是GBK版本的,庫的基本的地址,引導類的地址,總物理內存有多少,當前已加載4020個了,你們如果想遠程的話,去監聽的,除非你通過命令查,命令查特別痛苦,所以一般是遠程連接生產服務器,查一下內存變化,尤其是測試做聯調的時候,我要知道那一秒內存達到峰值,整個堆內存發生變化

?

總結

以上是生活随笔為你收集整理的jconsole工具检测堆内存变化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。