java基礎知識系列---垃圾收集

1 為什么要使用垃圾回收機制?

“垃圾收集”暗示程序不再需要的對象就是垃圾,可以被丟棄。更精確,更新的說法是“內存回收”。

1.1 新對象的使用

當一個對象不再被程序所引用時,他所使用的堆空間可以被回收,以便于被后續的新的對象使用。垃圾回收必須能判斷哪些對象是不再被引用的,并且能夠把他們所占據的堆空間釋放出來,在釋放不再被引用的對象的過程中,垃圾收集器運行將要被釋放的對象的終結方法(finalizer)

1.2 處理堆碎片

除了釋放不再被引用的對象之外,垃圾收集器還要處理堆碎片。堆碎片實在正常程序運行過程中產生的。新的對象分配了空間,不再被引用的對象被釋放,所以堆碎塊的空間位置介于活動的對象之間。請求分配新對象時可能不得不增大堆空間的大小,雖然可以使用的總空間是足夠的。因為,堆中沒有連續的空閑放得下新的對象。在一個虛擬機內存系統中,增長的堆所需要的額外分頁(或交換)空間會影響運行程序的性能。

1.3 使用垃圾收集的有點和缺點

優點:把用戶從釋放占用內存的重擔中解放出來

? ? ? ? 在一定程序上幫助程序保持完整性(是java安全策略一個重要的組成部分)

缺點:加大了程序的負擔,可能會影響性能。虛擬機在追蹤哪些對象被正在執行的程序所引用,并且動態的終結不再被使用的對象。和明確釋放不再被使用的內存比起來,這個活動會需要更多的CPU時間。

2 垃圾收集算法

? ? ? 任何垃圾收集算法都必須完成倆件事情,首先,他必須檢測出垃圾對象。其次,他必須回收垃圾對象所使用的堆空間并且還給程序。

? ? ? 垃圾檢測通常通過建立一個根對象的集合并且檢查從這些根對象開始的可觸及性來實現。(可觸及性:如果正在執行的程序可以訪問到的根對象和某個對象之間存在引用路徑)。對于程序來說,根對象總是可以被訪問的。從這些根對象開始,任何可以被觸及的對象都被認為是“活動”的對象。無法觸及的對象被認為是垃圾,因為他們不再影響程序的未來執行。

  區分活動對象和垃圾的基本方法是引用計數和跟蹤。

2.1 引用計數收集器

  在這種方法中,堆中每一個對象都有一個引用計數。當一個對象唄創建了,并且指向該對象的引用被分配了一個變量,這個對象的引用計數被置為1。當其他任何變量被賦值為對這個對象的引用時,計數加1.當一個對象的引用超過了生存期或者被設置一個新的值時,對象的引用計數減1。任何引用計數為0的對象都可以當成垃圾進行回收。當一個對象被垃圾收集的時候,他引用的任何對象計數值減1。這種方法中,一個對像被垃圾回收之后可能會導致后續其他對象的垃圾收集行動。

  優缺點:可以很快的執行,交織在程序的運行之中。這個特性對于程序不能被長時間打斷的實時環境很有利。壞處就是,引用計數無法檢測出循環(倆個對象或者更多對象的相互引用)。目前該技術已經不為人接受了

2.2 跟蹤收集器

  跟蹤收集器追蹤從根節點開始的對象引用圖。在追蹤過程中遇到的對象以某種方式打上標記。總的來說,要么在對象本身設置標記,要么用一個隊里的位圖來設置標記。當追蹤結束時,未被標記的對象就知道是無法觸及的,從而被收集。

  基本的追蹤算法被稱作“標記并清除”。在標記階段,垃圾收集器遍歷引用樹,標記每一個遇到的對象。在清除階段,未被標記的對象被釋放,使用的內存被返回到正在執行的程序。清除步驟 必須包括對象的終結。

2.3 壓縮收集器

  這種方法用來簡化消除堆碎塊的工作,但是每一次對象訪問都會帶來性能的損失。

  標記并清除收集器通常使用的倆種策略是壓縮和拷貝。這倆種方法都是快速的移動對象來減少碎塊。壓縮收集器吧活動的對象越過空間滑動到堆的一端,在這個過程中,堆的另一端就會出現一個大的連續空閑區,所有被移動的對象的引用會被更新,指向新的位置。

2.4 拷貝收集器

  拷貝收集器吧所有的活動對象移動到一個新的區域。再考唄過程中,他們緊挨著布置,所以可以消除原本他們在就區域的空隙。原有的區域被認為都是空閑區。這種方法的好處是對象可以在從跟對象開始的遍歷過程中隨著發現而被拷貝,不再有標記和清除的區分。

  一般的拷貝收集器算法被稱為“停止并拷貝”。

2.5 按代收集的收集器

  在非常早的時候,我們看到過許多“分配慢”的意見 —— 因為就像早期 JVM 中的一切一樣,它確實慢 —— 而性能顧問提供了許多避免分配的技巧,例如對象池。(公共服務聲明:除了對最重量的對象之外,對象池現在對于所有對象都是嚴重的性能損失,而且要在不造成并發瓶頸的情況下使用對象池也很需要技巧。)但是,從 JDK 1.0 開始已經發生了許多變化;JDK 1.2 中引入的分代收集器(generational collector)支持簡單得多的分配方式,可以極大地提高性能。

  特征:

1) 大多數程序所創建的大部分對象都只有很短的生命周期
2) 大多數程序都創建一些具有非常長生命周期的對象

  按代收集的收集器通過把對象按照壽命來分組解決這個效率低下的問題,更多的收集那些短暫出現的年幼對象,而非壽命較長的對象。在這種方法里,堆被劃分為兩個或者更多的子堆,每一個子堆為一“代”對象服務。最年幼的那一代進行最頻繁的垃圾收集。因為大多數對象都是短促出現的,只有很小部分的年幼對象可以在它們經歷第一次收集后存活。如果一個最年幼的對象經歷了好幾次垃圾收集后仍然存活,那么這個對象就成長為壽命更高的一代;它被轉移到另外一個子堆中去。年齡更高的每一代的收集都沒有年輕的那一些來的頻繁。每當對象在它所屬的年齡層(代)中變得成熟(逃過了多次垃圾收集)之后,它們就被轉移到更高的年齡層中去。

2.6 自適應收集器

自適應收集器利用如下事實:在某種情況下某些垃圾收集算法工作的更好,而另外一些收集算法在另外的情況下工作更好。自適應算法監視堆中的情形,并且對應的調整為合適的垃圾收集技術。核心在于不同的情況下,使用這些算法最擅長的場景使用。

3 火車算法

垃圾收集算法和明確釋放對象比起來有一個潛在的缺點,即垃圾收集算法中程序員對安排CPU時間進行內存回收缺乏控制。

火車算法是分代收集器所用的算法,目的是在成熟對象空間中提供限定時間的漸進收集。那么為什么要使用漸進收集呢?因為大范圍的垃圾回收會占用大量的資源和時間,可能會導致暫停和無法滿足系統實時性的要求,因此使用漸進收集。

車廂,火車和火車站

火車算法把成熟對象空間劃分為固定長度的內存塊,算法每次在一個塊中單獨執行。每個塊屬于一個集合。

塊被叫車廂,集合被叫做火車,成熟對象空間是火車站。

火車被排序,塊被附加到火車的尾部

這種方式表示出了成熟對象空間內所有塊的總體排序。

車廂收集

火車算法執行的時候,要么收集最小數字火車中的最小數字車廂,要么收集整個最小數字火車。

如果整個火車都是垃圾對象,那么整個火車都被收集。否則,收集最小數字車廂。

收集最小數字車廂時,如果發現該車廂內部有被其他車廂引用對象則會轉移到引用的車廂,如此循環,最后收集整個車廂。

收集最小數字火車時,如果發現該火車內有被其他火車引用對象則會轉移到引用的火車,如此循環,最后收集整個火車。

?

?

記憶集合和流行對象

為了促進收集過程,火車算法使用了記憶集合。一個記憶集合是一個數據結構,包含所有對一節車廂或者一列火車的外部引用。一個空的記憶集合表明車廂或者火車中的對象都不再被車廂或者火車外的任何變量引用,可以被垃圾收集。

?

轉載于:https://www.cnblogs.com/myadmin/p/5798524.html

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

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

相關文章

經濟

聯合國,美蘇英法中 國家要外匯儲備干什么? 01年加入WTO ,美國躲開 WTO 另起爐灶 TPP 諾貝爾經濟學獎得主 克魯格蠻 觸動利益比觸動靈魂還困難 SDR IMF 轉載于:https://www.cnblogs.com/zrui513/p/5014593.html

wxpython的sizer_wxPython BoxSizer布局

Box wx.BoxSizer(wxHORIZONTAL) Box wx.BoxSizer(wxVERTICAL)Add() 方法(從wxSizer繼承)它附加到sizer的下一行/列。Box.Add(control, proportion, flag, border)proportion 參數控制的控件響應于所述容器的尺寸改變其大小。各種flag 參數的組合決定控件在sizer的外觀。下面是…

NYOJ 6 噴水裝置(一)

噴水裝置(一) 時間限制:3000 ms | 內存限制:65535 KB 難度:3描述 現有一塊草坪,長為20米,寬為2米,要在橫中心線上放置半徑為Ri的噴水裝置,每個噴水裝置的效果都會讓以它為…

如何部署Zabbix服務端

部署環境 RHEL 6.7 Zabbix-server 2.2.14 安裝zabbix官方源 # wget http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-release-2.2-1.el6.noarch.rpm # rpm -ivh zabbix-release-2.2-1.el6.noarch.rpm 安裝zabbix-server # yum install zabbix zabbix-server-mysql zab…

Google App Engine上的Spring MVC和REST

前段時間,我寫了一篇關于如何使用Spring MVC實現Restful Web API的文章 。 閱讀我以前的文章以了解它。 在那篇文章中,開發了一個簡單的Rest示例。 為了測試該應用程序,將文件復制到Web服務器(例如Tomcat )中&#xff…

