一文詳解java中對JVM的深度解析、調優工具、垃圾回收

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

jvm監控分析工具一般分為兩類,一種是jdk自帶的工具,一種是第三方的分析工具。jdk自帶工具一般在jdk bin目錄下面,以exe的形式直接點擊就可以使用,其中包含分析工具已經很強大,幾乎涉及了方方面面,但是我們最常使用的只有兩款:jconsole.exe和jvisualvm.exe;第三方的分析工具有很多,各自的側重點不同,比較有代表性的:MAT(Memory Analyzer Tool)、GChisto等。

jconsole

Jconsole(Java Monitoring and Management Console)是從java5開始,在JDK中自帶的java監控和管理控制臺,用于對JVM中內存,線程和類等的監控,是一個基于JMX(java management extensions)的GUI性能監測工具。jconsole使用jvm的擴展機制獲取并展示虛擬機中運行的應用程序的性能和資源消耗等信息。

直接在jdk/bin目錄下點擊jconsole.exe即可啟動,界面如下:

在彈出的框中可以選擇本機的監控本機的java應用,也可以選擇遠程的java服務來監控,如果監控遠程服務需要在tomcat啟動腳本中添加如下代碼:

-Dcom.sun.management.jmxremote.port=6969 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false

連接進去之后,就可以看到jconsole概覽圖和主要的功能:概述、內存、線程、類、VM、MBeans

  • 概述,以圖表的方式顯示出堆內存使用量,活動線程數,已加載的類,CUP占用率的折線圖,可以非常清晰的觀察在程序執行過程中的變動情況。

  • 內存,主要展示了內存的使用情況,同時可以查看堆和非堆內存的變化值對比,也可以點擊執行GC來處罰GC的執行

  • 線程,主界面展示線程數的活動數和峰值,同時點擊左下方線程可以查看線程的詳細信息,比如線程的狀態是什么,堆棧內容等,同時也可以點擊“檢測死鎖”來檢查線程之間是否有死鎖的情況。

  • 類,主要展示已加載類的相關信息。
  • VM 概要,展示JVM所有信息總覽,包括基本信息、線程相關、堆相關、操作系統、VM參數等。
  • Mbean,查看Mbean的屬性,方法等。

VisualVM

簡介

VisualVM 是一個工具,它提供了一個可視界面,用于查看 Java 虛擬機 (Java Virtual Machine, JVM) 上運行的基于 Java 技術的應用程序(Java 應用程序)的詳細信息。VisualVM 對 Java Development Kit (JDK) 工具所檢索的 JVM 軟件相關數據進行組織,并通過一種使您可以快速查看有關多個 Java 應用程序的數據的方式提供該信息。您可以查看本地應用程序以及遠程主機上運行的應用程序的相關數據。此外,還可以捕獲有關 JVM 軟件實例的數據,并將該數據保存到本地系統,以供后期查看或與其他用戶共享。

VisualVM 是javajdk自帶的最牛逼的調優工具了吧,也是我平時使用最多調優工具,幾乎涉及了jvm調優的方方面面。同樣是在jdk/bin目錄下面雙擊jvisualvm.exe既可使用,啟動起來后和jconsole 一樣同樣可以選擇本地和遠程,如果需要監控遠程同樣需要配置相關參數,主界面如下;

VisualVM可以根據需要安裝不同的插件,每個插件的關注點都不同,有的主要監控GC,有的主要監控內存,有的監控線程等。

如何安裝:

1、從主菜單中選擇“工具”>“插件”。

2、在“可用插件”標簽中,選中該插件的“安裝”復選框。單擊“安裝”。

3、逐步完成插件安裝程序。

大家可能在這里會遇到安裝不了的坑!!!!

解決:首先用瀏覽器瀏覽:?https://visualvm.github.io/pluginscenters.html

其次從中找到自己的版本,我的是jdk1.8版本,我選擇了第二個,復制它的地址

復制地址到上面的url中,就可以去查看可用插件進行下載了

這里以IntelliJ Platform (pid 15784)為例,雙擊后直接展開,主界面展示了系統和jvm兩大塊內容,點擊右下方jvm參數和系統屬性可以參考詳細的參數信息.

