Android內存管理機制

好文摘錄

原作:

https://www.cnblogs.com/nathan909/p/5372981.html

?

1、基于Linux內存管理

  Android系統是基于Linux 2.6內核開發的開源操作系統,而linux系統的內存管理有其獨特的動態存儲管理機制。不過Android系統對Linux的內存管理機制進行了優化,Linux系統會在進程活動停止后就結束該進程,而Android把這些進程都保留在內存中,直到系統需要更多內存為止。這些保留在內存中的進程通常情況下不會影響整體系統的運行速度,并且當用戶再次激活這些進程時,提升了進程的啟動速度。

2、Android內存分配機制

  與java的垃圾回收機制類似,系統有一個規則來回收內存。進行內存調度有個閾值,只有低于這個值系統才會按一個列表來關閉用戶不需要的東西。Android系統有六類進程:前臺進程、可見進程、次要服務、后臺進程、內容供應節點、空進程。有內存管理需求的人可以用MinFreeManager之類的軟件進行進程管理,分別為六類進程設定不同的閾值來操縱系統的內存分配機制。不過對于一般用戶而言,Android系統默認的分配機制已經可以滿足使用需要,因此也不需要再去調整。

  對于一些內存很低的低端Android機而言,系統默認的內存分配機制無法實現很完善的內存調配。所以在運行大型游戲時需要先清理一下內存。然而對于我們的ANDROID系統的手機而言,幾百m的總內存和幾十m的空余內存已經可以充分的滿足系統自動調配的需要,因此完全沒有必要老去殺進程、清內存。

  有人認為后臺掛著程序很費電,事實上Android的應用在被切換到后臺時,它其實已經被暫停了,并不會消耗cpu資源,只保留了運行狀態。至于QQ、音樂播放之類的程序可以在后臺運行,是因為這些程序在后臺開啟了服務,而服務可以后臺運行,所以沒有帶服務的應用在后臺是完全不耗電的,沒有必要關閉。這種設計本來就是一個非常好的設計,下次啟動程序時,會更快,因為不需要讀取界面資源。

  Android系統這樣的設計不僅非常適合移動終端的需要,而且減少了系統崩潰的可能,確保了系統的穩定性。老想著清理內存的同學完全是因為被塞班或者Windows毒害太深,事實上,經常用Taskiller之類的軟件關閉后臺所有進程,很容易造成系統的不穩定。很多時候出現問題,只要重啟就能解決,其原因也在于此。

  總之,牛B的人自己去操縱系統內存分配的閾值,普通用戶則是想怎么用就怎么用,完全不用去鳥剩余內存的問題,那些內存清理的程序完全可以扔到一邊了。對于如果有同學真的那么喜歡看著自己手機的剩余ram很大的話,可以用autokiller之類的工具,這類工具的原理不是殺進程,而是分配系統內存閾值,很簡單很好用。

3、手機慢的真正原因——CPU

  在Android里,進程和程序是兩回事,程序可以一直保留在系統里,但是沒有任何進程在后臺“運行”,也不消耗任何系統資源。所有的程序保留在內存中,所有可以更快的啟動回到它之前的狀態。當你的內存用完了,系統會自動幫你殺掉你不用的任務。

  需要明白的是,Android用RAM的方式,跟windows啥的是兩回事。在Android的世界里面,RAM被用滿了是件'好'事。它意味著你可以快速打開之前打開的軟件,回到之前的位置。所以Android很有效的使用RAM,很多用戶看到他們的RAM滿了,就認為拖慢了他們的電話。而實際上,是你的CPU——當你的軟件真正運行時用到的東東——才是拖慢手機的瓶頸。

