国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

CGLIB動態(tài)代理對象GC問題排查

這篇具有很好參考價值的文章主要介紹了CGLIB動態(tài)代理對象GC問題排查。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、問題是怎么發(fā)現(xiàn)的

最近有個新系統(tǒng)開發(fā)完成后要上線,由于系統(tǒng)調(diào)用量很大,所以先對核心接口進(jìn)行了一次壓力測試,由于核心接口中基本上只有純內(nèi)存運算,所以預(yù)估核心接口的壓測QPS能夠達(dá)到上千。

壓測容器配置:4C8G

先從10個并發(fā)開始進(jìn)行發(fā)壓,結(jié)果cpu一下就飆升到了100%,但是核心接口的qps才200左右。于是觀察jvm的垃圾回收發(fā)現(xiàn)younggc很頻繁,但是fullGC數(shù)量為零。

二、排查問題的詳細(xì)過程

由于剛一開始壓測,容器cpu就飆升到了100%,所以需要先定位cpu使用率問題,找出使用cpu最高的幾個進(jìn)程。可以通過top命令查找進(jìn)程ID,發(fā)現(xiàn)正是壓測的Java應(yīng)用進(jìn)程ID;然后在定位該金晨曦cpu使用率最高的線程,可以通過top -p 進(jìn)程ID -H 命令顯示該進(jìn)程下的線程使用cpu信息。

top

top -p 進(jìn)程ID -H

圖片中PID列則為十進(jìn)制顯示的線程ID,然后轉(zhuǎn)換為16進(jìn)制;在通過jstack 系統(tǒng)進(jìn)程ID | grep 16進(jìn)制線程ID 命令找到對應(yīng)的線程信息如下,也就是該線程占用了一半左右的cpu。

jstack 系統(tǒng)進(jìn)程ID | grep 16進(jìn)制線程ID

此時定位到了Finalizer線程,但是這個線程又有什么作用呢?

原來這個線程會不停的循環(huán)等待java.lang.ref.Finalizer.ReferenceQueue中的新增對象。一旦Finalizer線程發(fā)現(xiàn)隊列中出現(xiàn)了新的對象,它會彈出該對象,調(diào)用它的finalize()方法,將該引用從Finalizer類中移除,因此下次GC再執(zhí)行的時候,這個Finalizer實例以及它引用的那個對象就可以被垃圾回收掉了。如果這個線程一直在不停的工作,說明Finalizer的隊列中有許多等待GC的垃圾對象。此時可以通過另一個命令來查看等待回收的垃圾對象有哪些。

jmap -finalizerinfo 進(jìn)程ID

Count Class description
-------------------------------------------------------
32221 com.jd.price.deep.exact.entity.coupons.DeepExactCouponVo$$EnhancerByCGLIB$$200e6ee6
14908 com.jd.pricedoor.compute.promotion.MultiplePromotion$$EnhancerByCGLIB$$a59933de
11982 java.util.zip.Deflater
1 java.net.SocksSocketImpl

通過上述結(jié)果可以發(fā)現(xiàn)有好多的業(yè)務(wù)對象,通過類名可以看到這些對象都是通過CGLIB動態(tài)代理創(chuàng)建的,而且這些動態(tài)代理類都默認(rèn)實現(xiàn)了finalize方法,導(dǎo)致這些對象在進(jìn)行垃圾回收時必須先要執(zhí)行finalize方法,所以都積壓到了finalizer的隊列中。

三、如何解決問題

通過上述排查過程發(fā)現(xiàn),是由于大量的業(yè)務(wù)對象通過CGLIB創(chuàng)建了動態(tài)代理類,而這些代理都是系統(tǒng)處理請求時創(chuàng)建的臨時對象,請求完成后,這些臨時對象就需要被垃圾回收掉,從而導(dǎo)致Finalizer線程執(zhí)行頻繁搶占了cpu資源。

針對以上分析結(jié)果所以有了如下幾種解決方案:

1.不要使用CGLIB來給那些需要頻繁進(jìn)行垃圾回收的對象創(chuàng)建動態(tài)代理,可以手動創(chuàng)建靜態(tài)代理類。

2.對象復(fù)用,盡量減少臨時對象的產(chǎn)生。

作者:京東零售 曹志飛

來源:京東云開發(fā)者社區(qū)文章來源地址http://www.zghlxwxcb.cn/news/detail-620808.html