因為VisualVM的插件太多,我這里主要介紹三個我主要使用幾個:監控、線程、Visual GC

監控的主頁其實也就是,cpu、內存、類、線程的圖表

線程和jconsole功能沒有太大的區別

Visual GC 是常常使用的一個功能,可以明顯的看到年輕代、老年代的內存變化,以及gc頻率、gc的時間等。

以上的功能其實jconsole幾乎也有,VisualVM更全面更直觀一些,另外VisualVM非常多的其它功能,可以分析dump的內存快照,dump出來的線程快照并且進行分析等,還有其它很多的插件大家可以去探索

JVM垃圾回收

JVM的新生代分為三個區域,一個Eden區和兩個Survivor區,它們之間的比例為(8:1:1),這個比例也是可以修改的。通常情況下,對象主要分配在新生代的Eden區上,少數情況下也可能會直接分配在老年代中。Java虛擬機每次使用新生代中的Eden和其中一塊Survivor(From),在經過一次Minor GC后,將Eden和Survivor中還存活的對象一次性地復制到另一塊Survivor空間上(這里使用的復制算法進行GC),最后清理掉Eden和剛才用過的Survivor(From)空間。將此時在Survivor空間存活下來的對象的年齡設置為1,以后這些對象每在Survivor區熬過一次GC,它們的年齡就加1,當對象年齡達到某個年齡(默認值為15)時,就會把它們移到老年代中。

在新生代中進行GC時,有可能遇到另外一塊Survivor空間沒有足夠空間存放上一次新生代收集下來的存活對象,這些對象將直接通過分配擔保機制進入老年代;

1. 新生代(Young Generation):也有叫做年輕代的,這里使用《深入理解JAVA虛擬機》中的叫法,下同。

其實看名稱就能看出一些,一般情況下,新創建的對象都會存放到新生代中(大對象除外)。

新生代中對象的特點是:很快就會被GC回收掉的或者不是特別大的對象。

為了方便垃圾收集,新生代又分出了一個Eden區,兩個 Survivor區。

JVM 每次只會使用 Eden區 和其中的一塊 Survivor 區域來為對象服務,另一塊Survivor區域是空的,用于垃圾回收。

舉個例子,第一次回收的時候,虛擬機會將 Eden區+Survivor(from)區域的存活對象復制到Survivor(to)上(存活對象小于Survivor(to)的空間),清空Survivor(from),虛擬機使用Eden區+Survivor(to);

第二次回收的時候,虛擬機再將Eden區+Survivor(to)存活的對象復制到Survivor(from)。

這三個區域默認情況下是按照8:1:1分配,也可以手動配置。

2.?Eden區

Eden區位于Java堆的新生代,是新對象分配內存的地方,由于堆是所有線程共享的,因此在堆上分配內存需要加鎖。而Sun JDK為提升效率,會為每個新建的線程在Eden上分配一塊獨立的空間由該線程獨享,這塊空間稱為TLAB(Thread Local Allocation Buffer)。在TLAB上分配內存不需要加鎖,因此JVM在給線程中的對象分配內存時會盡量在TLAB上分配。如果對象過大或TLAB用完,則仍然在堆上進行分配。如果Eden區內存也用完了,則會進行一次Minor GC(young GC)。

3.Survival from to

Survival區與Eden區相同都在Java堆的年輕代。Survival區有兩塊,一塊稱為from區,另一塊為to區,這兩個區是相對的,在發生一次Minor GC后,from區就會和to區互換。在發生Minor GC時,Eden區和Survivalfrom區會把一些仍然存活的對象復制進Survival to區,并清除內存。Survival to區會把一些存活得足夠舊的對象移至年老代。

4. 老年代(Old Generation):在新生代每進行一次垃圾收集后,就會給存活的對象“加1歲”,當年齡達到一定數量的時候就會進入老年代(默認是15,可以通過-XX:MaxTenuringThreshold來設置)。

另外,比較大的對象也會進入老年代,可以-XX:PretenureSizeThreshold進行設置。

如-XX:PretenureSizeThreshold3M,那么大于3M的對象就會直接就進入老年代。

因此,老年代中存放的都是一些生命周期較長的對象或者特別大的對象。