4、進程管理軟件=禍害?

  很流行的各種進程管理軟件都說幫你釋放內存是件好事,但這是不正確的。打開這些軟件時,他們告訴你“運行”的軟件和殺死他們的方法。你也可以在“服務”里面看到到底程序的哪些部分在“運行”,占用了多少內存,剩余多少內存。所有的這些都告訴你,殺掉這些程序能夠釋放內存。但是這些軟件都沒有告訴你這些程序到底消耗了多少CPU時鐘,而僅僅告訴你能釋放多少內存。要知道,用滿了內存實際上是件好事,我們要注意的是CPU,真正消耗你的手機資源,消耗電池的東東。

  因此,殺掉程序通常是沒有必要的(尤其是用"autokill"方式殺掉程序)。更嚴重的是,這樣做會更快的拖垮你的手機能力和電池性能。不管是手動殺掉進程,還是自動的殺掉進程,重新打開程序,你實際上是在用CPU資源來做這件事。

  事實上,這些進程管理軟件消耗了系統資源。而且,這些軟件會莫名其妙的殺死其他程序造成亂七八糟的結果(尤其對些小白來說)。所有的這些,告訴我們,你的手機在用它自己的方式工作,特別是你只是個小白用戶,用這些進程管理軟件耽誤的事情比得到的要多。

5、善用快速啟動

  這么說吧,各種程序開發水平是不一樣的。很多人以前或者現在使用這些進程管理軟件,釋放內存,感覺手機快了那么一點。造成這個問題的原因是,你用的軟件本身程序寫得太爛了,比如,有得程序完全沒有必要聯網時,還在聯著。這個時候,殺掉這些程序,你能得到好處,就是說,只有你知道你在干什么得時候,殺掉讓你愛但是很爛的程序才能幫上你。

  事實上,很多開發者,包括ROM開發者,如果用了進程管理程序,當你提交bug報告時,看都不會看一眼(Cyanogen時這么干的,我不知道MIUI是不是),所以能不用就不要用了,除非你真的知道你在干什么。

  如果你真關系你的手機的表現和進程,還是多關注下系統進程,看看里面說各種程序都消耗了多少資源,如果某個程序消耗太多,時不時殺掉它可能會有那么一點幫助。

  總的來說,進程管理軟件正確的用途是殺那些出錯的程序、會導致死機有BUG的進程以及疑似病毒進程等,而不是一味地追求內存空得多程序在內存里放著,CPU不調用,它就是死的,一般程序你退出了它就不再運行了,不占用CPU資源(占用了CPU時間這個才是要耗電的),這就是2.2以上版本系統那個“快速啟動”的工作原理。

6、再說進程管理

  為什么內存少的時候運行大型程序會慢呢?其實很簡單,在內存剩余不多時打開大型程序,會觸發系統自身的調進程調度策略,這是十分消耗系統資源的操作,特別是在一個程序頻繁向系統申請內存的時候。這種情況下系統并不會關閉所有打開的進程,而是選擇性關閉,頻繁的調度自然會拖慢系統。所以,論壇上有個更改內存閥值的程序可以有一定改善。但改動也可能帶來一些問題,取決于值的設定。

  那么,進程管理軟件有無必要呢?有的。就是在運行大型程序之前,你可以手動關閉一些進程釋放內存,可以顯著的提高運行速度。但一些小程序,完全可交由系統自己管理。談到這里,可能有的朋友會問,如果不關程序是不是會更耗電。我就說說安卓Android后臺的原理,你就明白了。安卓Android的應用在被切換到后臺時,它其實已經被暫停了,并不會消耗cpu資源,只保留了運行狀態。所以為什么有的程序切出去重進會到主界面。但是,一個程序如果想要在后臺處理些東西,如音樂播放,它就會開啟一個服務。服務可在后臺持續運行,所以在后臺耗電的也只有帶服務的應用了。這個在進程管理軟件里能看到,標簽是service。所以沒有帶服務的應用在后臺是完全不耗電的,沒有必要關閉。這種設計本來就是一個非常好的設計,下次啟動程序時,會更快,因為不需要讀取界面資源,何必要關掉他們抹殺這個安卓Android的優點呢?

