RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

JVM內(nèi)存大對(duì)象監(jiān)控和優(yōu)化問(wèn)題描述及解決辦法

OSC開(kāi)源社區(qū) ? 來(lái)源:vivo互聯(lián)網(wǎng)技術(shù) ? 2023-08-28 11:39 ? 次閱讀

服務(wù)器內(nèi)存問(wèn)題是影響應(yīng)用程序性能和穩(wěn)定性的重要因素之一,需要及時(shí)排查和優(yōu)化。本文介紹了某核心服務(wù)內(nèi)存問(wèn)題排查與解決過(guò)程。首先在JVM與大對(duì)象優(yōu)化上進(jìn)行了有效的實(shí)踐,其次在故障轉(zhuǎn)移與大對(duì)象監(jiān)控上提出了可靠的落地方案。最后,總結(jié)了內(nèi)存優(yōu)化需要考慮的其他問(wèn)題。

一、問(wèn)題描述

音樂(lè)業(yè)務(wù)中,core服務(wù)主要提供歌曲、歌手等元數(shù)據(jù)與用戶(hù)資產(chǎn)查詢(xún)。隨著元數(shù)據(jù)與用戶(hù)資產(chǎn)查詢(xún)量的增長(zhǎng),一些JVM內(nèi)存問(wèn)題也逐漸顯露,例如GC頻繁、耗時(shí)長(zhǎng),在高峰期RPC調(diào)用超時(shí)等問(wèn)題,導(dǎo)致業(yè)務(wù)核心功能受損。

9ccc3132-4337-11ee-a2ef-92fbcf53809c.png

圖1 業(yè)務(wù)異常數(shù)量變化

二、分析與解決

通過(guò)對(duì)日志,機(jī)器CPU、內(nèi)存等監(jiān)控?cái)?shù)據(jù)分析發(fā)現(xiàn):

YGC平均每分鐘次數(shù)12次,峰值為24次,平均每次的耗時(shí)在327毫秒。FGC平均每10分鐘0.08次,峰值1次,平均耗時(shí)30秒??梢钥吹紾C問(wèn)題較為突出。

在問(wèn)題期間,機(jī)器的CPU并沒(méi)有明顯的變化,但是堆內(nèi)存出現(xiàn)較大異常。圖2,黃色圓圈處,內(nèi)存使用急速上升,F(xiàn)GC變的頻繁,釋放的內(nèi)存越來(lái)越少。

9cd45902-4337-11ee-a2ef-92fbcf53809c.png

圖2 老年代內(nèi)存使用異常

因此,我們認(rèn)為業(yè)務(wù)功能異常是機(jī)器的內(nèi)存問(wèn)題導(dǎo)致的,需要對(duì)服務(wù)的內(nèi)存做一次專(zhuān)項(xiàng)優(yōu)化。

步驟1 JVM優(yōu)化

以下是默認(rèn)的JVM參數(shù)

-Xms4096M-Xmx4096M-Xmn1024M-XX:MetaspaceSize=256M-Djava.security.egd=file:/dev/./urandom-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=/data/{runuser}/logs/other

如果不指定垃圾收集器,那么JDK 8默認(rèn)采用的是Parallel Scavenge(新生代) +Parallel Old(老年代),這種組合在多核CPU上充分利用多線(xiàn)程并行的優(yōu)勢(shì),提高垃圾回收的效率和吞吐量。但是,由于采用多線(xiàn)程并行方式,會(huì)造成一定的停頓時(shí)間,不適合對(duì)響應(yīng)時(shí)間要求較高的應(yīng)用程序。然而,core這類(lèi)的服務(wù)特點(diǎn)是對(duì)象數(shù)量多,生命周期短。在系統(tǒng)特點(diǎn)上,吞吐量較低,要求時(shí)延低。因此,默認(rèn)的JVM參數(shù)并不適合core服務(wù)。

根據(jù)業(yè)務(wù)的特點(diǎn)和多次對(duì)照實(shí)驗(yàn),選擇了如下參數(shù)進(jìn)行JVM優(yōu)化(4核8G的機(jī)器)。該參數(shù)將young區(qū)設(shè)為原來(lái)的1.5倍,減少了進(jìn)入老年代的對(duì)象數(shù)量。將垃圾回收器換成ParNew+CMS,可以減少YGC的次數(shù),降低停頓時(shí)間。此外還開(kāi)啟了CMSScavengeBeforeRemark,在CMS的重新標(biāo)記階段進(jìn)行一次YGC,以減少重新標(biāo)記的時(shí)間。

