java的垃圾回收機制包括:主流回收算法和收集器(jvm的一個主要優化方向)

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

java的垃圾回收機制是java語言的一大特色,解放了開發人員對內存的復雜控制,但如果你想要一個高級java開發人員,還是需要知道其機制,所謂不僅要會用還要知道其原理這樣才能用的更好,在你的項目出現瓶頸時你才有優化的思路和方向。

這里再簡單說一下回收算法和收集器的關系,好多人搞不明白,可以這樣簡單理解,算法是理論,收集器是根據各自算法理論的實現。

Serial(串行)收集器,這個是jdk1.3.1以前的版本唯一的垃圾收集器。從名字大概可以看出其是單線程,更讓你郁悶的是他還是阻塞的(意味著,它執行時會暫停其它工作的線程),但它的單cpu執行效率是最高的,因為他沒有多線程并行或者并發的管理開銷。適用場景:小型應用

Parallel(并行)收集器,相比Serial收集器,Parallel最主要的優勢在于使用多線程去完成垃圾清理工作,這樣可以充分利用多核的特性,大幅降低gc時間,這里注意一點,它和Serial收集器一樣是執行時,會先暫停業務線程。適合大吞吐量的應用,但對cpu資源比較敏感,需要衡量。適用場景:大型應用,科學計算,大規模數據采集等。

CMS(并發)Concurrent Low Pause Collector收集器,它是一種以獲取最短回收停頓時間為目標的收集器。優點:并發收集,低停頓。基于“標記-清除”算法。目前很大一部分Java應用都集中在互聯網站或B/S系統的服務端上,這類應用尤其重視服務的響應速度,希望系統停頓時間最短,以給用戶帶來較好的體驗,CMS收集器就非常符合這類應用的需求。適應場景:服務器、電信領域等。

?G1垃圾收集器在JDK7 update 4之后對大于4G的堆有了更好的支持,G1是一個針對多處理器大容量內存的服務器端的垃圾收集器,其目標是在實現高吞吐量的同時,盡可能的滿足垃圾收集暫停時間的要求。G1在執行一些Java堆空間中的全區域操作

JDK11,新增Epsilon垃圾收集器,Epsilon 垃圾收集器被稱為“no-op”收集器,將處理內存分配而不實施任何實際的內存回收機制。 Epsilon 的使用案例包括測試性能,內存壓力和虛擬機界面。 它也可以用于短期工作。(未確定)

常見的幾種垃圾回收算法:

標記-清除算法(Mark-Sweep)

首先標記出所有需要回收的對象,在標記完成后統一回收掉所有被標記的對象。它主要由兩個缺點:一個是效率問題,標記和清除過程的效率都不高;另一個是空間問題,標記清除之后會產生大量不連續的內存碎片,空間碎片太多可能會導致當程序在以后的運行過程中需要分配較大對象時無法找到足夠的連續內存而不得不提前觸發另一次垃圾收集動作
復制算法(Copying)(針對新生代)

為了解決標記清除算法的效率問題,出現了復制算法,它將可用內存按容量劃分為大小相等的兩塊,每次使用其中的一塊。當這塊的內存用完了,就將還存活著的對象復制到另一塊上面,然后再把已使用過的內存空間一次清理掉。優點是每次都是對其中的一塊進行內存回收,內存分配時就不用考慮內存碎片等復雜情況,只要移動堆頂指針,按順序分配內存即可,實現簡單,運行高效。缺點是將內存縮小為原來的一半
標記-整理算法(Mark-Compact)(針對老年代)

標記過程仍然與“標記-清除”算法一樣,但后續步驟不是直接對可回收對象進行清理,而是讓所有存活的對象都向一端移動,然后直接清理掉端邊界以外的內存。是復制算法的升級。
分代收集算法(Generational Collection)

分代收集算法(Generational Collection)

當前商業虛擬機的垃圾收集都采用“分代收集”算法,這種算法并無新的方法,只是根據對象的存活周期的不同將內存劃分為幾塊,一般是把Java堆分為新生代和老年代,這樣就可以根據各個年代的特點采用最適當的收集算法。在新生代中,每次垃圾收集時都發現有大批對象死去,只有少量存活,那就選用復制算法,只需要付出少量存活對象的復制成本就可以完成收集。而老年代中因為對象存活率高、沒有額外空間對它進行分配擔保,就必須使用“標記-清理”或“標記-整理”算法來進行回收。

jdk1.7 默認垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)

jdk1.8 默認垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)

jdk1.9 默認垃圾收集器G1

?

轉載于:https://my.oschina.net/haitaohu/blog/1851822

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

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

相關文章

北京dns服務器ip地址_什么是DNS? 域名系統,DNS服務器和IP地址概念介紹

北京dns服務器ip地址介紹 (Introduction) By the end of this article, you should have a better understanding of:在本文末尾,您應該對以下內容有更好的了解: What DNS is and what it does 什么是DNS及其作用 What DNS servers do DNS服務器做什么 …

767. 重構字符串

767. 重構字符串 給定一個字符串S,檢查是否能重新排布其中的字母,使得兩相鄰的字符不同。 若可行,輸出任意可行的結果。若不可行,返回空字符串。 示例 1: 輸入: S “aab” 輸出: “aba” 示例 2: 輸入: S “aaab” 輸出: “…

長生生物狂犬病疫苗造假

這兩天暴發的長生生物狂犬病疫苗造假案真是很厲害,世人都說投資不過山海關還真有一定道理。 市場上長生生物的狂犬病疫苗約占1/4左右,是一個非常大的用量。 你別說,疫苗真的是非常適合造假: 1. 狂犬病有一定潛伏期,幾天…

小程序 雜記