7、內存管理中的虛擬機

  還有一個。為什么安卓Android一個應用看起來那么耗內存。大家知道,安卓Android上的應用是java,當然需要虛擬機,而安卓Android上的應用是帶有獨立虛擬機的,也就是每開一個應用就會打開一個獨立的虛擬機。這樣設計的原因是可以避免虛擬機崩潰導致整個系統崩潰,但代價就是需要更多內存。

  以上這些設計確保了安卓Android的穩定性,正常情況下最多單個程序崩潰,但整個系統不會崩潰,也永遠沒有內存不足的提示出現。大家可能是被windows毒害得太深了,總想保留更多的內存,但實際上這并不一定會提升速度,相反卻喪失了程序啟動快的這一系統特色,很沒必要。大家不妨按我說的習慣來用用這個系統。最后推薦一款進程管理軟件,systempanel,market上能搜到,界面友好啟動快,功能也不錯,用于手動關閉進程很好的軟件。祝大家玩機愉快,這系統開十天半個月都沒問題,不是windows。

8、HOME鍵和后退鍵

  在運行一個程序時,按一下HOME鍵就可以退到桌面,一般來說按一下退出鍵也可以退到桌面,這兩者有什么區別呢?

  • 按HOME鍵,看起來似乎是退出了,但是其實這個軟件并沒有被關閉,而是轉為了后臺程序(指一般的軟件,不討論特別種類的軟件)
  • 按退出鍵,看起來也是退出沒錯,但這個軟件其實是被轉為了空置程序(音樂除外,音樂屬于有服務的特殊軟件)

  Android的所有5個程序進程的級別高低,空進程是最低的,它存在的目的是為了下次打開這個軟件的時候可以更加方便快速(這是個很好的設計目的),而一旦需要清理出更多內存空間時,它也是被系統自動的最優先清除的

  所以,大家明白了吧?一旦需要退出軟件時,如果是沒有提供退出功能的軟件,那么盡量用退出鍵退出而不是HOME鍵,并且,最重要的是,沒有必要用進程管理類軟件主動去清理空置進程,因為它本來就是為了被清理而存在,但在沒輪到它被清理之前,還可以發揮重新快速開啟的作用,一旦被你主動清理了,就連這點好處都沒有了,那么,android系統的設計師又何必要設計出這個空置程序呢?直接釋放內存不是更好么?所以,結論就是,既然它存在,就有它存在的好處!就要讓我們享受到這個好處!用進程管理主動去清除空置程序絕對是違反android系統的設計本意的,是一種可笑的傻做法!

8.1 HOME鍵

  眾所周知,android跟iphone不同,咱們的gphone是一個典型的多任務系統,既然是多任務系統,那么自然就會有一個在多任務之間切換的需要,那么大家是否真的都會這個操作呢?

  這時候,就需要用到HOME鍵了,在一個程序中的時候,比如短信息,看到幾個單詞不認識,那么就可以選中這段文字,然后復制,按HOME鍵切換到桌面,然后打開詞典,粘貼,查詢,查好后再長按HOME鍵(長按的作用是在幾個打開的程序和最近曾打開的程序之間切換),切換回短信息,這時候短信息程序不需要重新打開仍然是你剛才的界面,可以再復制然后長按切換詞典繼續查詢下一個單詞。

  這就是HOME鍵的用法,其實這是一個前后臺程序之間切換而已。

  最后,簡單的歸納一下所有內容,其實整篇文章的意思就是說,按退出鍵相當于“真正的”退出關閉程序,按HOME鍵,看起來似乎是關閉了程序,但是其實只是一種假象,程序只是被降低了僅僅“一”個等級而已,HOME更適合多任務切換用,就這么簡單。

8.2 應用

  1. 按home退出,程序保留狀態為后臺進程;按返回鍵退出,程序保留狀態為空進程。空進程的oom_adj評值高于后臺進程,更容易被系統清理。所以推薦用返回鍵退出。
  2. UC、憤怒小鳥、都市賽車之類程序本身提供關閉功能的,還是盡量主動關閉。瀏覽器、電子市場、opera mini等不提供關閉功能的,直接返回鍵退出就行。

