導航:首頁 > 軟體知識 > 為什麼程序員不能自己清理垃圾

為什麼程序員不能自己清理垃圾

發布時間:2023-05-31 05:03:51

程序員如何給電腦清理垃圾聯想電腦

使用磁碟清理

這種清理方式不需要大家打開其他任何的第三方軟體,具體的操作方式是返回計算機的桌面,然後找到「我的電腦」或者「計算機」,然後打開,找到你計算機安裝操作系統的磁碟,也就是系統盤,右鍵點擊系統盤,選擇屬性按鈕,此時計算機就會彈出一個關於進行磁碟清理的對話框了。點擊磁碟清理功能之後,我們等待計算機掃描系統,掃描完畢後選擇自己要清理的所有文件,點擊確定開始清理文件即可。

軟體清理

使用軟體進行電腦的垃圾清理我想是每個人都最熟悉的一種方式,具備垃圾清理的第三方軟體往往都是安全防護軟體或者殺毒軟體,比如360安全衛士或者金山衛士以及金山毒霸都能夠進行垃圾清理。在本文當中,小編以360安全衛士向大家講解。首先打開360安全衛士的主界面,在360安全衛士的主界面中找到清理垃圾的功能,當我們打開安全防護軟體的垃圾清理功能時,軟體就會自動開始掃面計算機內部存儲的垃圾文件,一般情況下我們登上大約半分鍾軟體就可以掃描完畢。當計算機掃描完畢之後,點擊開始清理即可完成計算機的垃圾清理。

加快計算機運行速度的小訣竅

使用計算機的過程中,安裝各種各樣的程序和軟體是非常正常的事情,但是大部分的程序和軟體在安裝時都會默認自啟動,且安裝路徑默認都是系統盤的特定位置,如果我們不進行修改,時間一長這些軟體運行的時候就會嚴重影響計算機系統的運行速度的。為此,在安裝軟體的時候,首先要做的就是更改該軟體的安裝路徑,同時將自啟動的功能取消。一般我們可以專 門 騰出一個磁碟來給第三方軟體作為安裝的場所,但一定不要將所有的軟體都安裝到系統盤當中就可以了。

通過上面的方法和小技巧,你的計算機必然能夠在很多情況下保持順暢地運行,雖然大部分的安全防護軟體和殺毒軟體都會自動提醒你清理垃圾,但是我們也要經常注意清理計算機內部拖累系統運行的文件。

⑵ java的垃圾回收機制是否允許程序員指定回收並立即回收不用的內存嗎指定回收就馬上能回收嗎

1. 引用計數器演算法
解釋
系統給每個對象添加一個引用計數器,每當有一個地方引用這個對象的時候,計數器就加1,當引用失效的時候,計數器就減1,在任何一個時刻計數器為0的對象就是不可能被使用的對象,因為沒有任何地方持有這個引用,這時這個對象就被視為內存垃圾,等待被虛擬機回收
優點
客觀的說,引用計數器演算法,他的實現很簡單,判定的效率很高,在大部分情況下這都是相當不錯的演算法
其實,很多案例中都使用了這種演算法,比如 IOS 的Object-C , 微軟的COM技術(用於給window開發驅動,.net裡面的技術幾乎都是建立在COM上的),Python語言等.
缺陷
無法解決循環引用的問題.
這就好像是懸崖邊的人採集草葯的人, 想要活下去就必須要有一根繩子綁在懸崖上. 如果有兩個人, 甲的手拉著懸崖, 乙的手拉著甲, 那麼這兩個人都能活, 但是, 如果甲的手拉著乙, 乙的手也拉著甲, 雖然這兩個人都認為自己被別人拉著, 但是一樣會掉下懸崖.
比如說 A對象的一個屬性引用B,B對象的一個屬性同時引用A A.b = B() B.a = A(); 這個A,B對象的計數器都是1,可是,如果沒有其他任何地方引用A,B對象的時候,A,B對象其實在系統中是無法發揮任何作用的,既然無法發揮作用,那就應該被視作內存垃圾予以清理掉,可是因為此時A,B的計數器的值都是1,虛擬機就無法回收A,B對象,這樣就會造成內存浪費,這在計算機系統中是不可容忍的.
解決辦法
在語言層面處理, 例如Object-C 就使用強弱引用類型來解決問題.強引用計數器加1 ,弱引用不增加
Java中也有強弱引用
2. 可達性分析演算法
解釋
這種演算法通過一系列成為 "GC Roots " 的對象作為起始點,從這些節點開始向下搜索所有走過的路徑成為引用鏈(Reference Chain) , 當一個對象GC Roots沒有任何引用鏈相連(用圖論的話來說就是從GC Roots到這個對象不可達),則證明此對象是不可用的
優點
這個演算法可以輕松的解決循環引用的問題
大部分的主流java虛擬機使用的都是這種演算法
3. Java語言中的GC Roots
在虛擬機棧(其實是棧幀中的本地變數表)中引用的對象
在方法區中的類靜態屬性引用對象
在方法區中的常量引用的對象
在本地方法棧中JNI(即一般說的Native方法)的引用對象