SALT+HASH撒鹽加密

#region 撒鹽加密string salt Guid.NewGuid().ToString();byte[] passwordAndSaltBytes System.Text.Encoding.UTF8.GetBytes(model.Password salt);byte[] hashBytes new System.Security.Cryptography.SHA256Managed().ComputeHash(passwordAndSaltBytes);string hashStr…

python 子串是否在字符串中_python七種方法判斷字符串是否包含子串

1. 使用 in 和 not inin 和 not in 在 Python 中是很常用的關鍵字,我們將它們歸類為 成員運算符。使用這兩個成員運算符,可以很讓我們很直觀清晰的判斷一個對象是否在另一個對象中,示例如下:>>> "llo" in &quo…

NYOJ 8 一種排序

一種排序 時間限制:3000 ms | 內存限制:65535 KB難度:3描述現在有很多長方形,每一個長方形都有一個編號,這個編號可以重復;還知道這個長方形的寬和長,編號、長、寬都是整數;現在要…

css3中的background

對background的兩種運用:一是background中的線性漸變,background: linear-gradient(to bottom,#0e7bef,#0d73da);這個是對背景顏色從上到下的一種線性漸變(linear-gradient),兩個顏色參數是從第一個顏色參數漸變到第二…

Oracle JRockit Mission Control 4.1發布

Oracle發布了以前的僅JRockit專用工具Mission Control Suite(JRMC)的新版本。 4.1版本是次要版本升級,直接遵循4.0.1(該版本發布于2010年中期)。 但是,即使版本號表明是次要的升級,您仍然可以在…

pe安裝usb3.0驅動_電腦店U盤啟動盤制作工具下載安裝須知

電腦店U盤啟動盤制作工具集成最全面的硬件驅動,精心挑選的系統維護工具,加上獨有人性化的設計,具備較強的兼容性、穩定性和安全性。能夠完美兼容臺式機、品牌機及筆記本等新老機型,且安全無毒,電腦店一鍵U盤啟動盤制作…

Webwork【02】前端OGNL試練

1.OGNL 出現的意義 在mvc中,數據是在各個層次之間進行流轉是一個不爭的事實。而這種流轉,也就會面臨一些困境,這些困境,是由于數據在不同世界中的表現形式不同而造成的: a. 數據在頁面上是一個扁平的,不帶數…

python ATM購物程序

需求: 模擬實現一個ATM 購物商城程序 額度 15000或自定義實現購物商城,買東西加入 購物車,調用信用卡接口結賬可以提現,手續費5%每月22號出賬單,每月10號為還款日,過期未還,按欠款總額 萬分之5…

NYOJ 10 skiing

skiing 時間限制:3000 ms | 內存限制:65535 KB難度:5描述Michael喜歡滑雪百這并不奇怪, 因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或…

Spring的REST服務發現性,第5部分

這是有關使用Spring 3.1和Spring Security 3.1和基于Java的配置來建立安全的RESTful Web Service的系列文章的第五篇。 上一篇文章介紹了RESTful服務HATEOAS的可發現性的概念,然后介紹了一些由測試驅動的實際方案。 本文將重點介紹可發現性的實際實現以及使用Spring…

postman使用_postman如何使用集合斷言?

在postman中,大家都使用過斷言,但是我們使用的斷言都是針對每一個接口或者是每一個用例添加的,那么是否有可以同時對多個用例或接口添加斷言呢 ? 答案是肯定有的。那么接下來我就帶領大家認識下Postman中的批量斷言,也…

紀念我的leetcode開門之旅

15.12.3在朋友的建議下開始了leetcode之旅,上面的題目先撿簡單的刷吧。。。轉載于:https://www.cnblogs.com/thewaytomakemiracle/p/5016825.html

NYOJ 16 矩形嵌套

矩形嵌套 時間限制&#xff1a;3000 ms | 內存限制&#xff1a;65535 KB難度&#xff1a;4描述有n個矩形&#xff0c;每個矩形可以用a,b來描述&#xff0c;表示長和寬。矩形X(a,b)可以嵌套在矩形Y(c,d)中當且僅當a<c,b<d或者b<c,a<d&#xff08;相當于旋轉X90度&…

沉思濫用:“強力使用,破壞濫用”

英國前首相本杰明迪斯雷利&#xff08;Benjamin Disraeli&#xff09;曾有一個古老的說法&#xff0c;說謊言分為三種&#xff1a;“謊言&#xff0c;該死的謊言和統計數據”。 這里的暗示是統計數據很容易彌補它們是不可靠的。 但是&#xff0c;統計學在經驗科學中得到了廣泛的…

centos和ubuntu下使用cron設置定時任務

1.啟動cron工具[ps:使用root權限] centos啟動cron兩種方式 a) /etc/init.d/crond start b) service crond start ubuntu啟動cron兩種方式 a) /etc/init.d/cron start b) service cron start(推薦) 2.添加定時任務[每個整點執行ls命令] centos crontab -e命令打開文件 添加一行:…