9、獨特的進程管理策略

  Android采取了一種有別于Linux的進程管理策略,有別于Linux的在進程活動停止后就結束該進程,Android把這些進程都保留在內存中,直到系統需要更多內存為止。這些保留在內存中的進程通常情況下不會影響整體系統的運行速度,并且當用戶再次激活這些進程時,提升了進程的啟動速度。

  那Android什么時候結束進程?結束哪個進程呢?之前普遍的認識是Android是依據一個名為LRU(last recently used最近使用過的程序)列表,將程序進行排序,并結束最早的進程。XDA的樓主又進一步對這個管理機制進行研究,有了如下發現:

  1. 系統會對進程的重要性進行評估,并將重要性以“oom_adj”這個數值表示出來,賦予各個進程;(系統會根據“oom_adj”來判斷需要結束哪些進程,一般來說,“oom_adj”的值越大,該進程被系統選中終止的可能就越高)
  2. 前臺程序的“oom_adj”值為0,這意味著它不會被系統終止,一旦它不可訪問后,會獲得個更高的“oom_adj”,作者推測“oom_adj”的值是根據軟件在LRU列表中的位置所決定的;
  3. Android不同于Linux,有一套自己獨特的進程管理模塊,這個模塊有更強的可定制性,可根據“oom_adj”值的范圍來決定進程管理策略,比如可以設定“當內存小于X時,結束“oom_adj”大于Y的進程”。這給了進程管理腳本的編寫以更多的選擇。
  4. Android將進程進行了分類:
    1. 前臺進程(foreground):目前正在屏幕上顯示的進程和一些系統進程。舉例來說,Dialer Storage,GoogleSearch等系統進程就是前臺進程;再舉例來說,當你運行一個程序,如瀏覽器,當瀏覽器界面在前臺顯示時,瀏覽器屬于前臺進程(foreground),但一旦你按home回到主界面,瀏覽器就變成了后臺程序(background)。我們最不希望終止的進程就是前臺進程。
    2. 可見進程(visible):可見進程是一些不再前臺,但用戶依然可見的進程,舉個例來說:widget、輸入法等,都屬于visible。這部分進程雖然不在前臺,但與我們的使用也密切相關,我們也不希望它們被終止(你肯定不希望時鐘、天氣,新聞等widget被終止,那它們將無法同步,你也不希望輸入法被終止,否則你每次輸入時都需要重新啟動輸入法)
    3. 次要服務(secondary server):目前正在運行的一些服務(主要服務,如撥號等,是不可能被進程管理終止的,故這里只談次要服務),舉例來說:谷歌企業套件,Gmail內部存儲,聯系人內部存儲等。這部分服務雖然屬于次要服務,但很一些系統功能依然息息相關,我們時常需要用到它們,所以也太希望他們被終止
    4. 后臺進程(hidden):雖然作者用了hidden這個詞,但實際即是后臺進程(background),就是我們通常意義上理解的啟動后被切換到后臺的進程,如瀏覽器,閱讀器等。當程序顯示在屏幕上時,他所運行的進程即為前臺進程(foreground),一旦我們按home返回主界面(注意是按home,不是按back),程序就駐留在后臺,成為后臺進程(background)。后臺進程的管理策略有多種:有較為積極的方式,一旦程序到達后臺立即終止,這種方式會提高程序的運行速度,但無法加速程序的再次啟動;也有較消極的方式,盡可能多的保留后臺程序,雖然可能會影響到單個程序的運行速度,但在再次啟動已啟動的程序時,速度會有所提升。這里就需要用戶根據自己的使用習慣找到一個平衡點
    5. 內容供應節點(content provider):沒有程序實體,進提供內容供別的程序去用的,比如日歷供應節點,郵件供應節點等。在終止進程時,這類程序應該有較高的優先權
    6. 空進程(empty):沒有任何東西在內運行的進程,有些程序,比如BTE,在程序退出后,依然會在進程中駐留一個空進程,這個進程里沒有任何數據在運行,作用往往是提高該程序下次的啟動速度或者記錄程序的一些歷史信息。這部分進程無疑是應該最先終止的。