-Xms4096M-Xmx4096M-Xmn1536M-XX:MetaspaceSize=256M-XX:+UseConcMarkSweepGC-XX:+CMSScavengeBeforeRemark-Djava.security.egd=file:/dev/./urandom-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=/data/{runuser}/logs/other

9ce03704-4337-11ee-a2ef-92fbcf53809c.png

圖3 JVM優(yōu)化前后的堆內(nèi)存對(duì)比

優(yōu)化后效果如圖3,堆內(nèi)存的使用明顯降低,但是Dubbo超時(shí)仍然存在。

我們推斷,在業(yè)務(wù)高峰期,該節(jié)點(diǎn)出現(xiàn)了大對(duì)象晉升到了老年代,導(dǎo)致內(nèi)存使用迅速上升,并且大對(duì)象沒(méi)有被及時(shí)回收。那如何找到這個(gè)大對(duì)象及其產(chǎn)生的原因呢?為了降低問(wèn)題排查期間業(yè)務(wù)的損失,提出了臨時(shí)的故障轉(zhuǎn)移策略,盡量降低異常數(shù)量。

步驟2 故障轉(zhuǎn)移策略

在api服務(wù)調(diào)用core服務(wù)出現(xiàn)異常時(shí),將出現(xiàn)異常的機(jī)器ip上報(bào)給監(jiān)控平臺(tái)。然后利用監(jiān)控平臺(tái)的統(tǒng)計(jì)與告警能力,配置相應(yīng)的告警規(guī)則與回調(diào)函數(shù)。當(dāng)異常觸發(fā)告警,通過(guò)配置的回調(diào)函數(shù)將告警ip傳遞給api服務(wù),此時(shí)api服務(wù)可以將core服務(wù)下的該ip對(duì)應(yīng)的機(jī)器視為“故障”,進(jìn)而通過(guò)自定義的故障轉(zhuǎn)移策略(實(shí)現(xiàn)Dubbo的AbstractLoadBalance抽象類(lèi),并且配置在項(xiàng)目),自動(dòng)將該ip從提供者集群中剔除,從而達(dá)到不去調(diào)用問(wèn)題機(jī)器。圖 4 是整個(gè)措施的流程。在該措施上線(xiàn)前,每當(dāng)有機(jī)器內(nèi)存告警時(shí),將會(huì)人工重啟該機(jī)器。

9d09b1ba-4337-11ee-a2ef-92fbcf53809c.jpg

圖4 故障轉(zhuǎn)移策略

步驟3 大對(duì)象優(yōu)化

大對(duì)象占用了較多的內(nèi)存,導(dǎo)致內(nèi)存空間無(wú)法被有效利用,甚至造成OOM(Out Of Memory)異常。在優(yōu)化過(guò)程中,先是查看了異常期間的線(xiàn)程信息,然后對(duì)堆內(nèi)存進(jìn)行了分析,最終確定了大對(duì)象身份以及產(chǎn)生的接口

(1) Dump Stack 查看線(xiàn)程

從監(jiān)控平臺(tái)上Dump Stack文件,發(fā)現(xiàn)一定數(shù)量的如下線(xiàn)程調(diào)用。

Thread 5612: (state = IN_JAVA)
 - org.apache.dubbo.remoting.exchange.codec.ExchangeCodec.encodeResponse(org.apache.dubbo.remoting.Channel, org.apache.dubbo.remoting.buffer.ChannelBuffer, org.apache.dubbo.remoting.exchange.Response) @bci=11, line=282 (Compiled frame; information may be imprecise)
 - org.apache.dubbo.remoting.exchange.codec.ExchangeCodec.encode(org.apache.dubbo.remoting.Channel, org.apache.dubbo.remoting.buffer.ChannelBuffer, java.lang.Object) @bci=34, line=73 (Compiled frame)
 - org.apache.dubbo.rpc.protocol.dubbo.DubboCountCodec.encode(org.apache.dubbo.remoting.Channel, org.apache.dubbo.remoting.buffer.ChannelBuffer, java.lang.Object) @bci=7, line=40 (Compiled frame)
 - org.apache.dubbo.remoting.transport.netty4.NettyCodecAdapter$InternalEncoder.encode(io.netty.channel.ChannelHandlerContext, java.lang.Object, io.netty.buffer.ByteBuf) @bci=51, line=69 (Compiled frame)
 - io.netty.handler.codec.MessageToByteEncoder.write(io.netty.channel.ChannelHandlerContext, java.lang.Object, io.netty.channel.ChannelPromise) @bci=33, line=107 (Compiled frame)
 - io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(java.lang.Object, io.netty.channel.ChannelPromise) @bci=10, line=717 (Compiled frame)
 - io.netty.channel.AbstractChannelHandlerContext.invokeWrite(java.lang.Object, io.netty.channel.ChannelPromise) @bci=10, line=709 (Compiled frame)