⑶ 5、垃圾回收機制

JVM的垃圾回收機制主要涉及三個方面的問題:
1.JVM有哪些垃圾回收演算法?各自有什麼優勢?
2.CMS垃圾回收器是如何工作的?有哪些階段?
3.服務卡頓的元兇到底是什麼?
Java不用程序來管理內存的回收,但這些內存是如何回收的?
其實,JVM有純態專門的線程在做這件事情。當內容空間達到一定條件時,會自動觸發,這個過程就叫GC,負責GC的組件被稱為垃圾回收器。JVM規范沒有規定垃圾回收器怎麼實現,它只需要保證不要把正在使用的對象回收掉就可以。在現在的伺服器環境中,經常被使用的垃圾回收器有CMS和G1,但JVM還有其它幾個常見的垃圾回收器。
GC的過程是先找到活躍的對象,然後把其他不活躍的對象判定為垃圾,然後刪除,所以GC只與活躍的對象有關,和堆的大小無關。
接下來學習下分代垃圾回收的內存劃分和GC過程,再有就是常見的垃圾回收器。
這篇比較重要,因為幾乎所有的垃圾回收器都是在這些基本思想上演化出來的。

GC的第一步就是找出活躍的對象,根據GC Roots遍歷所有的可達對象,這個過程就叫作標記。

如上圖所示,圓圈代表對象,綠色的代表GC Roots,紅色的代表可以追溯到的對象,標記後,有多個灰色的圓圈,代表都是可被回收的對象。

清除階段就是把未被標記的對象回收掉。
這種方式有一個明顯的問題,會產生碎片空間。
比如申請了1k、2k、3k、4k、5k的內存

由於某些原因,2k和4k的內存不再使用,交給垃圾回收器回收。

解決碎片問題,就需要進行內存整理。
有一個思路就是提送一個對等的內存空間,將存活的對象復制過去,然後清除員內存空間。
程序設計時,一般遇到擴縮容或者碎片整理問題時,復制演算法都是非常有效的。比如:HashMap的擴容使用的是同樣的思路,Redis的rehash也是如此。
整個過程如下圖

這種方式看似完美,解決了碎片問題,但是弊端也非常明顯,它浪費了一半的內存空間來做這個事情,如果原本資源就有限,這就是一種無法容忍的浪費。

不用分配一個對等的空間也是可以完成內存的整理工作。
可以把內存想像做歲源成一個非常大的數組,根據隨機的index刪除了一些數據,那麼對數組的清理不需要另外一個數組來進行支持的,使用程序就可以。
主要思路是移動所有的存活對象,且按照內存地址順序依次排列,然後將末端內存地址以後的內存全部收回。

對象的引用關系一般是非常復雜的,從效率上來說,一般整理演算法是要低於復制演算法的。
JVM的垃圾回收器,都是對以上幾種樸素演算法的結合使用,簡單看一下它們的特點:

效率一般,缺點是回造成內存碎片的問題。

復制演算法是所有演算法裡面效率最高的,缺點是造成一定的空間浪費。

效率比前兩者要差,但沒有空間浪費,也消除了內存碎片問題。

所以沒有最優的演算法,只有最合適的演算法。

JVM是計算節點,而不是存儲節點。最理想的情況就是對象使用完成之後,它的生命周期立馬就結束了,而那些被頻繁訪問的資源,我們希望它能夠常駐在內存里。
對象大致可以分為兩類:
1.大部分對象的生命周期都很短
2.其他對象則很可能會存活很長時間

現在的垃圾回收器都會在物理上或者邏輯上,把這兩類對象進行分區。我們把死的快的對象所佔的區域叫年輕代(Young Generation)。把其他活的長的對象所佔的區域叫作老年代(Old Generation),老年代在有時候會叫作Tenured Generation。

年輕代使用的垃圾回收演算法是雀襲復制演算法,因為年輕代發生GC後,會有非常少的對象存活,復制這部分對象是非常高效的
年輕代的內部分區

如圖所示,年輕代分為:一個伊甸園空間(Eden),兩個倖存者空間(Survivor)。
當年輕代中的Eden區分配滿的時候,就會觸發年輕代的GC(Minor GC),具體過程如下
1.在Eden區執行了第一次GC之後,存活的對象會被移動到其中一個Suvivor分區(from);
2.Eden區再次GC,這是會採用復制演算法,將Eden和from區一起清理,存活的對象會被復制到to區;接下來只需要清空from區就可以了
在整個過程中總會有一個Survivor分區是空置的。Eden、from、to的默認比例是8:1:1,所以只會造成10%的空間浪費。
這個比例是由參數-XX:SurvivorRatio進行配置的(默認為8)。
補充下不常提到的TLAB。TLAB全稱是Thread Local Allocation Buffer,JVM默認給每個線程開辟一個buffer區域,用來加速對象分配。這個buffer就放在Eden區中。
這個道理和Java語言中的ThreadLocal類似,避免了對公共區的操作,以及一些鎖競爭。

老年代一般使用"標記-清除"、"標記-整理"演算法。因為老年代的對象存活率一般是比較高的,空間又比較大,拷貝起來並不劃算,不如採取就地收集的方式。
對象進入老年代的途徑分類

如果對象夠老,會通過"提升"進入老年代。關於對象老不老,是通過它的年齡來判斷的。每發生一次Minor GC,存活下來的對象年齡都會加1,直到達到一定的閥值,就會提升到老年代,
這些對象如果變的不可達,直到老年代發生GC的時候才會被清理掉。
這個閥值可以通過參數 -XX:+MaxTenuringThreshold進行配置,最大值是15,因為它是用4bit存儲的(所以把這個值調的很大的文章,是沒有什麼根據的)。

每次存活的對象,都會放入其中一個倖存區,這個區域默認比例是10%,但無法保證每次存活的對象都小於10%,當Survivor空間不夠,就需要依賴其它內存(老年代)進行分配擔保。這個時候,對象也會直接在老年代上分配。

超出某個大小的對象直接在老年代分配,通過參數設置-XX:PretenureSizeThreshold進行配置的,默認為0,默認全部在Eden區進行分配。

有的垃圾回收演算法,並不要求age必須達到15才能晉升到老年代,它會使用一些動態的計算方法。比如,如果倖存區中相同年齡對象大小的和,大於倖存區的一半,大於或者等於age的對象將會直接進入老年代。
這些動態判定一半不受外部控制