10、極端情況

  至于為什么開了大程序或者開了好幾個程序之后切換會變慢,我的理解如下:

  1. 大程序A已經開啟,占用70%內存,如果再想運行一個B,需要50%的內存,則就需要一個將A從內存中釋放或者壓縮的過程,所以表現出來的就是慢一會兒
  2. A\B\C\D\E共占用內存80%,運行新程序Z需要20%的內存,系統內存因為沒見過剩余0的時候,也就是應該剩一部分空閑內存,那么就需要從A~E這幾個程序中選擇一個或者幾個來關閉,這一過程也需要耗費系統資源,所以會慢一會兒
  3. 也就是說你手動去殺程序的時候,就是替系統在釋放內存,就算你不殺,在需要內存的時候系統也會自動釋放。
  4. 不在后臺運行的程序(沒服務的),即使不殺也不會耗電。在后臺運行的(有服務的)程序,如后臺放歌,當然會耗電。
  5. 不是說殺進程沒用,不然作者就不會推薦進程管理軟件了。哪個帶服務耗電哪個后臺一直在運行,看服務就能看出來,這樣的該殺。
  6. 以qq舉例,正常的退,會在進程管理里留下qq的運行狀態,但不耗電不占cpu,如果你只是切換出去(按HOME而不是退出)那么自然會耗電,因為程序還在運行。(qq后臺一樣后臺就是qq正常退出的時候和別的軟件一樣不完全退出會在內存里留著但是不占cpu不費電再次啟動就會非常快了這就是為什么android能超越WM6的系統的原因)

11、MinFreeManager的使用

  進程管理,推薦使用MinFreeManager,市場上就有下載,用于設置這六類進程的管理策略。

  軟件運行后有六個輸入框,在輸入框中只能輸入數字,這些數字代表了這類進程的處理策略,比如Foreground App下的輸入框顯示6,就表示,當可用內存低于6MB時,終止Foreground App。下面的類似,如Empty App下的輸入框顯示24,則表示,當內存低于24MB時,終止Empty App。

  從軟件數值的設置不難看出結束進程的有限順序:Empty>Content Provider>Hidden>Secondary Server>Visible>Foreground。

11.1 默認設置存在的一些問題:

  各類進程的管理策略的閥值相當接近:6,8,16,20,22,24,最大的相差也不到8MB,在實際程序運行中,很容易導致多種類型的進程同時被關閉。如可用內存在25時,突然啟動照相程序,系統可用內存急速,可能會導致空進程、內容供應節點、后臺進程、次要服務等同時被關閉閥值上限較低:一般手機啟動后,可用內存在50-100左右,但隨著手機的使用,可用內存會逐步減少,最后降低到24MB左右,則系統開始啟動進程管理機制,開始結束進程,但這個閥限制設在了24MB,相對來說偏低。其結果會導致系統使用一段時間后,整體速度變慢。很明顯的就是,當手機長時間使用后,開啟電話撥號,相冊,照相機等應用時,系統的反應速度極慢。

11.2 解決兩個矛盾:

  1. 拉開各進程的閥值層次,使得進程管理機制能更有效得工作
  2. 提升閥值上限,空出更多的空余內存,以提升系統整體的運行速度

11.3 進程管理策略設置原則:

  前臺進程、可見進程和次要服務是與用戶體驗息息相關的內容,這部分的進程管理策略要相對保守,給這些進程留下足夠的運行空間

  壓榨無用進程,騰出內存空間給主要程序使用

11.4適應不同的使用需要的幾種設置方式

11.4.1 游戲玩家/重度瀏覽器使用者配置:

  用戶特點:長時間專注于某一特定的,高內存需求的程序,對多任務的需求不高

  配置參數:

  1. Foreground:6
  2. Visible:8
  3. Secondary Server:16
  4. Hiden App:80
  5. Content Provider:90
  6. Empty:100

  配置理念:壓榨后臺進程,內容供應節點和空進程,將內存盡可能多得留給前臺進程和系統,提升游戲速度和瀏覽器體驗

  優點:程序啟動和運行的速度最快

  缺點:多任務處理不理想,開啟程序較多時,后臺進程會被終止

11.4.2 多任務配置:

  用戶特點:同時運行多個應用程序,需要經常在多個程序間切換

  配置參數:

  1. Foreground:6
  2. Visible:8
  3. Secondary Server:16
  4. Hiden App:20
  5. Content Provider:60
  6. Empty:100

  配置理念:壓榨空進程,給內容供應節點留有一定空間,最大限度提升后臺程序的使用空間,提升多任務的處理能力

  優點:運行多個程序時,由于可支配內存較多,后臺程序不容易被終止

  缺點:程序啟動的速度和整體系統的運行速度可能會比游戲玩家配置略慢一些,由于經常運行多任務,平時系統的響應速度會受到一定影響

