從缺陷到創(chuàng)新:質(zhì)量保障的新視角
共 3025字,需瀏覽 7分鐘
·
2024-06-26 15:15
1.背景:
最近一段時(shí)間研發(fā)大佬們?cè)诜e極的治理告警,經(jīng)過(guò)一段時(shí)間的治理,現(xiàn)在告警情況已經(jīng)有了很大的改觀,但難免還有漏網(wǎng)之魚(yú);具體我們可以以下邊一個(gè)例子來(lái)看:
這是一個(gè)生產(chǎn)的UMP告警,通過(guò)這個(gè)告警我們發(fā)現(xiàn)XXX這個(gè)應(yīng)用的堆內(nèi)存使用率為90.18%,超過(guò)了設(shè)置的告警閾值85%,所以產(chǎn)生了這樣的一個(gè)告警;那什么是堆內(nèi)存呢?
1.1.Java堆內(nèi)存
Java堆內(nèi)存的定義
Java堆內(nèi)存是JVM內(nèi)存的一部分,專(zhuān)門(mén)用于動(dòng)態(tài)分配對(duì)象和數(shù)組。它是一個(gè)運(yùn)行時(shí)數(shù)據(jù)區(qū),從JVM啟動(dòng)到JVM關(guān)閉,堆內(nèi)存一直存在。堆內(nèi)存的大小可以通過(guò)JVM啟動(dòng)參數(shù)進(jìn)行調(diào)整,如-Xms(表示java虛擬機(jī)堆區(qū)內(nèi)存初始內(nèi)存分配的大小)和-Xmx(表示java虛擬機(jī)堆區(qū)內(nèi)存可被分配的最大上限)。
Java堆內(nèi)存的特點(diǎn)
動(dòng)態(tài)分配:Java堆內(nèi)存允許在運(yùn)行時(shí)動(dòng)態(tài)分配和釋放對(duì)象。
自動(dòng)管理:Java具有自動(dòng)垃圾回收機(jī)制(Garbage Collection, GC),自動(dòng)回收不再使用的對(duì)象,防止內(nèi)存泄漏。
全局訪問(wèn):堆內(nèi)存中的對(duì)象可以被程序中的任何部分訪問(wèn),只要有對(duì)該對(duì)象的引用。
分代回收:Java堆內(nèi)存通常被劃分為不同的代(Generation),如新生代(Young Generation)和老年代(Old Generation),以?xún)?yōu)化垃圾回收性能。
堆內(nèi)存的結(jié)構(gòu)
Java堆內(nèi)存通常劃分為以下幾個(gè)區(qū)域:
新生代(Young Generation):存儲(chǔ)新創(chuàng)建的對(duì)象,分為Eden區(qū)、幸存者區(qū)(Survivor Space S0和S1)。大多數(shù)新對(duì)象首先在Eden區(qū)分配,經(jīng)過(guò)幾次垃圾回收后,如果對(duì)象仍然存活,則移到幸存者區(qū),最終移到老年代。
老年代(Old Generation):存儲(chǔ)生命周期較長(zhǎng)的對(duì)象。經(jīng)過(guò)多次垃圾回收后仍然存活的新生代對(duì)象會(huì)被移到老年代。
永久代(Permanent Generation)或元空間(Metaspace):存儲(chǔ)類(lèi)的元數(shù)據(jù)(如類(lèi)定義和方法元數(shù)據(jù))。Java 8及以后,永久代被移除,改為元空間,并且使用本地內(nèi)存而不是堆內(nèi)存。
Java堆內(nèi)存的工作原理
對(duì)象分配:當(dāng)通過(guò)new關(guān)鍵字創(chuàng)建一個(gè)對(duì)象時(shí),JVM會(huì)在堆內(nèi)存中分配空間。比如:在這個(gè)例子中,new Person("John", 25)會(huì)在堆內(nèi)存中分配空間來(lái)存儲(chǔ)Person對(duì)象。
public class Main {public static void main(String[] args) {// 創(chuàng)建一個(gè)對(duì)象Person person = new Person("John", 25);}}class Person {String name;int age;//構(gòu)造方法Person(String name, int age) {this.name = name;this.age = age;}}
垃圾回收:Java的垃圾回收機(jī)制自動(dòng)回收不再使用的對(duì)象,釋放堆內(nèi)存空間。垃圾回收器(Garbage Collector)會(huì)周期性地掃描堆內(nèi)存,識(shí)別不再有任何引用指向的對(duì)象,并回收它們占用的內(nèi)存。
垃圾回收的過(guò)程大致分為以下幾步:
標(biāo)記:標(biāo)記出所有存活的對(duì)象。
清除:清除所有未被標(biāo)記的對(duì)象,釋放它們占用的內(nèi)存。
壓縮:(可選)將存活的對(duì)象移到堆的一端,減少內(nèi)存碎片,提高分配效率。
堆內(nèi)存管理中的問(wèn)題
內(nèi)存泄漏:雖然Java有垃圾回收機(jī)制,但不正確的代碼設(shè)計(jì)仍可能導(dǎo)致內(nèi)存泄漏,即對(duì)象雖然不再使用但仍然被引用,無(wú)法被回收。
內(nèi)存溢出(OutOfMemoryError):當(dāng)堆內(nèi)存被耗盡且垃圾回收無(wú)法釋放足夠內(nèi)存時(shí),會(huì)拋出OutOfMemoryError。
性能問(wèn)題:頻繁的垃圾回收會(huì)影響應(yīng)用性能,因此需要優(yōu)化內(nèi)存使用和垃圾回收策略。
通過(guò)對(duì)堆內(nèi)存和垃圾回收簡(jiǎn)單的了解**(備注,由于不是專(zhuān)業(yè)開(kāi)發(fā)可能對(duì)堆內(nèi)存和垃圾回收闡述的不是特別專(zhuān)業(yè),只是作為背景知識(shí)補(bǔ)充了解問(wèn)題??)**,我們大概知道上述告警多數(shù)是由于內(nèi)存泄露導(dǎo)致的,那么我們?cè)趺醋瞿?,才能避免此?lèi)問(wèn)題的發(fā)生呢?先來(lái)看看我們目前的質(zhì)量保障情況;
2.質(zhì)量保障
2.1.現(xiàn)有體系
2.2.關(guān)鍵要素
需求質(zhì)量維度
通過(guò)產(chǎn)品輸出的PRD文檔,研發(fā)會(huì)輸出設(shè)計(jì)文檔,測(cè)試對(duì)應(yīng)的也會(huì)輸出測(cè)試用例,這也是對(duì)于需求最直觀的輸出;
過(guò)程質(zhì)量維度
產(chǎn)品會(huì)進(jìn)行需求評(píng)審,研發(fā)會(huì)進(jìn)行設(shè)計(jì)評(píng)審,測(cè)試會(huì)進(jìn)行測(cè)試用例評(píng)審,三方的目的是拉齊需求,以避免各自的理解有偏差;
交付質(zhì)量維度
測(cè)試會(huì)發(fā)送驗(yàn)收?qǐng)?bào)告,產(chǎn)品會(huì)先進(jìn)行需求的驗(yàn)收,上線前產(chǎn)品會(huì)同步業(yè)務(wù)驗(yàn)收,業(yè)務(wù)驗(yàn)收有問(wèn)題會(huì)反饋到產(chǎn)品推進(jìn)研發(fā)優(yōu)化測(cè)試復(fù)測(cè),形成循環(huán);
2.3.質(zhì)量把控
環(huán)境治理是有專(zhuān)門(mén)的團(tuán)隊(duì)負(fù)責(zé),不做過(guò)多闡述
Diff&CR屬于測(cè)試左移的范疇,會(huì)在改進(jìn)措施中做說(shuō)明
監(jiān)控告警和質(zhì)量大盤(pán)屬于測(cè)試右移的范疇,也會(huì)在改進(jìn)措施中說(shuō)明
2.4.交付過(guò)程
持續(xù)迭代
目前是兩周一個(gè)迭代,基于這個(gè)節(jié)奏,去排需求,基本上每個(gè)迭代都會(huì)排滿(mǎn);
持續(xù)集成
主要還是基于Coding集團(tuán)的代碼倉(cāng)庫(kù)管理工具?持續(xù)發(fā)布?目前由于特殊性,沒(méi)有用到集團(tuán)的JDOS,使用的是自己的發(fā)布系統(tǒng)
持續(xù)運(yùn)營(yíng)
專(zhuān)門(mén)團(tuán)隊(duì)負(fù)責(zé)
持續(xù)度量
建立線上問(wèn)題處理群,通過(guò)群中Oncall對(duì)接
通過(guò)保險(xiǎn)一線之聲進(jìn)行問(wèn)題反饋
通過(guò)用戶(hù)滿(mǎn)意度評(píng)價(jià)進(jìn)行問(wèn)題反饋
2.5.質(zhì)量文化
質(zhì)量&效率基本上就是我們的團(tuán)隊(duì)文化,可能也是大部分測(cè)試團(tuán)隊(duì)的文化,通俗一些就是要測(cè)的好還要測(cè)的快
3.改進(jìn)措施
3.1.測(cè)試左移Diff&CR
傳統(tǒng)的diff&cr基本上我都是通過(guò)去讓開(kāi)發(fā)大佬開(kāi)放Coding倉(cāng)庫(kù)權(quán)限,手動(dòng)拉取開(kāi)發(fā)分支到本地倉(cāng)庫(kù),進(jìn)行diff和cr,效率較低,時(shí)間成本較高
基于大模型工程化進(jìn)行CodeReview好處良多,具體接入方式可參照,虛擬賬號(hào)可自行申請(qǐng)diff&cr ,效果如下,我們發(fā)現(xiàn)通過(guò)AI CR確實(shí)能夠幫我們發(fā)現(xiàn)一些問(wèn)題,這些問(wèn)題可能就是潛在的風(fēng)險(xiǎn),這樣能夠補(bǔ)充我們的測(cè)試Bad Case從而進(jìn)行更充分的測(cè)試;
3.2.測(cè)試右移監(jiān)控&告警
通過(guò)最初我們的案例分析發(fā)現(xiàn)目前告警信息確實(shí)也存在一部分不完善的情況,只給出了具體的告警信息**(當(dāng)然這個(gè)對(duì)于專(zhuān)業(yè)水平較高的同學(xué)也是可以快速定位問(wèn)題并解決的,但是對(duì)于稍微欠缺背景知識(shí)的同學(xué)比如說(shuō)不是專(zhuān)業(yè)開(kāi)發(fā)理解起來(lái)可能就稍微晦澀**),所以我對(duì)自己所測(cè)試的業(yè)務(wù)告警信息也進(jìn)行了優(yōu)化下面是我的一個(gè)優(yōu)化情況,多少對(duì)我個(gè)人而言我覺(jué)得還是有些幫助的??;
4.未來(lái)規(guī)劃
基于現(xiàn)有質(zhì)量保障框架下,我會(huì)持續(xù)探索、持續(xù)發(fā)現(xiàn)、持續(xù)優(yōu)化,保障業(yè)務(wù)運(yùn)轉(zhuǎn)質(zhì)量更絲滑