5. 永久代(Permanent Generation ):即JVM的方法區。在這里存放著一些被虛擬機加載的類信息(別忘了還有動態生成的類)的靜態文件,這就導致了這個區中的東西比老年代和新生代更不容易回收。

永久代大小通過-XX:MaxPermSize=<N>進行設置。

6. 元空間(Metaspace):從JDK 8開始,Java開始使用元空間取代永久代,元空間并不在虛擬機中,而是直接使用本地內存。

那么,默認情況下,元空間的大小僅受本地內存限制。當然,也可以對元空間的大小手動的配置。

JVM常見的垃圾回收機制

Minor GC

Minor GC指新生代GC,即發生在新生代(包括Eden區和Survivor區)的垃圾回收操作,當新生代無法為新生對象分配內存空間的時候,會觸發Minor GC。因為新生代中大多數對象的生命周期都很短,所以發生Minor GC的頻率很高,雖然它會觸發stop-the-world,但是它的回收速度很快。

Major GC

Major GC清理Tenured區,用于回收老年代,出現Major GC通常會出現至少一次Minor GC。

Full GC

Full GC是針對整個新生代、老生代、元空間(metaspace,java8以上版本取代perm gen)的全局范圍的GC。Full GC不等于Major GC,也不等于Minor GC+Major GC,發生Full GC需要看使用了什么垃圾收集器組合,才能解釋是什么樣的垃圾回收。

復制算法:

將區域分成兩部分,其中一部分作為保留空間,另一部分作為使用空間、當發生?垃圾回收?時,首先檢查使用空間里有哪些對象是存活的,檢查完之后把存活的對象復制到保留空間(這樣復制過來的好處是減少了內存碎片,如果直接在使用空間清除的話,那空間會很零散)里,然后清洗使用空間。

Survivor的存在意義,就是減少被送到老年代的對象,進而減少Full GC的發生,Survivor的預篩選保證,只有經歷(默認)15次Minor GC還能在新生代中存活的對象,才會被送到老年代。

為什么要設置兩個Survivor區

設置兩個Survivor區最大的好處就是解決了碎片化?,下面我們來分析一下。

為什么一個Survivor區不行?第一部分中,我們知道了必須設置Survivor區。假設現在只有一個survivor區,我們來模擬一下流程:

剛剛新建的對象在Eden中,一旦Eden滿了,觸發一次Minor GC,Eden中的存活對象就會被移動到Survivor區。這樣繼續循環下去,下一次Eden滿了的時候,問題來了,此時進行Minor GC,Eden和Survivor各有一些存活對象,如果此時把Eden區的存活對象硬放到Survivor區,很明顯這兩部分對象所占有的內存是不連續的,也就導致了內存碎片化。?

我繪制了一幅圖來表明這個過程。其中色塊代表對象,白色框分別代表Eden區(大)和Survivor區(小)。Eden區理所當然大一些,否則新建對象很快就導致Eden區滿,進而觸發Minor GC,有悖于初衷。?

在此我向大家推薦一個架構學習交流群。交流學習群號:821169538 ?里面會分享一些資深架構師錄制的視頻錄像:有Spring,MyBatis,Netty源碼分析,高并發、高性能、分布式、微服務架構的原理,JVM性能優化、分布式架構等這些成為架構師必備的知識體系。還能領取免費的學習資源,目前受益良多。

碎片化帶來的風險是極大的,嚴重影響JAVA程序的性能。堆空間被散布的對象占據不連續的內存,最直接的結果就是,堆中沒有足夠大的連續內存空間,接下去如果程序需要給一個內存需求很大的對象分配內存。。。畫面太美不敢看。。。這就好比我們爬山的時候,背包里所有東西緊挨著放,最后就可能省出一塊完整的空間放相機。如果每件行李之間隔一點空隙亂放,很可能最后就要一路把相機掛在脖子上了。

那么,順理成章的,應該建立兩塊Survivor區,剛剛新建的對象在Eden中,經歷一次Minor GC,Eden中的存活對象就會被移動到第一塊survivor space S0,Eden被清空;等Eden區再滿了,就再觸發一次Minor GC,Eden和S0中的存活對象又會被復制送入第二塊survivor space S1(這個過程非常重要,因為這種復制算法保證了S1中來自S0和Eden兩部分的存活對象占用連續的內存空間,避免了碎片化的發生)。S0和Eden被清空,然后下一輪S0與S1交換角色,如此循環往復。如果對象的復制次數達到16次,該對象就會被送到老年代中。下圖中每部分的意義和上一張圖一樣,就不加注釋了。