11.4.3 輕度用戶/女生專用配置

  用戶特點:手機的主要功能是短信和電話,偶爾用用相機自拍

  配置參數:

  1. Foreground:6
  2. Visible:8
  3. Secondary Server:16
  4. Hiden App:24
  5. Content Provider:32
  6. Empty:48

  配置理念:壓榨空進程,給內容供應節點留有一定空間,最大限度提升后臺程序的使用空間,提升多任務的處理能力

  優點:比較均衡的配置,提升了系統的可用內存,使得系統的整體速度得到了提高,拉開了各級進程的管理策略層次,使得管理機制更有效率

  缺點:比較均衡的配置,無明顯缺點?

12、總結

12.1 快速啟動

  有著良好windows操作習慣,而又不了解Android內存管理機制的人,在使用Android系統的時候,會很在意系統的內存資源使用情況——去頻頻清除那些不使用而常駐內存的程序(進程),這樣就會忽略掉android的一個獨特的優點,進而在不知情的情況下白白消耗寶貴的手機資源。

  手機資源的寶貴,在于它的CPU,在于它的電量。不使用而常駐內存的進程,一般以后臺進程和空進程的形式存在內存中(QQ、音樂播放等是開啟了service,不同于這一情況),是不會消耗CPU和電量的,相反常駐內存有個顯著的長處,是程序在不重復消耗資源的情況下獲得了快速啟動,這是Android獨特的進程管理特點。

  而頻頻用進程管理軟件主動清除后臺和空進程是要消耗資源的,而進程的關閉和開啟也要消耗相應的資源,簡單說來,這就是用一個資源消耗的動作去實現另一個資源消耗的動作,最終導致重啟程序時第三個資源消耗動作的發生。

12.2 HOME鍵和退出鍵

  按HOME鍵,程序轉入后臺進程;

  按退出鍵,程序直接轉入空進程;

  此時進程獲得了快速啟動的功能,而不消耗任何資源

12.3 Android的進程管理機制

那是不是將程序全部以后臺和空進程的形式常駐內存就會將快速啟動這一優點發揮到最大?

  不是的,技術的進步,內存再大也是有限的,這就得說到內存管理的另一個機制——進程管理。進程按照優先級分為五類:前臺進程、可見進程、服務進程、后臺進程、空進程,從左往右優先級的值依次遞增,當內存緊張時,那么進程管理機制就會根據優先級的值,從高到低依次關閉,空進程->后臺進程->可見進程->服務進程->前臺進程,從此可見,那么對空進程和后臺進程會消耗內存資源的擔憂可以緩一緩了,因為后臺和空進程的狀態從另一面來說也可以理解為“準備關閉“的進程。

  如此,我們就可將一般的軟件交給進程管理機制自身進行管理就好了

12.4 進程管理軟件

  Android進程管理機制如此智能,但相應的軟件作為工具的存在還是有著自身的價值。

  1、大量需要內存

  當我們可預見的需要大量內存,如開啟一個消耗內存的進程(游戲)、或某一時刻開啟大量的進程時,如果這時還交由進程管理機制來處理,那么就會導致機制頻繁的檢查剩余內存、關閉進程、開啟新進程這一流程,這時不明智的。我們可以做的是,事先使用進程管理軟件,將要使用的內存一次性清理出來,再來開啟相應的進程。

  2、不良軟件

  除開上述情況,還有一種情況是,面對不良軟件,即在后臺運行也開啟消耗資源,如彈窗、耗電、走流量等服務進程,而在某一時段又不便卸載的情況下,進程管理軟件也能體現相應的價值。

12.5 開發者選項中的內存管理功能