...

state = IN_JAVA 表示Java虛擬機(jī)正在執(zhí)行Java程序。從線(xiàn)程調(diào)用信息可以看到,Dubbo正在調(diào)用Netty,將輸出寫(xiě)入到緩沖區(qū)。此時(shí)的響應(yīng)可能是一個(gè)大對(duì)象,因而在對(duì)響應(yīng)進(jìn)行編碼、寫(xiě)緩沖區(qū)時(shí),需要耗費(fèi)較長(zhǎng)的時(shí)間,導(dǎo)致抓取到的此類(lèi)線(xiàn)程較多。另外耗時(shí)長(zhǎng),也即是大對(duì)象存活時(shí)間長(zhǎng),導(dǎo)致full gc 釋放的內(nèi)存越來(lái)越小,空閑的堆內(nèi)存變小,這又會(huì)加劇full gc 次數(shù)。

這一系列的連鎖反應(yīng)與圖2相吻合,那么接下來(lái)的任務(wù)就是找到這個(gè)大對(duì)象。

(2)Dump Heap 查看內(nèi)存

對(duì)core服務(wù)的堆內(nèi)存進(jìn)行了多次查看,其中比較有代表性的一次快照的大對(duì)象列表如下,

9d229766-4337-11ee-a2ef-92fbcf53809c.png

圖5 core服務(wù)的堆內(nèi)存快照

整個(gè)Netty的taskQueue有258MB。并且從圖中綠色方框處可以發(fā)現(xiàn),單個(gè)的Response竟達(dá)到了9M,紅色方框處,顯示了調(diào)用方的服務(wù)名以及URI。

進(jìn)一步排查,發(fā)現(xiàn)該接口會(huì)通過(guò)core服務(wù)查詢(xún)大量信息,至此基本排查清楚了大對(duì)象的身份以及產(chǎn)生原因。

(3)優(yōu)化結(jié)果

在對(duì)接口進(jìn)行優(yōu)化后,整個(gè)core服務(wù)也出現(xiàn)了非常明顯的改進(jìn)。YGC全天總次數(shù)降低了76.5%,高峰期累計(jì)耗時(shí)降低了75.5%。FGC三天才會(huì)發(fā)生一次,并且高峰期累計(jì)耗時(shí)降低了90.1%。

9d2cff62-4337-11ee-a2ef-92fbcf53809c.png

圖6大對(duì)象優(yōu)化后的core服務(wù)GC情況

盡管優(yōu)化后,因內(nèi)部異常導(dǎo)致獲取核心業(yè)務(wù)失敗的異常請(qǐng)求數(shù)顯著減少,但是依然存在。為了找到最后這一點(diǎn)異常產(chǎn)生的原因,我們打算對(duì)core服務(wù)內(nèi)存中的對(duì)象大小進(jìn)行監(jiān)控。

9d4ae2c0-4337-11ee-a2ef-92fbcf53809c.png

圖7系統(tǒng)內(nèi)部異常導(dǎo)致核心業(yè)務(wù)失敗的異常請(qǐng)求數(shù)

步驟4 無(wú)侵入式內(nèi)存對(duì)象監(jiān)控

Debug Dubbo 源碼的過(guò)程中,發(fā)現(xiàn)在網(wǎng)絡(luò)層,Dubbo通過(guò)encodeResponse方法對(duì)響應(yīng)進(jìn)行編碼并寫(xiě)入緩沖區(qū),通過(guò)checkPayload方法去檢查響應(yīng)的大小,當(dāng)超過(guò)payload時(shí),會(huì)拋出ExceedPayloadLimitException異常。在外層對(duì)異常進(jìn)行了捕獲,重置buffer位置,而且如果是ExceedPayloadLimitException異常,重新發(fā)送一個(gè)空響應(yīng),這里需要注意,空響應(yīng)沒(méi)有原始的響應(yīng)結(jié)果信息,源碼如下。