對象的引用關系時一個巨大的網狀,有的對象在Eden區,有的可能在老年代,那麼這種跨代的引用是如何處理的呢?由於Minor GC是單獨發生的,如果一個老年代的對象引用了它,如何確保能夠讓年輕代的對象存活呢?
對於是、否的判斷,我們通常都會用到Bitmap(點陣圖)和布隆過濾器來加快搜索的速度,需要另外再學習下(如果不知道這兩個概念的話)
JVM也是用了類似的方法。其實,老年代是被分成眾多的卡頁(Card Page)的(一般數量是2的次冪)
卡表(Card Table)就是用於標記卡頁狀態的一個集合,每個卡表對應一個卡頁。
如果年輕代有對象分配,而且老年代有對象指向這個新對象,那麼這個老年代對象所對應內存的卡頁就會被標識為dirty,卡表只需要非常小的存儲空間就可以保留這些狀態,垃圾回收時,就可以先讀這個卡表,進行快速的判斷。

接下來學習HotSpot的幾個垃圾回收器,每種回收器都有各自的特點。在平常的GC優化時,一定要清楚現在用的是那種垃圾回收器。
下圖包含了年輕代和老年代的劃分,方便接下來的學習參考

處理GC的只有一條線程,並且在垃圾回收的過程中暫停一切用戶線程。
這是最簡單的垃圾回收器,雖然簡單,但十分高效,通常用在客戶端應用上。因為客戶端應用不會頻繁創建很多對象,用戶也不會感覺出明顯的卡頓。相反,它使用的資源更少,也更輕量級。

ParNew是Serial的多線程版本,由多條GC線程並行地進行垃圾清理。清理過程依然要停止用戶線程。追求低停頓時間,與Serial唯一區別就是使用了多線程進行垃圾回收,在多CPU環境下性能比Serial會有一定程度的提升;但線程切換需要額外的開銷,因此在單CPU環境中表現不如Serial。

另一個多線程版本的垃圾回收器。但與ParNew是有區別的
1.Parallel Scavenge:追求CPU吞吐量,能夠在較短時間內完成指定任務,適合沒有交互的後台計算,弱交互強計算。
2.ParNew:追求降低用戶停頓時間,適合互動式應用,強交互弱計算。

與年輕代的Serial垃圾回收器對應,都是單線程版本,同樣適合客戶端使用。
年輕代Serial,使用復制演算法。
老年代的Old Serial,使用標記-整理演算法。

Parallel Old回收器是Parallel Scavenge 的老年代版本,追求CPU吞吐量。

CMS(Concurrent Mark Sweep)回收器是以獲取最短GC停頓時間為目標的收集器,它在垃圾回收時使得用戶線程和GC線程能夠並發執行,因此在垃圾回收過程中用戶也不會感到明顯的卡頓。
長期看來,CMS垃圾回收器,是要被G1等垃圾回收器替換掉的,在Java8之後,使用它將會拋出一個警告!

除了上面幾個垃圾回收器,我們還有G1、ZGC等更加高級的垃圾回收器,它們都有專門的配置參數來使其生效。
通過-XX:PrintCommandLineFlags參數,可以查看當前Java版本默認使用的垃圾回收器。在Java13中,默認的回收器就是G1。
以下是一些配置參數:
1.-XX:+UseSerialGC 年輕代和年老代回收器
2.-XX:+UseParNewGC 年輕代使用ParNew,老年代使用Serial Old。
3.-XX:+UseParallelOldGC 年輕代和老年代哦都市用並行回收器。
4.-XX:+UseConcMarkSweepGC 表示年輕代使用ParNew,老年代使用CMS。
5.-XX:+UseG1GC 使用G1垃圾回收器
6.-XX:+UseZGC 使用ZGC垃圾回收器

這些垃圾回收器的關系還是比較復雜的,請看下圖

目前Java8還是主流使用版本,從Java8升級到高版本的Java體系是有一定成本的,所以CMS垃圾回收器還會持續一段時間