Android手機都存在這一功能,里面有著幾項與內存管理相關的選項:

  • 不保留活動:對activity進程的限制;
  • 后臺進程限制:名字很是直白,這一功能能在一定程度上解決12.4中的問題,但是還是那句話禁用后臺進程的話本身就是禁掉了Android系統本身的特色——快速啟動;
  • 系統內存優化級別:對后臺進程的壓縮程度,越是高級壓縮越厲害,但相應的程序之間的切換也越容易卡,而且壓縮本身也是一個消耗資源的過程。所以如果程序之間切換較為頻繁,可禁用這一功能,但是如果有長時玩單一游戲的習慣的話,可以依照自身程序切換頻率設置相當的級別。

http://blog.csdn.net/breaker892902/article/details/22224243

轉載于:https://www.cnblogs.com/mamamia/p/10045055.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/250131.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250131.shtml
英文地址,請注明出處:http://en.pswp.cn/news/250131.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Ruby】Ruby 類案例

閱讀目錄 Ruby類案例保存并執行代碼Ruby類案例 下面將創建一個名為 Customer 的 Ruby 類,聲明兩個方法: display_details:該方法用于顯示客戶的詳細信息。total_no_of_customers:該方法用于顯示在系統中創建的客戶總數量。實例 #!…

[pytorch、學習] - 5.6 深度卷積神經網絡(AlexNet)

參考 5.6 深度卷積神經網絡(AlexNet) 在LeNet提出后的將近20年里,神經網絡一度被其他機器學習方法超越,如支持向量機。雖然LeNet可以在早期的小數據集上取得好的成績,但是在更大的真實數據集上的表現并不盡如人意。一方面,神經網絡計算復雜。雖然20世紀…

Springboot---Model,ModelMap,ModelAndView

Model(org.springframework.ui.Model) Model是一個接口,包含addAttribute方法,其實現類是ExtendedModelMap。 ExtendedModelMap繼承了ModelMap類,ModelMap類實現了Map接口。 public class ExtendedModelMap extends M…

東南亞支付——柬埔寨行

考察時間:2018.5.28 至 2018.6.6 為了解柬埔寨大概國情和市場,在柬埔寨開展了為期近10天的工作。 觀察了交通情況,周邊街道的店面與商品,攤販等,也走訪了大學校區,看了永旺商超、本地超市和中國超市&#x…

Puzzle (II) UVA - 519

題目鏈接: https://vjudge.net/problem/UVA-519 思路: 剪枝回溯 這個題巧妙的是他按照表格的位置開始搜索,也就是說表格是定的,他不斷用已有的圖片從(0,0)開始拼到(n-1,m-1) 剪枝的地方: 1.由于含F的面只能拼到邊上&am…

[pytorch、學習] - 5.7 使用重復元素的網絡(VGG)

參考 5.7 使用重復元素的網絡(VGG) AlexNet在LeNet的基礎上增加了3個卷積層。但AlexNet作者對它們的卷積窗口、輸出通道數和構造順序均做了大量的調整。雖然AlexNet指明了深度卷積神經網絡可以取得出色的結果,但并沒有提供簡單的規則以指導…

springboot---mybits整合

配置 POM文件 <parent> <groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.6.RELEASE</version><relativePath /> </parent><properties><proj…

使用airdrop進行文件共享

使用airdrop進行文件共享 學習了&#xff1a; https://support.apple.com/zh-cn/HT203106 https://zh.wikihow.com/%E5%9C%A8Mac%E4%B8%8A%E7%94%A8%E8%BF%91%E6%9C%BA%E6%8D%B7%E4%BC%A0%EF%BC%88Airdrop%EF%BC%89%E5%85%B1%E4%BA%AB%E6%96%87%E4%BB%B6 轉載于:https://www.cn…

【鏈表】逆序打印鏈表