//org.apache.dubbo.remoting.exchange.codec.ExchangeCodec#encodeResponse
protected void encodeResponse(Channel channel, ChannelBuffer buffer, Response res) throws IOException {
    //...省略部分代碼
    try {
 
        //1、檢查響應(yīng)大小是否超過(guò) payload,如果超過(guò),則拋出ExceedPayloadLimitException異常
        checkPayload(channel, len);
 
 
    } catch (Throwable t) {
         
        //2、重置buffer
        buffer.writerIndex(savedWriteIndex);
 
        //3、捕獲異常后,生成一個(gè)新的空響應(yīng)
        Response r = new Response(res.getId(), res.getVersion());
        r.setStatus(Response.BAD_RESPONSE);
         
        //4、ExceedPayloadLimitException異常,將生成的空響應(yīng)重新發(fā)送一遍
        if (t instanceof ExceedPayloadLimitException) {
            r.setErrorMessage(t.getMessage());
            channel.send(r);
            return;
        }
         
    }
}
 
//org.apache.dubbo.remoting.transport.AbstractCodec#checkPayload
protected static void checkPayload(Channel channel, long size) throws IOException {
    int payload = getPayload(channel);
    boolean overPayload = isOverPayload(payload, size);
    if (overPayload) {
        ExceedPayloadLimitException e = new ExceedPayloadLimitException("Data length too large: " + size + ", max payload: " + payload + ", channel: " + channel);
        logger.error(e);
        throw e;
    }
}

受此啟發(fā),自定義了編解碼類(lèi)(實(shí)現(xiàn)org.apache.dubbo.remoting.Codec2接口,并且配置在項(xiàng)目),去監(jiān)控超出閾值的對(duì)象,并打印請(qǐng)求的詳細(xì)信息,方便排查問(wèn)題。在具體實(shí)現(xiàn)中,如果特意去計(jì)算每個(gè)對(duì)象的大小,那么勢(shì)必是對(duì)服務(wù)性能造成影響。經(jīng)過(guò)分析,采取了和checkPayload一樣的方式,根據(jù)編碼前后buffer的writerIndex位置去判斷有沒(méi)有超過(guò)設(shè)定的閾值。代碼如下。

/**
 * 自定義dubbo編碼類(lèi)
 **/
public class MusicDubboCountCodec implements Codec2 {
 
    /**
     * 異常響應(yīng)池:緩存超過(guò)payload大小的responseId
     */
    private static Cache EXCEED_PAYLOAD_LIMIT_CACHE = Caffeine.newBuilder()
        // 緩存總條數(shù)
        .maximumSize(100)
        // 過(guò)期時(shí)間
        .expireAfterWrite(300, TimeUnit.SECONDS)
        // 將value設(shè)置為軟引用,在OOM前直接淘汰
        .softValues()
        .build();
 
 
    @Override
    public void encode(Channel channel, ChannelBuffer buffer, Object message) throws IOException {
        //1、記錄數(shù)據(jù)編碼前的buffer位置
        int writeBefore = null == buffer ? 0 : buffer.writerIndex();
 
        //2、調(diào)用原始的編碼方法
        dubboCountCodec.encode(channel, buffer, message);
 
        //3、檢查&記錄超過(guò)payload的信息
        checkOverPayload(message);
 
        //4、計(jì)算對(duì)象長(zhǎng)度
        int writeAfter = null == buffer ? 0 : buffer.writerIndex();    
        int length = writeAfter - writeBefore;
 
        //5、超過(guò)告警閾值,進(jìn)行日志打印處理
        warningLengthTooLong(length, message);
    }
 
