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.mzph.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;…