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