    //校驗(yàn)response是否超過(guò)payload,超過(guò)了,緩存id
    private void checkOverPayload(Object message){
        if(!(message instanceof Response)){
            return;
        }
        Response response = (Response) message;
 
        //3.1、新的發(fā)送過(guò)程:通過(guò)狀態(tài)碼BAD_RESPONSE與錯(cuò)誤信息識(shí)別出空響應(yīng),并記錄響應(yīng)id
        if(Response.BAD_RESPONSE == response.getStatus() && StrUtil.contains(response.getErrorMessage(), OVER_PAYLOAD_ERROR_MESSAGE)){          
            EXCEED_PAYLOAD_LIMIT_CACHE.put(response.getId(), response.getErrorMessage());
            return;
        }
 
        //3.2、原先的發(fā)送過(guò)程:通過(guò)異常池識(shí)別出超過(guò)payload的響應(yīng),打印有用的信息
        if(Response.OK == response.getStatus() &&  EXCEED_PAYLOAD_LIMIT_CACHE.getIfPresent(response.getId()) != null){      
            String responseMessage = getResponseMessage(response);
            log.warn("dubbo序列化對(duì)象大小超過(guò)payload,errorMsg is {},response is {}", EXCEED_PAYLOAD_LIMIT_CACHE.getIfPresent(response.getId()),responseMessage);
        }
    }
     
}

在上文中提到,當(dāng)捕獲到超過(guò)payload的異常時(shí),會(huì)重新生成空響應(yīng),導(dǎo)致失去了原始的響應(yīng)結(jié)果,此時(shí)再去打印日志,是無(wú)法獲取到調(diào)用方法和入?yún)⒌?,但是encodeResponse方法步驟4中,重新發(fā)送這個(gè)Response,給了我們機(jī)會(huì)去獲取到想要的信息,因?yàn)橹匦掳l(fā)送意味著會(huì)再去走一遍自定義的編碼類(lèi)。

假設(shè)有一個(gè)超出payload的請(qǐng)求,執(zhí)行到自定編碼類(lèi)encode方法的步驟2(Dubbo源碼中的編碼方法),在這里會(huì)調(diào)用encodeResponse方法重置buffer,發(fā)送新的空響應(yīng)。

(1)當(dāng)這個(gè)新的空響應(yīng)再次進(jìn)入自定義encode方法,執(zhí)行 checkOverPayload方法的步驟3.1時(shí),就會(huì)記錄異常響應(yīng)的id到本地緩存。由于在encodeResponse中buffer被重置,無(wú)法計(jì)算對(duì)象的大小,所以步驟4、5不會(huì)起到實(shí)際作用,就此結(jié)束新的發(fā)送過(guò)程。

(2)原先的發(fā)送過(guò)程回到步驟2 繼續(xù)執(zhí)行,到了步驟3.2 時(shí),發(fā)現(xiàn)本地緩存的異常池中有當(dāng)前的響應(yīng)id,這時(shí)就可以打印調(diào)用信息了。

綜上,對(duì)于大小在告警閾值和payload之間的對(duì)象,由于響應(yīng)信息成功寫(xiě)入了buffer,可以直接進(jìn)行大小判斷,并且打印響應(yīng)中的關(guān)鍵信息;對(duì)于超過(guò)payload的對(duì)象,在重新發(fā)送中記錄異常響應(yīng)id到本地,在原始發(fā)送過(guò)程中訪(fǎng)問(wèn)異常id池識(shí)別是否是異常響應(yīng),進(jìn)行關(guān)鍵信息打印。

在監(jiān)控措施上線(xiàn)后,通過(guò)日志很快速的發(fā)現(xiàn)了一部分產(chǎn)生大對(duì)象的接口,當(dāng)前也正在根據(jù)接口特點(diǎn)做針對(duì)性?xún)?yōu)化。

三、總結(jié)