拋個問題,如果在垃圾回收的時候,又有新的對象進入怎麼辦?
為了保住程序不亂套,最好的辦法就是暫停用戶的一切線程,也就是在這段時間,是不能new對象的,只能等待,表象是在JVM上就是短暫的卡頓,什麼都幹不了,這個現象叫作Stop The World。
標記階段,大多數是要STW的。如果不暫停用戶進程,在標記對象的時候,有可能有其它用戶線程會產生一些新的對象和引用,造成混亂。
現在的垃圾回收器,都會盡量去減少這個過程。但即使最先進的ZGC回收器,也會有短暫的STW過程。我們要做的就是在現有基礎設施上,盡量減少GC停頓。
舉例說明下
某個高並發服務的峰值流量是10萬次/秒,後面有10台負載均衡的機器,那麼每台機器平均下來需要1w/s。假如某台機器在這段時間內發生了STW,持續了一秒,那麼至少需要10ms就可以返回的1萬個請求,需要至少等待1秒。

在用戶那裡的表現就是系統發生了卡頓。如果我們的GC非常的頻繁。這種卡頓就會特別的明顯,嚴重影響用戶體驗。
雖然說Java為我們提供了非常棒的自動內存管理機制,但也不能濫用,因為它是有STW硬傷的。

介紹了堆的具體分區,年輕代和老年代。介紹了多個常用的垃圾回收器,不同的垃圾回收器有不同的特點。各種垃圾回收器都是為了解決頭疼的STW問題,讓GC時間更短,停頓更短,吞吐量更大。
接觸了很多名詞,總結如下

1.Mark
2.Sweep
3.Copy
4.Compact

1.Young generation
2.Survivor
3.Eden
4.Old Generation |Tenured Generation
5.GC
--1.Minor GC
--2.Major GC

1.weak generational hypothesis
2.分配擔保
3.提升
4.卡片標記
5.STW

⑷ Java垃圾回收的優點和原理

Java語言中一個顯著的特點就是引入了垃圾回收機制,使c++程序員最頭疼的內存的問題迎刃而解,它使得Java程序員在編寫程序的時候不再需要考慮內存管理。



由於有個垃圾回收機制,java課程發現Java中的對象不再有「作用域」的概殲緩鋒念,只有對象的引用才有「作用域」。垃圾回收可以有效的防止內存泄露,有效的使用可以使用的內存。垃圾回收器通常是作為一個單獨的低級別的線程運行,不可預知的情況下對內存堆中已經死亡的或哪核者長時間沒氏晌有使用的對象進行清除和回收,程序員不能實時的調用垃圾回收器對某個對象或所有對象進行垃圾回收。


回收機制有分代復制垃圾回收和標記垃圾回收,增量垃圾回收。


⑸ java垃圾回收 什麼時候執行

Java的垃圾回收機制是Java虛擬機提供的能力,用於在空閑時間以不定時的方式動態回收無任何引用的對象占據的內存空間。
需要注意的是:垃圾回收回收的是無任何引用的對象占據的內存空間而不是對象本身,很多人來我公司面試時,我都會問這個問題的,70%以上的人回答的含義是回收對象,實際上這是不正確的。
System.gc()
Runtime.getRuntime().gc()
上面的方法調用時用於顯式通知JVM可以進行一次垃圾回收,但真正垃圾回收機制具體在什麼時間點開始發生動作這同樣是不可預料的,這和搶占式的線程在發生作用時的原理一樣。

⑹ C#類實例化並調用完後怎麼釋放

一般來說你不用返緩山自己去釋放哪判,因為C#是託管編程,有自己的垃圾漏中回收機制,會定期自動清理釋放沒有用的內存。
它不像c++,需要程序員自己申請和釋放,否則就可能引發內存泄露。

⑺ 程序員怎麼清理電腦垃圾

電腦清理系統垃圾,只需要安裝電腦管理軟體就可以了,操作非常簡單。不要看網上那些代碼清理,都是吸引眼球賺流量的。

⑻ 電腦怎麼清理垃圾使電腦變得快

普通人清理電腦垃圾:

360安全衛士——垃圾清理——一鍵清理——完成。

程序員清理垃圾:

第一步:「Windows+R」打開電腦運行,然後在運行框輸入「%TEMP%」,然後點擊「確定」,接全選彈出的文件,這些文件都是系統的臨時垃圾文件,把這些文拆鬧件刪除就可以了。

第二步:打開任務管理器——文件——運行——輸入「cmd」——輸入「chkdsk」並按回車(稍等一會)——接著輸入「sfc/scannow」並按回車。

第三步:清理微信或旅旦罩者QQ中的緩存文件,包括聊天記錄、圖片、視頻、文檔等。步驟如下:

打開「我的電腦」——打開「C盤」——在搜索框內搜索「Tencent」,或者你知道你的微信和QQ的緩存文件在哪裡,直接打開就行——然後打開「Wechat」或者「QQ」,找到裡面的圖片、視頻、文檔等文件,然後刪除即可。

舉個例子,C:\Users\Administrator\Documents\WeChat Files這是我的電腦微信的緩存地址。找到之後,裡面很多東西可遲戚以刪除。不能刪除的是:Msg文件夾、resupdatev2文件夾、這些是絕對不能刪除的!!!!!

⑼ 程序員如何清理電腦垃圾

1、輸入%temp%命令法。

%temp%這個是系統的環境變數,對應的是C:\DocumentsandSettings\Administrator\LocalSettings\Temp文件夾,當它在運行%temp%,你就要打開這個文件夾。那裡是安裝軟體等工作時留下來的臨時文件,可會幫你進行清理。點左下角的「開始」--「運行」,輸入「%temp%」(引號內的)。這個時候就要點「確定」就會跳出C盤中的垃圾文件,然後要將它全選並刪除。

2、磁碟清理法。

當你點擊「開始→運行」,這個時候就要在「運行」中輸入:「cleanmgr/SAGERUN:99」,這時你的系統就會執行清理磁碟工具的「特別模式」。然後你要記得按回車,這樣就可以快速執行系統垃圾文件清理,同時也是會依次彈出多個對話框。如果你是要選擇性清理,那麼你就要在運行對話框中輸入:「cleanmgr/sageset:99」後回車,這個時候就會出現很多清理選擇,你只要選擇需要清理的文件就可以了。

3、運行cookies命令法。

打開電腦左下角的開始,這個時候才能進入到運行狀態,輸入cookies,點確定就可以了,然後將彈框中的文件全部拉黑刪除就完成了。當你在清理cookies還可保護你的隱私,同時能夠起到防止泄密的作用。

4、檢查事件查看器法。

點開始,然後要找到控制面板。打開後,找「性能與維護」、找「管理工具」找到事件查看器。這個時候要雙擊左鍵點開,在對話框中將滑鼠放到應用程序上,可以將無用的清除。

閱讀全文

與為什麼程序員不能自己清理垃圾相關的資料

熱點內容
專業訴訟代理律師怎麼選 瀏覽:834
平度市開發區哪裡有二手車市場 瀏覽:272
淘寶交易延長多久 瀏覽:341
為什麼韻達寄快遞要在小程序上寄 瀏覽:572
電表換個名字需要什麼程序 瀏覽:29
江蘇有什麼電流測量儀表代理商 瀏覽:63
套數據用的公式有哪些 瀏覽:419
設計引流產品怎麼做 瀏覽:853
哪裡有古老古董市場 瀏覽:807
百色東盟農貿市場是哪個公司投資 瀏覽:71
情侶空間小程序入口蘋果怎麼進 瀏覽:641
開拓市場怎麼那麼難 瀏覽:825
學生注冊企業微信程序是什麼 瀏覽:159
回信息一個嗯和嗯嗯有什麼區別 瀏覽:457
日本的內燃機車市場什麼樣子的 瀏覽:655
相冊製作小程序怎麼做 瀏覽:556
怎麼樣用ug設計產品 瀏覽:741
如何一個表的數據導到另一個表裡 瀏覽:43
倉庫保管技術有哪些 瀏覽:350
申請離婚的程序有什麼風險 瀏覽:502