調試打印測試的方法: 方法1、顯示提示框 (微信自帶的API) wx.showToast({title: 成功,icon: success,duration: 2000 }) 方法2、js的console.log()方法 //test.js Page({onLoad: function(option){console.log(option.query)} }) wx.showToa…

使用fetch封裝ajax_如何使用Fetch在JavaScript中進行AJAX調用

使用fetch封裝ajaxI will be sharing bite sized learnings about JavaScript regularly in this series. Well cover JS fundamentals, browsers, DOM, system design, domain architecture and frameworks. 在本系列中,我將定期分享有關JavaScript的小知識。 我們…

RxJS筆記

RxJS 《深入淺出RxJS》讀書筆記遺留問題 Observable的HOT與COLD對應的實際場景,以及在編碼中的體現chapter1 html部分 測試你對時間的感覺按住我一秒鐘然后松手你的時間:毫秒jquery實現 var time new Date().getTime(); $("#hold-me").moused…

滾動一定的高度底色遞增

$(window).scroll(function() {var swipeHeight 200;//完全變色高度var scrollTop $(document).scrollTop();//頁面滾動高度var x scrollTop/swipeHeight;$(".head-bg").css({"opacity":x}); }) 轉載于:https://www.cnblogs.com/lhj-blog/p/8521525.htm…

@hot熱加載修飾器導致static靜態屬性丟失(已解決)

react開發的時候,引入熱加載,用了修飾器的引入方式,發現了一個很有意思的問題,網上并沒有相關文章,所以拋出來探討下。 一段很簡單的測試代碼。但是經過babel編碼后,變得很有意思。假設編碼成es2016&#x…

49. 字母異位詞分組

49. 字母異位詞分組 給你一個字符串數組,請你將 字母異位詞 組合在一起。可以按任意順序返回結果列表。 字母異位詞 是由重新排列源單詞的字母得到的一個新單詞,所有源單詞中的字母都恰好只用一次。 示例 1: 輸入: strs [“eat”, “tea”, “tan”…

python 入門程序_非Python程序員的Python速成課程-如何快速入門

python 入門程序This article is for people who already have experience in programming and want to learn Python quickly.本文適用于已經有編程經驗并希望快速學習Python的人們。 I created this resource out of frustration when I couldnt find an online course or a…

cmd命令操作Oracle數據庫

//注意cmd命令執行的密碼字符不能過于復雜 不能帶有特殊符號 以免執行不通過 譬如有!#¥%……&*之類的 所以在Oracle數據庫設置密碼是不要太復雜 /String Database "ORCL"; 不指向地址程序只能安裝在數據庫服務器上才能執行到命令String …

OpenCV學習(7.16)

寫了個實現攝像頭上畫線并輸出角度的東西……雖然很簡單,但腦殘的我還是debug了很長時間。 1 // 圓和直線.cpp : 定義控制臺應用程序的入口點。2 //3 4 #include "stdafx.h"5 6 using namespace std;7 using namespace cv;8 9 void onMouse(int event, in…

學習vue.js的自我梳理筆記

基本語法格式&#xff1a; <script> new Vue({ el: #app, data: { url: http://www.runoob.com } }) </script> 指令 【指令是帶有 v- 前綴的特殊屬性。】 判斷 <p v-if"seen">現在你看到我了</p> 參數 <a v-bind:href"url"&…

722. 刪除注釋

722. 刪除注釋 給一個 C 程序&#xff0c;刪除程序中的注釋。這個程序source是一個數組&#xff0c;其中source[i]表示第i行源碼。 這表示每行源碼由\n分隔。 在 C 中有兩種注釋風格&#xff0c;行內注釋和塊注釋。 字符串// 表示行注釋&#xff0c;表示//和其右側的其余字符…

如何創建一個自記錄的Makefile

My new favorite way to completely underuse a Makefile? Creating personalized, per-project repository workflow command aliases that you can check in.我最喜歡的完全沒用Makefile的方法&#xff1f; 創建個性化的按項目存儲庫工作流命令別名&#xff0c;您可以檢入。…

【BZOJ3262】陌上花開

CDQ分治模板 注意三元組完全相等的情況 1 #include<bits/stdc.h>2 using namespace std;3 const int N100010,K200010;4 int n,k,cnt[N],ans[N];5 struct Node{6 int a,b,c,id;7 bool operator<(const Node& k)const{8 if(bk.b&&ck.c) re…

Spring+jpaNo transactional EntityManager available

2019獨角獸企業重金招聘Python工程師標準>>> TransactionRequiredException: No transactional EntityManager availableEntityManager執行以下方法(refresh, persist, flush, joinTransaction, remove, merge) 都需要需要事務if (transactionRequiringMethods.cont…

python項目構建_通過構建4個項目來學習Python網絡

python項目構建The Python programming language is very capable when it comes to networking. Weve released a crash course on the freeCodeCamp.org YouTube channel that will help you learn the basics of networking in Python.當涉及到網絡時&#xff0c;Python編程…

164. 最大間距

164. 最大間距 給定一個無序的數組&#xff0c;找出數組在排序之后&#xff0c;相鄰元素之間最大的差值。 如果數組元素個數小于 2&#xff0c;則返回 0。 示例 1: 輸入: [3,6,9,1] 輸出: 3 解釋: 排序后的數組是 [1,3,6,9], 其中相鄰元素 (3,6) 和 (6,9) 之間都存在最大差…

10.32/10.33 rsync通過服務同步 10.34 linux系統日志 screen工具

通過后臺服務的方式在遠程主機上建立一個rsync的服務器&#xff0c;在服務器上配置好rsync的各種應用&#xff0c;然后將本機作為rsync的一個客戶端連接遠程的rsync服務器。在128主機上建立并配置rsync的配置文件/etc/rsyncd.conf,把你的rsyncd.conf編輯成以下內容&#xff1a;…