在對(duì)服務(wù)JVM內(nèi)存進(jìn)行調(diào)優(yōu)時(shí),要充分利用日志、監(jiān)控工具、堆棧信息等,分析與定位問(wèn)題。盡量降低問(wèn)題排查期間的業(yè)務(wù)損失,引入對(duì)象監(jiān)控手段也不能影響現(xiàn)有業(yè)務(wù)。除此之外,還可以在定時(shí)任務(wù)、代碼重構(gòu)、緩存等方面進(jìn)行優(yōu)化。優(yōu)化服務(wù)內(nèi)存不僅僅是JVM調(diào)參,而是一個(gè)全方面的持續(xù)過(guò)程。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編碼器
    +關(guān)注

    關(guān)注

    45

    文章

    3638

    瀏覽量

    134423
  • RPC
    RPC
    +關(guān)注

    關(guān)注

    0

    文章

    111

    瀏覽量

    11529
  • cms
    cms
    +關(guān)注

    關(guān)注

    0

    文章

    59

    瀏覽量

    10964
  • JVM
    JVM
    +關(guān)注

    關(guān)注

    0

    文章

    158

    瀏覽量

    12220
  • 回調(diào)函數(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    87

    瀏覽量

    11554

原文標(biāo)題:JVM 內(nèi)存大對(duì)象監(jiān)控和優(yōu)化實(shí)踐

文章出處:【微信號(hào):OSC開(kāi)源社區(qū),微信公眾號(hào):OSC開(kāi)源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    常見(jiàn)墊圈故障及解決辦法 防漏墊圈的設(shè)計(jì)與應(yīng)用

    常見(jiàn)墊圈故障及解決辦法 1. 墊圈老化 故障現(xiàn)象: 墊圈因長(zhǎng)時(shí)間使用而老化,失去彈性,導(dǎo)致密封性能下降。 解決辦法: 定期檢查墊圈的老化情況,及時(shí)更換新的墊圈。 2. 墊圈變形 故障現(xiàn)象: 由于安裝
    的頭像 發(fā)表于 12-12 15:31 ?201次閱讀

    雷達(dá)探測(cè)器常見(jiàn)故障及解決辦法

    雷達(dá)探測(cè)器,特別是用于車(chē)輛泊車(chē)輔助的雷達(dá)系統(tǒng),常見(jiàn)故障及其解決辦法可以歸納如下: 一、無(wú)報(bào)警提示故障 故障現(xiàn)象 : 在掛入倒擋或者按下雷達(dá)開(kāi)關(guān)后,雷達(dá)系統(tǒng)毫無(wú)反應(yīng)。 可能原因 : 倒車(chē)?yán)走_(dá)系統(tǒng)工作
    的頭像 發(fā)表于 11-24 09:46 ?351次閱讀

    PCBA板常見(jiàn)故障及解決辦法

    和使用過(guò)程中可能會(huì)出現(xiàn)各種故障,以下是一些常見(jiàn)的故障及其解決辦法: 1. 焊接不良 故障現(xiàn)象: 焊點(diǎn)不光滑、有空洞、焊料不足或過(guò)多、焊點(diǎn)開(kāi)裂等。 解決辦法: 檢查焊接設(shè)備(如回流焊機(jī))的溫度曲線(xiàn)是否正確。 確保焊膏和焊料的質(zhì)量符合要求。 檢查焊接過(guò)程中是否有污染或氧化。
    的頭像 發(fā)表于 11-18 10:20 ?373次閱讀

    谷景科普電感磁芯發(fā)熱的解決辦法

    谷景科普電感磁芯發(fā)熱的解決辦法編輯:谷景電子電感磁芯發(fā)熱是電感產(chǎn)品中的常見(jiàn)問(wèn)題,它可能影響電感的的性能和可靠性。解決電感磁芯發(fā)熱的方法多種多樣,下面給大家介紹幾種常用的方法:優(yōu)化電感設(shè)計(jì):通過(guò)調(diào)整
    發(fā)表于 11-13 22:58 ?0次下載

    常見(jiàn)RAM內(nèi)存故障及解決辦法

    隨機(jī)存取存儲(chǔ)器(RAM)是計(jì)算機(jī)中不可或缺的組件之一,它負(fù)責(zé)存儲(chǔ)計(jì)算機(jī)運(yùn)行時(shí)的數(shù)據(jù)和程序。然而,由于各種原因,RAM可能會(huì)出現(xiàn)故障,導(dǎo)致計(jì)算機(jī)性能下降甚至無(wú)法啟動(dòng)。 常見(jiàn)RAM內(nèi)存故障 無(wú)法識(shí)別內(nèi)存
    的頭像 發(fā)表于 11-11 10:01 ?902次閱讀

    溫控器常見(jiàn)故障及解決辦法

    溫控器是維持室內(nèi)溫度舒適的必備設(shè)備。然而,像所有電子設(shè)備一樣,它們也可能出現(xiàn)故障。了解常見(jiàn)故障及其解決辦法可以幫助您快速解決問(wèn)題,避免不必要的維修費(fèi)用。 一、溫控器不工作 故障現(xiàn)象: 溫控器顯示正常
    的頭像 發(fā)表于 11-06 13:51 ?3658次閱讀

    常見(jiàn)MCU故障及解決辦法

    微控制器單元(MCU)是現(xiàn)代電子設(shè)備中的核心組件,負(fù)責(zé)處理和控制各種功能。然而,由于各種原因,MCU可能會(huì)出現(xiàn)故障。以下是一些常見(jiàn)的MCU故障及其解決辦法: 1. 電源問(wèn)題 故障現(xiàn)象: MCU無(wú)法
    的頭像 發(fā)表于 11-01 13:41 ?1467次閱讀

    常見(jiàn)元器件故障及解決辦法

    在電子設(shè)備的日常使用和維護(hù)中,元器件的故障是不可避免的。了解常見(jiàn)元器件的故障類(lèi)型及其解決辦法,對(duì)于快速定位問(wèn)題并進(jìn)行修復(fù)至關(guān)重要。 1. 電阻器故障 故障現(xiàn)象: 電阻值變化:電阻器老化或損壞導(dǎo)致其實(shí)
    的頭像 發(fā)表于 10-29 16:21 ?418次閱讀

    JVM xmx, xms等內(nèi)存相關(guān)參數(shù)合理性設(shè)置

    的,提高內(nèi)存占用(Memory Footprint)就有可能同時(shí)優(yōu)化這兩個(gè)標(biāo)的,這篇文章就來(lái)聊聊內(nèi)存相關(guān)內(nèi)容。 內(nèi)存占用一般指應(yīng)用運(yùn)行需要的所有內(nèi)存
    的頭像 發(fā)表于 10-10 14:42 ?456次閱讀

    海外大帶寬服務(wù)器連接失敗解決辦法

     海外大帶寬服務(wù)器連接失敗可能由多種原因引起,以下是一些常見(jiàn)的故障排除步驟和可能的解決方案。Rak小編為您整理發(fā)布海外大帶寬服務(wù)器連接失敗解決辦法。
    的頭像 發(fā)表于 09-29 09:53 ?207次閱讀

    從原理聊JVM(一):染色標(biāo)記和垃圾回收算法

    更好地優(yōu)化自己的代碼,并解決一些潛在的性能問(wèn)題。 本文及后續(xù)文章將從原理聊起,對(duì)JVM內(nèi)存分配、GC、編譯等知識(shí)進(jìn)行分析和總結(jié)。 1 JVM運(yùn)行時(shí)
    的頭像 發(fā)表于 08-20 15:25 ?226次閱讀
    從原理聊<b class='flag-5'>JVM</b>(一):染色標(biāo)記和垃圾回收算法

    聊聊JVM如何優(yōu)化

    進(jìn)行優(yōu)化。 1.JVM內(nèi)存模型 針對(duì)JAVA8的模型進(jìn)行討論,JVM內(nèi)存模型主要分為幾個(gè)關(guān)鍵區(qū)域:堆、方法區(qū)、程序計(jì)數(shù)器、虛擬機(jī)棧和本地方
    的頭像 發(fā)表于 08-05 17:49 ?463次閱讀
    聊聊<b class='flag-5'>JVM</b>如何<b class='flag-5'>優(yōu)化</b>

    深入理解Java 8內(nèi)存管理機(jī)制及故障排查實(shí)戰(zhàn)指南

    Java的自動(dòng)內(nèi)存管理機(jī)制是由 JVM 中的垃圾收集器來(lái)實(shí)現(xiàn)的,垃圾收集器會(huì)定期掃描堆內(nèi)存中的對(duì)象,檢測(cè)并清除不再使用的對(duì)象,以釋放
    的頭像 發(fā)表于 04-04 08:10 ?993次閱讀
    深入理解Java 8<b class='flag-5'>內(nèi)存</b>管理機(jī)制及故障排查實(shí)戰(zhàn)指南

    Profinet IO通信故障的解決辦法

    Profinet IO通信故障可能由多種原因引起,以下是一些常見(jiàn)的通信故障及其解決辦法
    的頭像 發(fā)表于 03-08 11:27 ?1122次閱讀

    大模型訓(xùn)練loss突刺原因和解決辦法

    PaLM和GLM130b之前的解決辦法是找到loss spike之前最近的checkpoint,更換之后的訓(xùn)練樣本來(lái)避免loss spike的出現(xiàn)。
    的頭像 發(fā)表于 01-09 14:20 ?1314次閱讀
    大模型訓(xùn)練loss突刺原因和<b class='flag-5'>解決辦法</b>
    RM新时代网站-首页