到了這里,關(guān)于CGLIB動態(tài)代理對象GC問題排查的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • java中的靜態(tài)代理、jdk動態(tài)代理以及CGLIB 動態(tài)代理

    代理模式是一種比較好理解的設(shè)計模式。簡單來說就是 我們使用代理對象來代替對真實對象(real object)的訪問,這樣就可以在不修改原目標(biāo)對象的前提下,提供額外的功能操作,擴(kuò)展目標(biāo)對象的功能 那以下文章主要談三種代理模式, 分別是靜態(tài)代理,jdk的動態(tài)代理,cglib的動

    2024年02月11日
    瀏覽(26)
  • 通俗易懂 快速理解 JDK動態(tài)代理 和 cglib動態(tài)代理

    通俗易懂 快速理解 JDK動態(tài)代理 和 cglib動態(tài)代理

    動態(tài)代理的實現(xiàn)方案有兩種, JDK動態(tài)代理 和 CGLIB動態(tài)代理 ,區(qū)別在于JDK自帶的動態(tài)代理,必須要有接口,而CGLIB動態(tài)代理有沒有接口都可以。 JDK動態(tài)代理 :JDK原生的實現(xiàn)方式,需要被代理的目標(biāo)類必須實現(xiàn)接口。因為這個技術(shù)要求 代理對象和目標(biāo)對象實現(xiàn)同樣的接口 (兄

    2024年02月08日
    瀏覽(23)
  • 【spring】jdk動態(tài)代理和cglib動態(tài)代理的區(qū)別

    一、說明 1.spring aop中的動態(tài)代理主要有兩種方式,jdk動態(tài)代理和cglib動態(tài)代理 2.從實現(xiàn)接口、繼承父類的角度討論區(qū)別 3.從限制角度討論區(qū)別 4.從性能上討論區(qū)別 二、區(qū)別 1.jdk動態(tài)代理只提供接口類的代理,如果目標(biāo)類不是接口,只能用cglib代理 2.jdk動態(tài)代理會在運行時為目

    2024年02月16日
    瀏覽(19)
  • SpringAOP-說說 JDK動態(tài)代理和 CGLIB 代理

    SpringAOP-說說 JDK動態(tài)代理和 CGLIB 代理

    Spring 的 AOP 是通過動態(tài)代理來實現(xiàn)的,動態(tài)代理主要有兩種方式 JDK 動態(tài)代理和 Cglib 動態(tài)代理,這兩種動態(tài)代理的使用和原理有些不同。 JDK 動態(tài)代理 Interface :JDK動態(tài)代理是基于接口的代理,它要求目標(biāo)類實現(xiàn)一個接口。 InvocationHandler :InvocationHandler 是一個接口,可以通過

    2024年01月18日
    瀏覽(25)
  • 【深度思考】聊聊CGLIB動態(tài)代理原理

    CGLIB的全稱是:Code Generation Library。 CGLIB是一個強(qiáng)大的、高性能、高質(zhì)量的代碼生成類庫,它可以在運行期擴(kuò)展Java類與實現(xiàn)Java接口, 底層使用的是字節(jié)碼處理框架ASM。 Github地址:https://github.com/cglib/cglib。 CGLIB的Maven坐標(biāo)如下所示: 首先,新增一個類: 然后,自定義一個方法

    2023年04月21日
    瀏覽(19)
  • 3_代理模式(動態(tài)代理JDK原生和CGLib)

    1.概念 代理模式(Proxy Pattern )是指 為其他對象提供一種代理,以控制對這個對象的訪問 ,屬于結(jié)構(gòu)型模式。 在某些情況下,一個對象不適合或者不能直接引用另一個對象,而代理對象可以在客戶端和目標(biāo)對象之間起到中介的作用。 使用代理模式主要有兩個目的: 一是保護(hù)目標(biāo)

    2024年01月17日
    瀏覽(21)
  • Spring Boot 中的 AOP,到底是 JDK 動態(tài)代理還是 Cglib 動態(tài)代理

    Spring Boot 中的 AOP,到底是 JDK 動態(tài)代理還是 Cglib 動態(tài)代理

    大家都知道,AOP 底層是動態(tài)代理,而 Java 中的動態(tài)代理有兩種實現(xiàn)方式: 基于 JDK 的動態(tài)代理 基于 Cglib 的動態(tài)代理 這兩者最大的區(qū)別在于基于 JDK 的動態(tài)代理需要被代理的對象有接口,而基于 Cglib 的動態(tài)代理并不需要被代理對象有接口。 那么,Spring 中的 AOP 是怎么實現(xiàn)的

    2024年02月12日
    瀏覽(24)
  • AOP、AspectJ、JDK動態(tài)代理、CGLIB

    AOP(Aspect Orient Programming),作為面向?qū)ο缶幊痰囊环N補(bǔ)充,廣泛應(yīng)用于處理一些具有橫切性質(zhì)的系統(tǒng)級服務(wù),如事務(wù)管理、安全檢查、緩存、日志記錄管理等。 AOP 實現(xiàn)的關(guān)鍵就在于 AOP 框架自動創(chuàng)建的 AOP 代理,AOP 代理則可分為靜態(tài)代理和動態(tài)代理兩大類。 其中靜態(tài)代理是

    2024年02月11日
    瀏覽(53)
  • 靜態(tài)代理、jdk、cglib動態(tài)代理 搞不清? 看這個文章就懂了

    靜態(tài)代理、jdk、cglib動態(tài)代理 搞不清? 看這個文章就懂了

    代理模式是一種比較好的理解的設(shè)計模式。簡單來說就是 : 我們使用代理對象來增強(qiáng)目標(biāo)對象(target obiect),這樣就可以在不修改原目標(biāo)對象的前提下,提供額外的功能操作,擴(kuò)展目標(biāo)對象的功能。 將核心業(yè)務(wù)代碼和非核心的公共代碼分離解耦,提高代碼可維護(hù)性,讓被代理

    2024年02月14日
    瀏覽(20)
  • Spring之CGLIB和JDK動態(tài)代理底層實現(xiàn)

    Spring之CGLIB和JDK動態(tài)代理底層實現(xiàn)

    目錄 CGLIB 使用示例-支持創(chuàng)建代理對象,執(zhí)行代理邏輯 使用示例-多個方法,走不同的代理邏輯 JDK動態(tài)代理 使用示例-支持創(chuàng)建代理對象,執(zhí)行代理邏輯 ProxyFactory 如何自動在CGLIB和JDK動態(tài)代理轉(zhuǎn)換 使用示例-使用CGLIB代理方式 使用示例-使用JDK動態(tài)代理方式 Spring會自動在JDK動態(tài)

    2024年04月25日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包