上述機制最大的好處就是,整個過程中,永遠有一個survivor space是空的,另一個非空的survivor space無碎片。

轉載于:https://my.oschina.net/u/3972077/blog/2243643

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

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

相關文章

借用繼承_博物館正在數字化,并在此過程中從數據中借用

借用繼承Data visualization is a great way to celebrate our favorite pieces of art as well as reveal connections and ideas that were previously invisible. More importantly, it’s a fun way to connect things we love — visualizing data and kicking up our fee…

高斯噪聲,椒鹽噪聲的思想及多種噪聲的實現

圖像噪聲&#xff1a; 概念&#xff1a; ? 圖像噪聲是圖像在獲取或是傳輸過程中受到隨機信號干擾&#xff0c;妨礙人們對圖像理解及分析處理 的信號。 ? 很多時候將圖像噪聲看做多維隨機過程&#xff0c;因而描述噪聲的方法完全可以借用隨機過程的描述&#xff0c; 也就是使…

bzoj1095 [ZJOI2007]Hide 捉迷藏

據說是道很厲害的題。。。。黃學長的安利啊。。。。 然而我卻用它學分治。。。。 一個坑就擺在這里了。。。。 轉載于:https://www.cnblogs.com/LLppdd/p/9124394.html

如何識別媒體偏見_描述性語言理解,以識別文本中的潛在偏見

如何識別媒體偏見TGumGum can do to bring change by utilizing our Natural Language Processing technology to shed light on potential bias that websites may have in their content. The ideas and techniques shared in this blog are a result of the GumGum Hackatho…

分享 : 警惕MySQL運維陷阱:基于MyCat的偽分布式架構

分布式數據庫已經進入了全面快速發展階段。這種發展是與時俱進的&#xff0c;與人的需求分不開&#xff0c;因為現在信息時代的高速發展&#xff0c;導致數據量和交易量越來越大。這種現象首先導致的就是存儲瓶頸&#xff0c;因為MySQL數據庫實質上還是一個單機版本的數據庫&am…

opencv:圖像讀取BGR變成RGB

opencv大坑之BGR opencv對于讀進來的圖片的通道排列是BGR&#xff0c;而不是主流的RGB&#xff01;謹記&#xff01; #opencv讀入的矩陣是BGR&#xff0c;如果想轉為RGB&#xff0c;可以這么轉 img cv2.imread(1.jpg) img cv2.cvtColor(img4,cv2.COLOR_BGR2RGB)

數據不平衡處理_如何處理多類不平衡數據說不可以

數據不平衡處理重點 (Top highlight)One of the common problems in Machine Learning is handling the imbalanced data, in which there is a highly disproportionate in the target classes.機器學習中的常見問題之一是處理不平衡的數據&#xff0c;其中目標類別的比例非常…

最小二乘法以及RANSAC(隨機采樣一致性)思想及實現

線性回歸–最小二乘法&#xff08;Least Square Method&#xff09; 線性回歸&#xff1a; 什么是線性回歸&#xff1f; 舉個例子&#xff0c;某商品的利潤在售價為2元、5元、10元時分別為4元、10元、20元&#xff0c; 我們很容易得出商品的利潤與售價的關系符合直線&#xf…

軟鍵盤彈起,導致底部被頂上去

計算出可視界面的高度&#xff0c;當軟鍵盤彈起時讓底部元素隱藏掉&#xff0c;當鍵盤收起時再讓它顯示&#xff0c;實在沒辦法時這種方法也不失為一種方法1 var hdocument.documentElement.clientHeight; 2 $(window).resize(function(){ 3 let heightdocument.documentEl…

關于LaaS,PaaS,SaaS一些個人的理解

關于LaaS,PaaS,SaaS一些個人的理解 關于LaaS,PaaS,SaaS一些個人的理解 其實如果從整個程序運營的角度來考慮比較好 第一個LaaS 這個也叫做Haas 就是硬件或者基礎設置即服務 比如現在的 aws azure 阿里云 騰訊云 百度云 都是提供服務器基礎設置服務的 包括服務器的硬件…