1 public class Main {2 3 // 逆序打印鏈表4 public void reversePrint(Node node) {5 if (node null){6 return;7 }8 reversePrint(node.next);9 System.out.println(node.data); 10 } 11 12 public Node crea…

[pytorch、學習] - 5.8 網絡中的網絡(NiN)

參考 5.8 網絡中的網絡&#xff08;NiN&#xff09; 前幾節介紹的LeNet、AlexNet和VGG在設計上的共同之處是&#xff1a;先以由卷積層構成的模塊充分抽取空間特征&#xff0c;再以由全連接層構成的模塊來輸出分類結果。其中&#xff0c;AlexNet和VGG對LeNet的改進主要在于如何…

springboot---集成mybits方法

SpringBoot集成mybatis配置 一個有趣的現象&#xff1a;傳統企業大都喜歡使用hibernate,互聯網行業通常使用mybatis&#xff1b;之所以出現這個問題感覺與對應的業務有關&#xff0c;比方說&#xff0c;互聯網的業務更加的復雜&#xff0c;更加需要進行靈活性的處理&#xff0c…

jQuery源碼解讀

參考 &#xff1a; https://www.cnblogs.com/yuqingfamily/p/5785593.html 轉載于:https://www.cnblogs.com/wfblog/p/9172622.html

info.plist文件里面添加描述 - 配置定位,相冊等

<key>NSAppleMusicUsageDescription</key> <string>App需要您的同意,才能訪問媒體資料庫</string> <key>NSBluetoothPeripheralUsageDescription</key> <string>App需要您的同意,才能訪問藍牙</string> <key>NSCalendar…

[pytorch、學習] - 5.9 含并行連結的網絡(GoogLeNet)

參考 5.9 含并行連結的網絡&#xff08;GoogLeNet&#xff09; 在2014年的ImageNet圖像識別挑戰賽中&#xff0c;一個名叫GoogLeNet的網絡結構大放異彩。它雖然在名字上向LeNet致敬&#xff0c;但在網絡結構上已經很難看到LeNet的影子。GoogLeNet吸收了NiN中網絡串聯網絡的思…

mybits注解詳解

一、mybatis 簡單注解 關鍵注解詞 &#xff1a; Insert &#xff1a; 插入sql , 和xml insert sql語法完全一樣 Select &#xff1a; 查詢sql, 和xml select sql語法完全一樣 Update &#xff1a; 更新sql, 和xml update sql語法完全一樣 Delete &#xff1a; 刪除sql, 和xml d…

使用python裝飾器計算函數運行時間的實例

使用python裝飾器計算函數運行時間的實例 裝飾器在python里面有很重要的作用&#xff0c; 如果能夠熟練使用&#xff0c;將會大大的提高工作效率 今天就來見識一下 python 裝飾器&#xff0c;到底是怎么工作的。 本文主要是利用python裝飾器計算函數運行時間 一些需要精確的計算…

SQLServer用存儲過程實現插入更新數據

實現 1&#xff09;有同樣的數據&#xff0c;直接返回&#xff08;返回值&#xff1a;0&#xff09;。 2&#xff09;有主鍵同樣。可是數據不同的數據。進行更新處理&#xff08;返回值&#xff1a;2&#xff09;&#xff1b; 3&#xff09;沒有數據&#xff0c;進行插入數據處…

[pytorch、學習] - 9.1 圖像增廣

參考 9.1 圖像增廣 在5.6節(深度卷積神經網絡)里我們提過,大規模數據集是成功應用神經網絡的前提。圖像增廣(image augmentation)技術通過對訓練圖像做一系列隨機改變,來產生相似但又不相同的訓練樣本,從而擴大訓練數據集的規模。圖像增廣的另一種解釋是,隨機改變訓練樣本可以…

mysql綠色版安裝

導讀&#xff1a;MySQL是一款關系型數據庫產品&#xff0c;官網給出了兩種安裝包格式&#xff1a;MSI和ZIP。MSI格式是圖形界面安裝方式&#xff0c;基本只需下一步即可&#xff0c;這篇文章主要介紹ZIP格式的安裝過程。ZIP Archive版是免安裝的。只要解壓就行了。 一、首先下…

在微信瀏覽器字體被調大導致頁面錯亂的解決辦法

iOS的解決方案是覆蓋掉微信的樣式&#xff1a; body { /* IOS禁止微信調整字體大小 */-webkit-text-size-adjust: 100% !important; } 安卓的解決方案是通過 WeixinJSBridge 對象將網頁的字體大小設置為默認大小&#xff0c;并且重寫設置字體大小的方法&#xff0c;讓用戶不能在…