亚洲精品中文免费|亚洲日韩中文字幕制服|久久精品亚洲免费|一本之道久久免费

      
      

            <dl id="hur0q"><div id="hur0q"></div></dl>

                源碼角度了解Skywalking之Skywalking是如何進(jìn)行JVM監(jiān)控的

                源碼角度了解Skywalking之Skywalking是如何進(jìn)行JVM監(jiān)控的

                源碼角度了解Skywalking之Skywalking是如何進(jìn)行JVM監(jiān)控的

                大家都知道Skywalking可以監(jiān)控Java的JVM情況,包括垃圾回收情況等等,那么它是怎么實(shí)現(xiàn)的呢?今天就帶大家一探究竟。

                通過前幾篇的文章我們知道,Skywalking啟動(dòng)的時(shí)候,會(huì)加載各種BootService實(shí)現(xiàn)類,而有關(guān)JVM的BootService實(shí)現(xiàn)類就是JVMService

                JVMService

                JVMService可以看做一個(gè)定時(shí)器,它收集JVM cpu、內(nèi)存、內(nèi)存池和gc 信息等等參數(shù),并將收集到的信息通過GRPCChannelManager提供的通道發(fā)送給Collector,GRPCChannelManager這個(gè)類我們?cè)谏掀恼挛覀兙瓦M(jìn)行了介紹,主要是用來建立連接管理通道的

                JVMService實(shí)現(xiàn)BootService接口和Runnable接口

                我們按照調(diào)用方法的順序分析一下吧

                prepare()方法

                JVMService的prepare()方法:

                public static int BUFFER_SIZE = 60 * 10;public void prepare() throws Throwable { queue = new LinkedBlockingQueue(Config.Jvm.BUFFER_SIZE); sender = new Sender(); ServiceManager.INSTANCE.findService(GRPCChannelManager.class).addChannelListener(sender); }復(fù)制代碼

                準(zhǔn)備階段就是創(chuàng)建一個(gè)LinkedBlockingQueue類型的阻塞隊(duì)列,隊(duì)列大小為600,這個(gè)隊(duì)列保存的是JVMMetric對(duì)象,然后創(chuàng)建了一個(gè)Sender對(duì)象,找到GRPCChannelManager對(duì)象,并把Sender對(duì)象加入監(jiān)聽類中。

                boot()方法

                JVMService的boot()方法:

                public void boot() throws Throwable { collectMetricFuture = Executors .newSingleThreadScheduledExecutor(new DefaultNamedThreadFactory(“JVMService-produce”)) .scheduleAtFixedRate(new RunnableWithExceptionProtection(this, new RunnableWithExceptionProtection.CallbackWhenException() { @Override public void handle(Throwable t) { logger.error(“JVMService produces metrics failure.”, t); } }), 0, 1, TimeUnit.SECONDS); sendMetricFuture = Executors .newSingleThreadScheduledExecutor(new DefaultNamedThreadFactory(“JVMService-consume”)) .scheduleAtFixedRate(new RunnableWithExceptionProtection(sender, new RunnableWithExceptionProtection.CallbackWhenException() { @Override public void handle(Throwable t) { logger.error(“JVMService consumes and upload failure.”, t); } } ), 0, 1, TimeUnit.SECONDS); }復(fù)制代碼

                boot()方法中定義兩個(gè)定時(shí)線程池每隔一秒創(chuàng)建一個(gè)線程,一個(gè)是生產(chǎn)線程,一個(gè)是消費(fèi)線程,生產(chǎn)者邏輯對(duì)應(yīng)JVMService的run()方法,而消費(fèi)者的邏輯在Sender的run()方法中

                run()方法

                JVMService的run()方法:

                public void run() { if (RemoteDownstreamConfig.Agent.SERVICE_ID != DictionaryUtil.nullValue() && RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID != DictionaryUtil.nullValue() ) { long currentTimeMillis = System.currentTimeMillis(); try { JVMMetric.Builder jvmBuilder = JVMMetric.newBuilder(); jvmBuilder.setTime(currentTimeMillis); jvmBuilder.setCpu(CPUProvider.INSTANCE.getCpuMetric()); jvmBuilder.addAllMemory(MemoryProvider.INSTANCE.getMemoryMetricList()); jvmBuilder.addAllMemoryPool(MemoryPoolProvider.INSTANCE.getMemoryPoolMetricsList()); jvmBuilder.addAllGc(GCProvider.INSTANCE.getGCList()); JVMMetric jvmMetric = jvmBuilder.build(); if (!queue.offer(jvmMetric)) { queue.poll(); queue.offer(jvmMetric); } } catch (Exception e) { logger.error(e, “Collect JVM info fail.”); } } }復(fù)制代碼

                run()中的邏輯主要是創(chuàng)建JVMMetric對(duì)象,創(chuàng)建完成后放入隊(duì)列中,從準(zhǔn)備方法中我們知道隊(duì)列大小設(shè)置是600,當(dāng)隊(duì)列滿的時(shí)候,會(huì)取出最久的那個(gè)淘汰掉,然后放入新的JVMMetric對(duì)象到隊(duì)尾。

                從組裝JVMMetric對(duì)象的過程我們可以看到,JVMMetric對(duì)象中包含了當(dāng)前時(shí)間,CPU指標(biāo)、內(nèi)存指標(biāo)還有垃圾回收指標(biāo)。這三個(gè)指標(biāo)的獲取都是 利用枚舉實(shí)現(xiàn)的單例模式 ,然后getGCList()方法中調(diào)用了GCModule抽象類的getGCList()方法,在獲取新生代和老年代垃圾回收器名稱的時(shí)候定義了抽象方法,具體邏輯每個(gè)垃圾回收器重寫各自的抽象方法, 這是模板方法的體現(xiàn)

                Sender

                run()方法:

                Sender對(duì)象作為消費(fèi)者,它的功能就是通過drainTo()方法來把隊(duì)列中的數(shù)據(jù)轉(zhuǎn)移到buffer集合中,然后發(fā)送到Collector中。

                總結(jié)

                這篇文章我們講了Skywalking是怎么進(jìn)行JVM參數(shù)收集的,主要涉及到的類是JVMService,它的類定義了一個(gè)LinkedBlockingQueue類型的阻塞隊(duì)列,長度是600,然后啟動(dòng)方法中啟動(dòng)了兩個(gè)定時(shí)線程池創(chuàng)建了生產(chǎn)者JVMService線程和消費(fèi)者Sender線程,JVMService作為生產(chǎn)者收集CPU、內(nèi)存、垃圾回收信息等放入隊(duì)列,Sender作為消費(fèi)者從隊(duì)列獲取到所有JVM信息發(fā)送給Collector

                :heart: 感謝大家

                如果你覺得這篇內(nèi)容對(duì)你挺有有幫助的話幫忙點(diǎn)點(diǎn)關(guān)注!

                鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場(chǎng),版權(quán)歸原作者所有,如有侵權(quán)請(qǐng)聯(lián)系管理員(admin#wlmqw.com)刪除。
                用戶投稿
                上一篇 2022年6月20日 09:27
                下一篇 2022年6月20日 09:27

                相關(guān)推薦

                • 分享4條發(fā)微商朋友圈的方法(微商朋友圈應(yīng)該怎么發(fā))

                  對(duì)于微商朋友來說,朋友圈的重要性不言而喻了。 那么微商的朋友圈到底該怎么發(fā)呢? 為什么同樣是經(jīng)營一個(gè)朋友圈,有的微商看起來逼格滿滿,實(shí)際效果也不錯(cuò);而有的卻動(dòng)都不動(dòng)就被屏蔽甚至拉黑…

                  2022年11月27日
                • 30個(gè)無加盟費(fèi)的項(xiàng)目(茶顏悅色奶茶店加盟費(fèi)多少)

                  茶顏悅色又爆了,8月18日,茶顏悅色南京門店正式開業(yè),開張不到半小時(shí),門店就人滿為患,消費(fèi)者的購買熱情十分高漲,而由于人流量過大造成擁堵,茶顏悅色也不得不暫停營業(yè)。 當(dāng)然,這里面排…

                  2022年11月27日
                • 拍錯(cuò)了拒收快遞運(yùn)費(fèi)誰出(淘寶退貨運(yùn)費(fèi)誰出)

                  很多人在逛淘寶店的時(shí)候覺得寶貝圖片看著不錯(cuò)就買回來,結(jié)果收貨后發(fā)現(xiàn)可能不太合適就想退貨了。那么,淘寶退貨的快遞費(fèi)用應(yīng)該由誰來出呢?產(chǎn)生的快遞費(fèi)用應(yīng)該找誰來負(fù)責(zé)呢? 我們知道,根據(jù)《…

                  2022年11月27日
                • 筆記本最好配置(目前筆記本最好的配置)

                  本文主要講的是筆記本最好配置,以及和目前筆記本最好的配置相關(guān)的知識(shí),如果覺得本文對(duì)您有所幫助,不要忘了將本文分享給朋友。 筆記本電腦什么配置好? 01 CPU:這個(gè)主要取決于頻率和…

                  2022年11月26日
                • 《寶可夢(mèng)朱紫》夢(mèng)特性怎么獲得?隱藏特性獲取方法推薦

                  寶可夢(mèng)朱紫里有很多寶可夢(mèng)都是擁有夢(mèng)特性會(huì)變強(qiáng)的寶可夢(mèng),很多玩家不知道夢(mèng)特性怎么獲得,下面就給大家?guī)韺毧蓧?mèng)朱紫隱藏特性獲取方法推薦,感興趣的小伙伴一起來看看吧,希望能幫助到大家。 …

                  2022年11月25日
                • 《寶可夢(mèng)朱紫》奇魯莉安怎么進(jìn)化?奇魯莉安進(jìn)化方法分享

                  寶可夢(mèng)朱紫中的奇魯莉安要怎么進(jìn)化呢?很多玩家都不知道,下面就給大家?guī)韺毧蓧?mèng)朱紫奇魯莉安進(jìn)化方法分享,感興趣的小伙伴一起來看看吧,希望能幫助到大家。 奇魯莉安進(jìn)化方法分享 奇魯莉安…

                  2022年11月25日
                • cpu性能天梯圖2022 AMD CPU天梯圖最新排行榜出爐

                  用戶在DIY自己的主機(jī)時(shí)選擇CPU是非常關(guān)鍵的,CPU可以說是電腦的大腦,大家也都想追求好一點(diǎn)的CPU來使用,但型號(hào)太多了,大部分的用戶都不知道目前哪一款CPU比較好用,快來看看詳…

                  2022年11月24日
                • 《寶可夢(mèng)朱紫》暴飛龍?jiān)趺醋ィ勘╋w龍獲得方法

                  寶可夢(mèng)朱紫暴飛龍位置在哪?在游戲中,很多玩家還不清楚暴飛龍具體要怎么樣獲得,其實(shí)獲得方法很簡單,暴飛龍直接是沒得抓的,需要玩家從寶貝龍進(jìn)化得到,下面一起來看一下寶可夢(mèng)朱紫暴飛龍獲得…

                  2022年11月23日
                • 《寶可夢(mèng)朱紫》布土撥怎么進(jìn)化?布土撥進(jìn)化方法介紹

                  寶可夢(mèng)朱紫中,不同的寶可夢(mèng)有不同的進(jìn)化方法,其中布土撥的進(jìn)化方法是比較特殊的。很多玩家不知道寶可夢(mèng)朱紫布土撥怎么進(jìn)化,下面就帶來寶可夢(mèng)朱紫布土撥進(jìn)化方法介紹,一起來看看吧,希望能幫…

                  2022年11月23日
                • 《寶可夢(mèng)朱紫》薄荷怎么獲得?薄荷獲得方法

                  寶可夢(mèng)朱紫中薄荷有改變寶可夢(mèng)的屬性或性格等效果,很多玩家想知道寶可夢(mèng)朱紫薄荷怎么獲得,下面就帶來寶可夢(mèng)朱紫薄荷獲得方法,感興趣的小伙伴一起來看看吧,希望能幫助到大家。 薄荷獲得方法…

                  2022年11月23日

                聯(lián)系我們

                聯(lián)系郵箱:admin#wlmqw.com
                工作時(shí)間:周一至周五,10:30-18:30,節(jié)假日休息