国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
方法重構(gòu)與性能優(yōu)化

方法重構(gòu)與性能優(yōu)化

  太長的方法是一種壞味道,重構(gòu)時要盡量拆分大方法為小方法。昨天學(xué)習(xí)了JVM的內(nèi)存管理,發(fā)現(xiàn)將大方法切分為小方法還可以提高內(nèi)存的釋放速度,這與JVM的內(nèi)存管理有關(guān)。在方法調(diào)用時,JVM會創(chuàng)建一個stack frame,該方法的參數(shù)和局部變量都存放在stack中,當(dāng)方法調(diào)用結(jié)束時,該方法的stack frame被銷毀,所有的局部變量占用內(nèi)存被釋放。
Java代碼
  1. private void bigMethod(){   
  2.    ClassA p1 = new ClassA();   
  3.    ClassA p2 = new ClassA();   
  4.    int p3    = 0;   
  5.    int p4    =1;   
  6.    //.... some lines for business logic   
  7.    ClassA p5 = new ClassA();   
  8.    ClassA p6 = new ClassA();   
  9.    int p7    = 0;   
  10.    int p8    =1;   
  11.    //.... some lines for business logic   
  12. }  

當(dāng)方法bigMethod()被調(diào)用時,JVM會創(chuàng)建8個局部變量,4個為引用類型,4個為原始類型,他們都被分配在方法的stack中。其中引用類型的變量,還有4個對應(yīng)的對象被創(chuàng)建在heap中。當(dāng)bigMethod()調(diào)用結(jié)束后,p1到p8都被銷毀,而引用類型變量對應(yīng)的對象此時還在heap中,由于對象的引用已經(jīng)銷毀,所以這4個對象處于可以被銷毀的狀態(tài),由gc決定何時銷毀。
對bigMethdo重構(gòu)后,
Java代碼
  1. private void bigMethod(){   
  2.    smallMethod1();   
  3.    smallMethod2();   
  4. }   
  5. private void smallMethod1(){   
  6.    ClassA p1 = new ClassA();   
  7.    ClassA p2 = new ClassA();   
  8.    int p3    = 0;   
  9.    int p4    =1;   
  10.    //.... some lines for business logic   
  11. }   
  12. private void smallMethod1(){   
  13.     ClassA p5 = new ClassA();   
  14.    ClassA p6 = new ClassA();   
  15.    int p7    = 0;   
  16.    int p8    =1;   
  17.    //.... some lines for business logic   
  18. }  

這時調(diào)用bigMethod()會發(fā)生如下事情,1. 調(diào)用方法samllMethod1(),JVM會創(chuàng)建4個局部變量,2個為引用類型,2個為原始類型,他們都被分配在方法的stack中。引用類型的變量還有2個對應(yīng)的對象被創(chuàng)建在heap中。當(dāng)samllMethod1()調(diào)用結(jié)束后,p1到p4都被銷毀,而引用類型變量對應(yīng)的對象此時還在heap中,由于對象的引用已經(jīng)銷毀,所以這2個對象處于可以被銷毀的狀態(tài),由gc決定何時銷毀。
2.調(diào)用方法samllMethod2(),重復(fù)步驟1的內(nèi)容。
這樣與重構(gòu)前相比,在調(diào)用方法samllMethod2()時已經(jīng)釋放了p1到p4,JVM已經(jīng)回收了這部分內(nèi)存。而更重要的是,在調(diào)用方法samllMethod2()時,在heap中創(chuàng)建的p1,p2對應(yīng)的對象已經(jīng)處于可以銷毀的狀態(tài),這為JVM提前提供了銷毀p1,p2的對象的機會。如果此時正好heap中內(nèi)存不夠用了,需要運行g(shù)c來銷毀對象,那么p1,p2的對象占用的內(nèi)存就可以被釋放。而在未重勾前,在這個時刻p1,p2的對象還有引用,是不能銷毀的。最極端的情況是此時此刻heap的內(nèi)從不夠用了,也沒有可以銷毀的對象,那么就會發(fā)生outmemory異常,系統(tǒng)crash。
還有一種情況,就是如果在一個線程方法中調(diào)用了wait(),等待某事件發(fā)生來喚醒該線程,那么在該線程方法調(diào)用可能會很久才會結(jié)束,這段時間內(nèi)該方法內(nèi)的局部變量都不能銷毀。如果該線程永遠沒有被喚醒那么方法內(nèi)的局部變量就永遠不能銷毀,這會造成內(nèi)存泄露。
通過將大方法重構(gòu)為小方法可以提前釋放內(nèi)存,可以在某種程度上避免這種情況的發(fā)生
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
有誰 知道覆蓋與覆寫有什么詳細的差別?
把C 的源程序改寫成C語言,方法是這樣滴!
Java內(nèi)部類與匿名內(nèi)部類
Java 變量 運算符
C#委托淺析與漫談
Java程序員必備基礎(chǔ):內(nèi)部類解析
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服