糖藥病數據集分類_使用optuna和mlflow進行心臟病分類器調整

糖藥病數據集分類背景 (Background) Data science should be an enjoyable process focused on delivering insights and real benefits. However, that enjoyment can sometimes get lost in tools and processes. Nowadays it is important for an applied data scientist to…

Android MVP 框架

為什么80%的碼農都做不了架構師&#xff1f;>>> 前言 根據網絡上的MVP套路寫了一個辣雞MVP DEMO 用到的 android studio MVPHelper插件,方便自動生成框架代碼rxjavaretrofit什么是MVP MVP就是英文的Model View Presenter&#xff0c;然而實際分包并不是只有這三個包…

相似圖像搜索的哈希算法思想及實現(差值哈希算法和均值哈希算法)

圖像相似度比較哈希算法: 什么是哈希&#xff08;Hash&#xff09;&#xff1f; ? 散列函數&#xff08;或散列算法&#xff0c;又稱哈希函數&#xff0c;英語&#xff1a;Hash Function&#xff09;是一種從任何一種數據中創建小 的數字“指紋”的方法。散列函數把消息或數…

騰訊云AI應用產品總監王磊:AI 在傳統產業的最佳實踐

歡迎大家前往騰訊云社區&#xff0c;獲取更多騰訊海量技術實踐干貨哦~ 背景&#xff1a;5月23-24日&#xff0c;以“煥啟”為主題的騰訊“云未來”峰會在廣州召開&#xff0c;廣東省各級政府機構領導、海內外業內學術專家、行業大咖及技術大牛等在現場共議云計算與數字化產業創…

標準化(Normalization)和歸一化實現

概念&#xff1a; 原因&#xff1a; 由于進行分類器或模型的建立與訓練時&#xff0c;輸入的數據范圍可能比較大&#xff0c;同時樣本中各數據可 能量綱不一致&#xff0c;這樣的數據容易對模型訓練或分類器的構建結果產生影響&#xff0c;因此需要對其進行標準 化處理&#x…

Toast源碼深度分析

目錄介紹 1.最簡單的創建方法 1.1 Toast構造方法1.2 最簡單的創建1.3 簡單改造避免重復創建1.4 為何會出現內存泄漏1.5 吐司是系統級別的 2.源碼分析 2.1 Toast(Context context)構造方法源碼分析2.2 show()方法源碼分析2.3 mParams.token windowToken是干什么用的2.4 schedul…

序列化框架MJExtension詳解 + iOS ORM框架

當開發中你的模型中屬性名稱和 字典(JSON/XML) 中的key 不能一一對應時, 或者當字典中嵌套了多層字典數組時..., 以及教你如何用 MJExtension 配置類來統一管理你的模型配置, 下面羅列了開發中常見的一些特殊情況, 請參考!(MJExtension/github) 最基本用法: // 將字典轉為模型 …

運行keras出現 FutureWarning: Passing (type, 1) or ‘1type‘ as a synonym of type is deprecated解決辦法

運行keras出現 FutureWarning: Passing (type, 1) or ‘1type’ as a synonym of type is deprecated; in a future version of numpy, 原則來說&#xff0c;沒啥影響&#xff0c;還是能運行&#xff0c;但是看著難受 解決辦法&#xff1a; 點擊藍色的鏈接&#xff1a; 進入 …

RedirectToAction()轉移方式及參數傳遞

今天在做一個功能的時&#xff0c;使用RedirectToAction()需要從這里傳幾個參數&#xff0c;從網上查了一下&#xff0c;這樣解決。真好。 Return RedirectToAction("Index","ManageInfo",new{type0,page1});轉載于:https://www.cnblogs.com/ZaraNet/p/978…

軟件項目風險管理

近幾年來軟件開發技術、工具都有了很大的進步&#xff0c;但是軟件項目開發超時、超支、甚至不能滿足用戶需求而根本沒有得到實際使用的情況仍然比比皆是。軟件項目開發和管理中一直存在著種種不確定性&#xff0c;嚴重影響著項目的順利完成和提交。但這些軟件風險并未得到充分…